diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ccc2a84ab..2a2317804 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -57,6 +57,7 @@ jobs:
mv wp-content/mu-plugins/pub/class-validator.php $RUNNER_TEMP
mv wp-content/mu-plugins/pub/locales.php $RUNNER_TEMP
mv wp-content/mu-plugins/pub/wporg-learn-cli.php $RUNNER_TEMP
+ mv wp-content/plugins/polylang-pro $RUNNER_TEMP
mv wp-content/plugins/sensei-pro $RUNNER_TEMP
mv wp-content/plugins/wporg-learn $RUNNER_TEMP
mv wp-content/themes/pub/wporg-learn-2024 $RUNNER_TEMP
@@ -69,6 +70,7 @@ jobs:
mv $RUNNER_TEMP/class-validator.php wp-content/mu-plugins/pub
mv $RUNNER_TEMP/locales.php wp-content/mu-plugins/pub
mv $RUNNER_TEMP/wporg-learn-cli.php wp-content/mu-plugins/pub
+ mv $RUNNER_TEMP/polylang-pro wp-content/plugins
mv $RUNNER_TEMP/sensei-pro wp-content/plugins
mv $RUNNER_TEMP/wporg-learn wp-content/plugins
mv $RUNNER_TEMP/wporg-learn-2024 wp-content/themes/pub
diff --git a/.gitignore b/.gitignore
index 0943e3ccd..80fdc6b63 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,7 +17,6 @@
/wp-content/*
/wp-content/mu-plugins/*
/wp-content/mu-plugins/pub/*
-/wp-content/mu-plugins/pub/locale-switcher/build
/wp-content/plugins/*
/wp-content/themes/*
/wp-content/themes/pub/*
@@ -33,9 +32,9 @@
!/wp-content/plugins
!/wp-content/plugins/wporg-learn
!/wp-content/plugins/sensei-pro
+!/wp-content/plugins/polylang-pro
+!/wp-content/plugins/polylang-pro/css/build/
+!/wp-content/plugins/polylang-pro/js/build/
!/wp-content/themes
!/wp-content/themes/pub
!/wp-content/themes/pub/wporg-learn-2024
-
-# Ignore subfolders in our custom code.
-/wp-content/plugins/wporg-learn/build
diff --git a/wp-content/plugins/polylang-pro/LICENSE b/wp-content/plugins/polylang-pro/LICENSE
new file mode 100644
index 000000000..94a9ed024
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is 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. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ 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.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ 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 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. Use with the GNU Affero General Public License.
+
+ 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 Affero 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 special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 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 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 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.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ 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 GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/wp-content/plugins/polylang-pro/changelog.txt b/wp-content/plugins/polylang-pro/changelog.txt
new file mode 100644
index 000000000..9be0f27e2
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/changelog.txt
@@ -0,0 +1,2325 @@
+== Changelog ==
+
+This file contains only old changelog. See readme.txt for newer versions.
+
+= 3.5.4 (2024-02-06) =
+
+* Pro: Fix an accessibility issue int the navigation language switcher block
+* Pro: Fix featured image not exported for posts with blocks
+* Pro: Fix a conflict with the Flatsome builder
+* Fix a notice when using system CRON. Props arielruminski #1397
+* Fix an edge case where a wrong post tag may be assigned to a post #1418
+
+= 3.5.3 (2023-12-11) =
+
+* Pro: Fix fatal error with The Events Calendar when rewrite param of event category is set to false
+* Remove flag alt text in the language switcher when both the flag and language name are displayed #1393
+* Fix incorrect string translations when 2 languages are sharing the same locale in a multisite #1378
+* Fix posts lists not filtered by the current language when editing a post in the block editor #1386
+* Fix error when a tax query is filled with unexpected data #1396
+
+= 3.5.2 (2023-10-25) =
+
+* Pro: Fix terms not filtered by the current language in the block editor custom taxonomy component panel
+* Fix incorrect rewrite rules leading to error 404 for the main site on mutisite #1375
+
+= 3.5.1 (2023-10-17) =
+
+* Pro: Fix terms not filtered by the current language in the block editor custom taxonomy component panel
+* Pro: Fix fatal error when using plain permalinks on multisite
+* Pro: Fix rewrite rules incorrectly refreshed when saving strings translations
+* Fix incorrect rewrite rules leading to error 404 on mutisite #1366
+* Fix fatal error when using symlinked MU plugins that are not in open_basedir #1368
+
+= 3.5 (2023-10-09) =
+
+* Requires WordPress 5.9 as minimum version
+* Pro: Manage navigation blocks translations in the site editor (requires WP 6.3)
+* Pro: Manage pages translations in the site editor (requires WP 6.3)
+* Pro: Manage patterns translations in the site editor (requires WP 6.3)
+* Pro: Remove compatibility with the navigation screen removed from Gütenberg 15.1
+* Pro: Add filter 'pll_export_post_fields' to control post fields exported to XLIFF files
+* Pro: Do not set default translation option to "translate" for ACF fields created before Polylang Pro is activated
+* Pro: Fix Polylang not set as recently active when automatically deactivated by Polylang Pro
+* Don't output javascript type for themes supporting html5 #1332
+* Hook WP_Query automatic translation to 'parse_query' instead of 'pre_get_posts' #1339
+* Improve preload paths management for the block editor #1341
+* Fix rewrite rules in WP 6.4 #1345
+* Fix: always assign the default language to new posts and terms if no language is specified #1351
+* Fix 'polylang' option not correctly created when a new site is created on a multisite #1319
+* Fix front page display switched to "Your latest posts" when deleting a static home page translation #1311
+* Fix wrong language assigned to terms #1336
+* Fix error when updating a translated option while the blog is switched on a multisite #1342
+
+= 3.4.6 (2023-09-13) =
+
+* Pro: Security: Fix unsafe custom style injection in navigation language switcher block
+
+= 3.4.5 (2023-08-07) =
+
+* Requires PHP 7.0 as minimum version
+* Pro: Fix error in site editor with WP 6.3
+* Pro: Remove usage of block_core_navigation_submenu_build_css_colors() deprecated in WP 6.3
+* Pro: Fix categories and tags kept in old language after the language of a post has been changed
+* Add 'pll_admin_ajax_params' filter #1326
+* Fix error when changing the language of a post and the post type doesn't support excerpts #1323
+
+= 3.4.4 (2023-07-18) =
+
+* Pro: Register a default (empty) value for the "lang" param when listing posts and terms in REST API
+* Pro: Fix categories list refresh when the language of a post is changed in the block editor
+* Pro: Fix store "pll/metabox" is already registered
+* Add Kirghiz to the predefined list of languages #1308
+* Fix incorrect flag url when WordPress is installed in a subfolder #1296
+* Fix wrong home page url in multisite #1300
+
+= 3.4.3 (2023-06-13) =
+
+* Adapt the language filter for `get_pages()` for WP 6.3 #1268
+* Fix static front page displaying latest posts when it is not translated #1295
+* Fix a database error in ANSI mode #1297
+* Fix a database error when accessing posts from another site in multisite #1301
+
+= 3.4.2 (2023-05-30) =
+
+* Fix empty languages displayed when Falang data are remaining in the database #1286
+* Fix PHP warning on term_props #1288
+* Fix blog page displayed in the customizer instead of the static front page when changing a setting #1289
+
+= 3.4.1 (2023-05-25) =
+
+* Fix incorrect site titles in My Site admin bar menu on multisites #1284
+* Fix incorrect home url when using multiple domains or subdomain and a static front page #1285
+
+= 3.4 (2023-05-23) =
+
+* Requires WP 5.8 as minimum version
+* Pro: Language fallbacks are now stored in language description instead of a term meta.
+* Pro: Add more error messages when doing wrong when importing or exporting translations
+* Pro: Avoid to check for translations files existence if no language fallbacks are defined.
+* Pro: Reduce the number of DB queries when exporting posts for translation
+* Pro: Fix incorrect post slug after XLIFF import
+* Pro: Fix a performance issue with the autocomplete field in the block editor languages panel
+* Pro: Fix translations not refreshed when switching the language in the block editor sidebar
+* Pro: Fix a performance issue in Site editor
+* Pro: Fix a possible bug in Site editor when language term_id and term_taxonomy_id are different
+* Pro: Fix deactivated language re-activated when it is edited.
+* Pro: Fix language switcher in legacy widget menu not correctly rendered in widget block editor
+* Pro: Fix error 404 for untranslated attached attachement
+* Pro: Fix a deprecated notice in ACF integration
+* Pro: Fix update compatibility with WP Umbrella
+* Refactor core to allow to easily translate contents stored in custom tables
+* Strings translations are now stored in a language term meta instead of post meta of specific post type #1209
+* Deprecate the filters `pll_languages_list` and `pll_after_languages_cache` #1210
+* Add a new property `PLL_Language::$is_default` #1228
+* Add a custom admin body class `pll-lang-{$language_code}` #1190
+* Add support for new WPML API filters #1266
+* Fix languages metabox autocomplete field not always returning expected results #1187
+* Fix language not displayed if the transient has been saved with an empty array #1247
+* Fix a PHP warning `Attempt to read property "home_url" on bool` #1206
+* Fix a conflict leading to a performance issue when translating the theme Astra options #1196
+* Fix related translations resetted when updating Yoast SEO titles settings #1111
+* Fix a fatal error in case the registered strings option is corrupted #1264
+* Fix the language extraction from the URL in plain permalinks #1270
+* Fix content cleared when switching the language of a new post in the block editor #1272
+* Fix: Prevent saving strings translations with an empty source #1273
+
+= 3.3.3 (2023-04-11) =
+
+* Pro: Adapt the submenu colors of the navigation language switcher block to WP 6.2
+* Pro: Fix the dropdown setting in the navigation language switcher block
+* Add Amharic, Aragonese and Spanish from Dominican Republic to the list of predefined languages #1248
+* Fix a deprecated notice in WP 6.2 when using multiple domains without the Internationalization PHP extension (intl) #1245
+
+= 3.3.2 (2023-03-06) =
+
+* Pro: Add compatibility with FSE changes introduced by WP 6.2
+* Pro: Adapt the navigation language switcher block for consistency with WP 6.2
+* Only store term ids in taxonomy relationships cache for WP 6.0+. Props @ocean90 #1154
+* Remove usage of `get_page_by_title()` deprecated in WP 6.2 #1213
+* Fix fatal error if the mu-plugins folder is not readable #1217
+* Fix a compatibility issue with plugins not expecting a null 'update_plugins' transient #1224
+
+= 3.3.1 (2023-01-09) =
+
+* Pro: Allow to translate Oembed, URL and Email ACF fields
+* Pro: Fix ACF REST API mixing fields
+* Pro: Fix ACF compatibility loaded when no language exist
+* Pro: Fix headers of exported PO files.
+* Pro: Fix spacing in language switcher navigation block preview
+* Work around a bug in Sendinblue for WooCommerce causing a fatal error. #1156
+* Fix a regression with WooCommerce Product Add-Ons Ultimate. #1186
+
+= 3.3 (2022-11-28) =
+
+* Requires WP 5.7 as minimum version
+* Pro: Allow to export and import XLIFF files for posts
+* Pro: Honor the provided context for the navigation language switcher block.
+* Pro: Remove the parent hyperlink in the navigation language switcher block.
+* Pro: Add spacing between flag and name in the navigation language switcher block.
+* Pro: Disallow some special characters in translated slugs to avoid 404 errors.
+* Pro: Fix string translation not imported when the original is registered but has never been saved in database.
+* Pro: Fix string translation not imported when it includes an html entity.
+* Pro: Fix navigation language switcher block rendering in block editor.
+* Pro: Fix navigation language switcher may be displayed wrong color.
+* Translate the post pages in get_post_type_archive_link() on admin side too. #1000
+* Enable the block editor in page for posts translations to match the WordPress behavior since version 5.8 #1002
+* Improve the site health report #1062 #1076
+* Set the current language when saving a post #1065
+* The search block is now filtered by language #1081
+* Display slug of CPT and taxonomies in Custom post types and Taxonomies settings. Props @nicomollet #1112
+* Add support for wpml-config.xml to MU plugins #1140 Props Jeremy Simkins
+* Fix some deprecated notices fired by PHP 8.1 #975
+* Fix some missing canonical redirect taxonomies #1074
+* Fix redirect when permalink structure has no trailing slash #1080
+* Fix language switcher in legacy navigation menu widget not rendered in widgets block editor #1083
+* Fix language in tax query when an OR relation is used #1098
+* Fix parent of translated category removed when assigning an untranslated parent #1105
+* Fix is_front_page() when a static front page is not translated #1123
+* Yoast SEO: Fix posts without language displayed in the sitemap #1103
+* Yoast SEO: Avoid syncing robots meta. #1118
+
+= 3.2.8 (2022-10-17) =
+
+* Fix PHP warning when a filtered taxonomy has no query var #1124
+* Fix SQL error when attempting to get objects without languages and no language exist #1126
+* Fix error when term slugs are provided as array in WP_Query #1119, #1132 Props Susanna Häggblom
+* Fix a CSS regression in the wizard causing the default language icon to be removed #1137
+
+= 3.2.7 (2022-09-20) =
+
+* Work around a WooCommerce 6.9.x bug causing a fatal error in the wizard. #1116
+
+= 3.2.6 (2022-09-06) =
+
+* Pro: Fix a conflict with Kadence blocks
+* Pro: Fix a conflict with Flatsome builder
+* Fix media translation setting having no effect
+
+= 3.2.5 (2022-06-28) =
+
+* Pro: Fix creation of WC product categories with shared slug via REST API
+* Pro: Fix conflict with WooBuilder when editing a WC product
+* Fix: Force empty string translation to empty string #1058
+* Fix CSS conflict with Dynamic content for Elementor #1060
+
+= 3.2.4 (2022-06-07) =
+
+* Pro: Remove "Navigation menus" from the post type settings list
+* Pro: Fix block editor languages panel missing in WordPress 5.6
+* Pro: Fix wrongly indexed languages list returned by REST API when the first language is deactivated.
+* Revert fix for category feed not redirected when the language code is wrong #1054
+* Fix wrong redirect of category when the url includes a query string #1048
+* Fix querying multiple categories failing
+
+= 3.2.3 (2022-05-17) =
+
+* Pro: Fix a fatal error when inserting a term
+* Pro: Fix translation of the block cover when duplicating a post
+* Pro: Fix a CSS issue in bulk tranlate form introduced by WP 6.0
+* Pro: Fix a CSS issue in string import/export metaboxes.
+* Prevent random languages order in WP 6.0 #1041
+* Translate site title in retrieve password email #1042
+* Fix 'lang' attribute in language widget dropdown #1039
+
+= 3.2.2 (2022-04-25) =
+
+* Pro: Fix redirect occuring for tags sharing the same slug as their translations
+* Fix quick edit allowing to modify the language of the default category when it should not #1018
+
+= 3.2.1 (2022-04-14) =
+
+* Pro: Fix users with editor role not able to save or publish posts
+* Pro: Fix FSE compatibility not loaded when the plugin Gütenberg is active
+* Pro: Fix a fatal error occuring with Yoast SEO Premium
+* Pro: Fix a fatal error with ACF when no language is defined
+
+= 3.2 (2022-04-12) =
+
+* Requires WP 5.6 as minimum version
+* Pro: Add compatibility with the full site editing introduced in WP 5.9
+* Pro: Add a language switcher block for the navigation block introduced in WP 5.9
+* Pro: Add compatibility with the new gallery block introduced in WP 5.9
+* Pro: Make the language switcher block available in the widget section of the customizer
+* Pro: Fix wrong category when translating the latest posts block
+* Pro: Fix the language switcher block when using the dropdown option
+* Pro: Fix some edge cases with locale fallback
+* Pro: Fix post template replacing the post content when duplicating a post
+* Pro: Fix synchronization groups not correctly cleaned up when a language is deleted
+* Pro: Fix incorrect sticky property when duplicating / synchronizing posts
+* Pro: Fix "Page for posts" label after the page has been bulk translated
+* Pro: Fix translated slug when the url includes a query string
+* Pro: Synchronize ACF layout fields if a child field is synchronized or translatable
+* Pro: Fix wrong field group translation displayed when using object cache with ACF
+* Update plugin updater to 1.9.1
+* Add compatibility with the block site title introduced in WP 5.9
+* Add the list of wpml-config.xml files in the site health information
+* Improve the performance of the get_pages() filter #980
+* Improve the compatibility of 'wpml_object_id' with the original filter #972
+* Prevent term_exists to be filtered by language in WP 6.0
+* Fix some PHP 8.1 deprecations #949 #985
+* Fix a fatal error in PHP 8.1 #987
+* Fix category feed not redirected when the langage code is wrong #887
+* Fix default category not created for secondary languages (introduced in 3.1) #997
+* Fix parent page when the parent post type is not translatable #1001
+* Fix the Yoast SEO breadcrumb when it includes a non-synchronized taxonomy #1005
+* Fix a PHP Notice when adding a new language and Yoast SEO is active #979
+* Fix a PHP warning in Yoast SEO compatibility #954
+
+= 3.1.4 (2022-01-31) =
+
+* Pro: Adapt duplication and synchronization of the gallery block refactored in WP 5.9
+* Fix UI glitch in the classic editor custom fields form when changing a post language in WP 5.9 #970
+
+= 3.1.3 (2021-12-14) =
+
+* Fix user description escaping #934
+* Fix dismissable notice when creating a term in WP 5.9 #936
+* Fix empty search not handled correctly. Props Dominik Schilling #937
+* Fix warning occurring when a 3rd party plugin attempts to register anything else than a string using the WPML API #942
+* Fix Yoast SEO columns not corectly drawn when quick editing a post #943
+
+= 3.1.2 (2021-10-11) =
+
+* Pro: Fix parent page not filtered by language in the block editor since WP 5.6
+* Pro: Fix XLIFF mime type for PHP 7.0 and PHP 7.1
+* Fix settings page displaying the media modules whne no language are defined
+* Enforce Yoast SEO to use dynamic permalinks #882
+* Yoast SEO: Fix static front page and blog page breadcrumb
+
+= 3.1.1 (2021-08-16) =
+
+* Pro: Fix a fatal error with The Events Calendar
+* Allow to remove the cookie with the pll_cookie_expiration filter #905
+
+= 3.1 (2021-07-27) =
+
+* Add compatibility with WordPress 5.8
+* Raise Minimum WordPress version to 5.4
+* Pro: Allow to filter blocks by language in the widget block editor
+* Pro: Allow to export and import XLIFF files for string translations
+* Pro: Add the language switcher in the navigation block (experimental)
+* Pro: Replace dashicons by svg icons in the block editor
+* Pro: The Events Calendar: Add compatibility with Views V2 (only for sites using only one domain)
+* Pro: Fix + icon displayed in the block editor sidebar when the user cannot create a translation
+* Add a warning section to the site health for posts and terms without languages #825
+* Require the simplexml extension in the site health if a wpml-config.xml is found #827
+* Remove the information about the WPML compabitility mode in settings #843
+* The browser preferred language detection is now deactivated by default
+* The media are now untranslated by default
+* Highlight the language filter in the admin toolbar when it's active #821
+* Allow to query comments in multiple languages (just as posts and terms) #840
+* Don't disable the translation input field in the classic metabox #841 Props Onatcer
+* Optimize all images including flags #848 Props lowwebtech
+* Don't redirect if WordPress doesn't validate the redirect url to avoid redirects to /wp-admin/ #879
+* Fix media appearing to have a language after the language is changed in the media library grid view #807
+* Fix media not all deleted when bulk deleting from the grid view of the media library #830
+* Fix when more than one language switcher are added to the same menu #853
+* Fix PHP notice when adding a CPT archive link to a menu #868 Props davidwebca
+
+= 3.0.6 (2021-06-22) =
+
+* Fix a conflict with the WooCommerce cart translation and cache plugins #876
+
+= 3.0.5 (2021-06-08) =
+
+* Pro: fix original post not assigned to a new translation when the languages sidebar is closed
+* Pro: Attempt to fix zip file corrupted on some installations when exporting string translations
+* Support session cookie with the pll_cookie_expiration filter #835
+* Fix javascript error when a plugin defines its own editor for translated post types #837
+* Fix languages displayed in screen options when editing a term #850
+* Cache: fix post type archive cache not cleared when saving a post #828
+
+= 3.0.4 (2021-04-27) =
+
+* Improve performance in the pages (or hierarchical post types) list table
+* Fix an ajax conflict with WooCommerce License manager
+
+= 3.0.3 (2021-03-23) =
+
+* Fix a warning when a language is corrupted in database (term_language missing)
+* Fix confirmation modal with WooCommerce and WordPress < 5.6
+* Fix an ajax conflict with WooCommerce Tree Table Rate Shipping and HubSpot All-In-One Marketing
+
+= 3.0.2 (2021-03-16) =
+
+* Move hreflang attributes higher in the head section #771
+* Fix custom flags not working (introduced in 3.0)
+* Fix translation of the confirmation modal when changing the language of a post
+* Fix js and css not loaded when Polylang is used as a mu-plugin (introduced in 3.0)
+* Fix support for html5 stylesheet link tags #775
+* Fix possible warning in frontend-filters-links.php
+* Yoast SEO Premium: Take over the multilingual compatibility removed in Yoast SEO Premium 15.8 #796
+* Yoast SEO: Fix CPT breadcrumb title when the option is left empty #794
+* Yoast SEO: Fix sitemap.xml not redirected on secondary domains #789
+
+= 3.0.1 (2021-03-10) =
+
+* Fix media gallery messed when editing a post in the classic editor
+* Fix missing script dependency on old WP versions
+* Fix CSS conflict with WooCommerce Bookings for WP < 5.6
+* Fix conflict resulting in '__' already defined in block-editor.js. #779
+* Fix search form removed for some themes. Props Marián Kadaňka. #780
+* Fix fatal error with very old versions of Yoast SEO. Props Nicola Peluchetti. #781
+
+= 3.0 (2021-03-08) =
+
+* Add compatibility with WordPress 5.7
+* Remove upgrades from Polylang older than 1.8
+* Remove deprecated class PLL_Pointer
+* Pro: Hide the license keys
+* Pro: Fix redirect to the home page of a deactivated language
+* Pro: Fix synchronization of post status not working
+* Pro: Fix language switcher block not working in a post retrieved in REST API
+* Pro: Fix PO export of strings with line breaks
+* Pro: Fix file block title customization lost
+* Add a dialog box to ask a confirmation about a language change in classic and block editors
+* Improve browser language detection #591
+* Improve robustness and documentation of code
+* Fix media library after the language has been chnaged in the editor metabox
+* Fix duplicated title attribute on flag link in posts list
+* Fix legacy block editor language metabox compatibility with WordPress 5.6
+* Fix uploaded theme and plugin files in media library
+* Fix site title not translated in email change confirmation email
+* Fix remaining deprecated jQuery notices #741
+* Fix compatibility with GN publisher
+* Fix compatibility with Woodmart theme search form
+* Fix compatibility issue with 3rd party ajax requests since jQuery 3.3 #744
+* Fix CSS conflict with WooCommerce Bookings
+* Fix browser error when displaying an embed and using a cache plugin #757
+* Fix post type archive title and metadesc not translated in Yoast SEO
+* Fix PHP notice in REST API
+
+= 2.9.2 (2021-02-02) =
+
+* Pro: Fix translation of CPTUI plural label and description not working
+* Add Spanish (Ecuador) to the list of predefined languages
+* Fix typo in "WordPress" string translation group. Props Viktor Szépe #682
+
+= 2.9.1 (2020-12-15) =
+
+* Fix PHP notice: Undefined property: PLL_Cache_Compat::$options with cache plugins. Props bahaa-almahamid. #658
+* Fix title of the search results page with Yoast SEO > 14.0
+
+= 2.9 (2020-12-07) =
+
+* Add compatibility with WordPress 5.6
+* Pro: Add locale fallback used when the theme or plugins translations are not available
+* Pro: Fix SSO and browser preferred language redirect when using multiple domains
+* Pro: Fix post slugs for German and Danish in the REST API
+* Pro: Fix a fatal error in ACF integration when saving url modifications with multiple domains
+* Pro: Fix a deprecated notice fired by ACF since the version 5.9.2
+* Pro: Fix ACF relationship fields not reloaded when changing the language in the classic editor
+* Update plugin updater to version 1.8
+* Add Lower Sorbian to the list of predefined language
+* Options are now translated on backend when using the admin language filter
+* Keep previous translations when modifying an option value
+* Add navigation markup to the language switcher widget
+* Fix canonical redirect for taxonomy terms
+* Fix a fatal error when deleting a post with a translation group corrupted in the database
+* Fix a fatal error when switching to plain permalinks and using multiple domains
+* Fix a conflict with WP Sweep which could corrupt languages
+* Fix title displayed instead of meta description with Yoast SEO > 14.0
+* Fix PHP Notice: Undefined index: wp_the_query in /frontend/choose-lang-content.php on line 92
+
+= 2.8.4 (2020-11-03) =
+
+* Pro: Remove useless bulk translate action for ACF fields groups
+* Pro: Fix the translation of the CPTUI labels when the language is set from the content
+* Fix sitemaps redirected to the default language since WP 5.5.1
+* Fix object cache not flushed for sticky posts #601
+* Fix blog page broken when trashing a page and the blog page is not translated in all languages
+* Fix custom flags ignored in WPML compatibility mode
+* Fix breadcrumb for untranslated post types in Yoast SEO
+
+= 2.8.3 (2020-10-13) =
+
+* Honor install_languages capability to download language packs
+* Pro: Fix integrations not loaded (with The Events Calendar, CPTUI, Content blocks)
+* Pro: Fix fatal error with ACF if a flexible content includes a repeater and a relationship
+* Pro: Fix terms sharing their slug impossible to update without changing the slug
+* When available, use wpcom_vip_get_page_by_path() instead of get_page_by_path()
+* Fix queries filtered when editing a post that was declared untranslatable after it got a language
+* Fix issues with Yoast SEO 14.0+ (breadcrumbs, canonical, title and description)
+
+= 2.8.2 (2020-09-08) =
+
+* Pro: Fix posts sharing the same slug displayed on the same page
+* Fix: Don't use a javascript localized string removed in WP 5.5 #568
+* Fix fatal error in site health when no language is defined #563
+* Fix various issues with Yoast SEO 14.x #65, #503, #505
+* Fix fatal error with MU Domain Mapping when saving domains in Polylang settings #569
+
+= 2.8.1 (2020-08-25) =
+
+* Pro: Fix fatal error with WP 4.9
+* Fix pll_the_languages() with 'raw' option returning html flag instead of flag url #558
+* Fix compatibility with Duplicate Posts not correcly loaded #557
+* Fix custom flag size in admin bar language switcher #559
+* Fix tag clouds mixed in the classic editor #561
+
+= 2.8 (2020-08-17) =
+
+* Pro: Add a language switcher block
+* Pro: Add compatibility with block image edition introduced in WP 5.5
+* Pro: Fix our private taxonomies being displayed in the ACF field group rules.
+* Pro: Fix incorrect flags loaded from the block editor
+* Pro: Fix SSO causing a wrong redirect when using subdomains (introduced in 2.7.4)
+* Pro: Fix a performance issue on the plugins list
+* Pro: Fix option to automatically duplicate media in all languages when uploading a new file not honored in block image
+* Use composer for autoload and Polylang Pro dependency on Polylang
+* Display a flag for each post in the posts list tables (same for terms). #515
+* Add test for the homepage translations to Site Health
+* Add debug information to Site Health
+* Add compatibility with the sitemaps introduced in WP 5.5 #451
+* Always filter WP_Query by the current language
+* Support wildcards in "admin-texts" parent keys in wpml-config.xml
+* Fix sticky posts showed for all languages when the admin language filter is active #469
+* Fix a performance issue on the pages list
+* Fix dependency to jQuery Migrate removed from WP 5.5 #539
+* Fix: output secure cookie when using a cache plugin and ssl #542
+* Fix the possibility to create 2 terms with the same name in the same language, without specifying the second slug.
+* Fix sticky posts appearing 2 times in WP 5.5
+
+= 2.7.4 (2020-06-29) =
+
+* Pro: Allow using our /untranslated-posts REST endpoint for non-public post types
+* Pro: Fix broken display in the block editor sidebar when a language has no flag
+* Pro: Fix SSO breaking the preview on secondary domains
+* Pro: Fix ACF translation option not working for term custom fields
+* Pro: Fix a styling issue in the fields group list table in ACF 5.9
+* Add Spanish from Puerto Rico to the predefined list of languages
+
+= 2.7.3 (2020-05-26) =
+
+* Security: Slash metas
+* Pro: Fix categories not savedafter the language has been switched in the block editor
+* Pro: Fix ACF fields stored as integers instead of strings
+* Pro: Fix ACF untranslated posts or terms being copied when creating a new translation
+* Pro: Fix PHP notice with ACF when a repeater or group is included in a flexible content
+* Pro: Fix "DevTools failed to load SourceMap" warning in browser console
+* Update plugin updater to 1.7.1
+* Honor the filter "pll_the_language_link" when the language switcher displays a dropdown #506
+* Fix "Something went wrong" message when quick editing untranslated post types #508
+* Fix wpseo_opengraph deprecated warning #509
+
+= 2.7.2 (2020-04-27) =
+
+* Pro: Re-allow to modify the capability for strings translations
+* Pro: Fix redirect for posts having the same slug as a media
+* Pro: Fix PHP notice with ACF flexible content
+* Pro: Fix a fatal error with InfiniteWP
+* Update plugin updater to 1.7
+* Fix font in setup wizard
+
+= 2.7.1 (2020-04-09) =
+
+* Pro: Fix untranslated post types filtered by the parameter in the REST API #493
+* Fix fatal error when the function idn_to_ascii is not available
+* Fix PHP warning warning when a 3rd party plugin declares options not stored in DB in wpml-config.xml #492
+* Fix fatal error when a 3rd party plugin declares options stored as objects in wpml-config.xml #494
+
+= 2.7 (2020-04-06) =
+
+* Minimum WordPress version is now 4.9
+* Pro: Strings translations can now be exported and imported (in PO format)
+* Pro: Allow to decide individually which ACF fields to copy or synchronize
+* Pro: Add action pll_inactive_language_requested
+* Pro; Fix fatal error in The Events Calendar compatibility when no language is defined yet
+* Pro: Fix bulk translate when a post has no language
+* Pro: Fix reusable block saved without language
+* Pro: Fix post requested by slug not filtered in REST API, when the slug is shared
+* Add a setup wizard
+* Add Swahili, Upper Sorbian, Sindhi and Spanish from Uruguay to the list of predefined languages
+* Add flags in the predefined list of languages
+* Allow to hide the metaboxes from the screen options
+* The deletion of the plugin's data at uninstall is now controlled by a PHP constant instead of an option #456
+* Add parent in ajax response when selecting a term in autocomplete field #328
+* Add Vary: Accept-Language http header in home page redirect. Props @chesio #452
+* Improve performance to register/unregister WPML strings
+* Add support for the action wpml_switch_language
+* Add post_status to the list of accepted args of pll_count_posts()
+* Apply the filter pll_preferred_language in wp-login.php
+* Use filtered wrappers to create meta when creating media translations #231
+* Allow to translate the Twenty Seventeen header video Youtube url #460
+* Notices are now dismissed per site instead of per user #478
+* Fix terms not visible in the quick edit when only one language is defined and teh admin language filter is active
+* Fix post state not displayed for translations of the privacy policy page #395
+* Fix wildcards not correctly interpreted in wpml-config.xml
+* Fix product categories with special characters duplicated when importing WooCommerce products #474
+
+= 2.6.10 (2020-02-19) =
+
+* Pro: Fix sticky posts not filtered in REST API (introduced in 2.6.9)
+* Fix wrong language detected if a child page uses the slug of another language
+* Fix a PHP notice with PHP 7.4. #438
+* Fix lang-item-first class in language switcher when the current language is hidden. #445
+* Fix partially a conflict with Fusion Builder (the other part of the conflict being in Fusion Builder).
+
+= 2.6.9 (2020-01-15) =
+
+* Pro: Use 'parse_query' rather than 'rest_{$type}_query' to filter REST requests.
+* Pro: Filter the comments REST endpoint.
+* Pro: Fix duplication of terms without language.
+* Pro: Fix fatal error when Admin Columns is activated and no language is defined yet.
+* Fix shortlink when using one subdomain or domain per language
+
+= 2.6.8 (2019-12-11) =
+
+* Pro: Fix conflict with JetThemesCore from Crocoblock
+* Fix: better detection of REST requests when using plain permalinks
+* Fix usage of deprecated action wpmu_new_blog in WP 5.1+
+* Fix PHP notices with PHP 7.4
+
+= 2.6.7 (2019-11-14) =
+
+* Require PHP 5.6
+* Fix PHP warning in WP 5.3
+
+= 2.6.6 (2019-11-12) =
+
+* Pro: Fix wrong ajax url when using one domain per language
+* Pro: Fix conflict with user switching plugin when using multiple domains
+* Pro: Fix latest posts block in WP 5.3
+* Fix database error when attempting to sync an untranslated page parent
+* Fix a conflict with the theme Neptune by Osetin
+
+= 2.6.5 (2019-10-09) =
+
+* Pro: Require ACF 5.7.11+ to activate the compatibility to avoid fatal errors with older versions
+* Pro: Avoid translating empty front slug (could cause a wrong redirect to /wp-admin)
+* Pro: Fix filter wp_unique_term_slug not always correctly applied.
+* Pro: Fix a conflict with Divi causing post synchronization buttons to be displayed multiple times
+* Avoid notice in WP CLI context
+
+= 2.6.4 (2019-08-27) =
+
+* Pro: Fix a conflict preventing meta synchronization when ACF is active
+* Pro: Fix post metas not correctly copied when translating a Beaver Builder page
+* Pro: Fix a fatal error when posts made with Elementor are synchronized
+* Pro: Fix Prewiew button not working correctly when using one domain per language
+* Pro: Fix post synchronization not available for WP CRON and WP CLI
+* Fix future posts not available in the autocomplete input field of the languages metabox
+* Fix translations files not loaded on REST requests
+* Fix deleted term parent not synchronized
+
+= 2.6.3 (2019-08-06) =
+
+* Pro: Fix fatal error when updating an ACF field from frontend
+* Pro: Add action 'pll_post_synchronized'
+* Allow to get the current or default language object using the API. Props Jory Hogeveen. #359
+* Fix empty span in languages switcher widget when showing only flags
+* Fix wpml_register_single_string when updating the original string
+
+= 2.6.2 (2019-07-16) =
+
+* Pro: Fix slow admin in case the translations update server can't be reached
+* Pro: Fix value not correctly translated for ACF clone fields in repeater
+* Fix strings translations mixed when registered via the WPML compatibility. #381
+
+= 2.6.1 (2019-07-03) =
+
+* Pro: Fix Yoast SEO sitemap for inactive languages when using subdomains or multiple domains
+* Fix fatal error in combination with Yoast SEO and Social Warfare
+* Fix post type archive url in Yoast SEO sitemap
+
+= 2.6 (2019-06-26) =
+
+* Pro: Remove all languages files. All translations are now maintained on TranslationsPress
+* Pro: Move the languages metabox to a block editor plugin
+* Pro: Better management of user capabilities when synchronizing posts
+* Pro: Separate REST requests from the frontend
+* Pro: Copy the post slug when duplicating a post
+* Pro: Duplicate ACF term metas when terms are automatically duplicated when creating a new post translation
+* Pro: Fix hierarchy lost when duplicating terms
+* Pro: Fix page shared slugs with special characters
+* Pro: Fix synchronized posts sharing their slug when the language is set from the content
+* Pro: Fix PHP warning with ACF Pro 5.8.1
+* Pro: Fix ACF clone fields not translated in repeaters
+* Better management of user capablities when synchronizing taxonomies terms and custom fields
+* Extend string translations search to translated strings #207
+* Update plugin updater to 1.6.18
+* Honor the filter `pll_flag` when performing the flag validation when creating a new language
+* Modify the title and the label for the language switcher menu items #307
+* Add support for international domain names
+* Add a title to the link icon used to add a translation #325
+* Add a notice when a static front page is not translated in a language
+* Add support for custom term fields in wpml-config.xml
+* Add filter `pll_admin_languages_filter` for the list of items the admin bar language filter
+* Add compatibility with WP Offload Media Lite. Props Daniel Berkman
+* Yoast SEO: Add post type archive url in all languages to the sitemap
+* Fix www. not redirected to not www. for the home page in multiple domains #311
+* Fix cropped images not being synchronized
+* Fix auto added page to menus when the page is created with the block editor
+* Fix embed of translated static front page #318
+* Fix a possible infinite redirect if the static front page is not translated
+* Fix incorrect behavior of action 'wpml_register_single_string' when updating the string source
+* Fix fatal error with Jetpack when no languages has been defined yet #330
+* Fix a conflict with Laravel Valet. Props @chesio. #250
+* Fix a conflict with Thesis.
+* Fix a conflict with Pods in the block editor. Props Jory Hogeveen. #369
+* Fix fatal error with Twenty Fourteen introduced in version 2.5.4. #374
+
+= 2.5.4 (2019-05-28) =
+
+* Add Kannada to the predefined languages list
+* Yoast SEO: Fix primary product cat not copied or synchronized
+* WPMU Domain Mapping: Fix incorrect domain used for the theme
+* Fix style-rtl.css not loaded when the language is set from the content #356
+* Fix Jetpack featured pages not working. Props Anis Ladram. #357
+* Fix Call to undefined function wp_generate_attachment_metadata()
+
+= 2.5.3 (2019-04-16) =
+
+* Add de_AT and pt_AO to the predefined languages list
+* Pro: Add filter pll_translate_blocks
+* Pro: fix PHP notice when the queried post type has been modified to an array
+* Pro: fix PHP warning when combined with The Event Calendar and Page builder by SiteOrigin
+
+= 2.5.2 (2019-02-12) =
+
+* Pro: Fix translated slugs not accepting forward slashes
+* Pro: Fix fatal error with ACF Pro 5.7.11
+* Fix parent categories incorrectly synchronized #327
+
+= 2.5.1 (2019-01-16) =
+
+* Security: Fix categories and media duplication not protected from CSRF
+* Pro: Allow to update the plugin with WP CLI
+* Pro: Fix search in the button block not filtered in the correct language (needs WP 5.1)
+* Add Saraiki to the predefined languages list
+* Fix a conflict causing a blank page with Divi
+
+= 2.5 (2018-12-06) =
+
+* Add compatibility with WP 5.0
+* Fix custom flags when the WP content folder is not in the WP install folder
+* Fix PHP notice if a language has no flag
+
+= 2.4.1 (2018-11-27) =
+
+* Pro: Add compatibility with REST API changes made in WP 5.0
+* Pro: Fix sticky posts in the REST API
+* Pro: Fix overwritten custom post slug when the post is updated with the REST API
+* Pro: Fix bulk translate for media
+* Fix a conflict with Custom sidebars and Content aware sidebars
+* Fix a conflict with the theme Pokemania
+* Fix PHP notices when using the function 'icl_link_to_element' for terms
+* Fix title slugs for posts written in German
+
+= 2.4 (2018-11-12) =
+
+* Minimum WordPress version is now 4.7
+* Pro: Add the possibility to bulk duplicate or bulk synchronize posts.
+* Pro: Add compatibility with Admin Columns
+* Pro: Add synchronized posts to the REST API
+* Pro: Fix variations messed when changing WooCommerce attributes slugs
+* Pro: Fix incorrect language for ajax requests made on front by The Events Calendar
+* Pro: Fix term not duplicated correctly when the language is set from the content
+* Refactor the core to activate on front and for the REST api actions that were previously available only in the backend (language checks, synchronizations...).
+* Add flags to widgets displayed in only one language (Props Jory Hogeveen) #257
+* Honor the filter 'pll_the_language_args' for all options in menus #237
+* Add better filters for default flags and custom flags
+* Custom flags can now be stored in the polylang directory in the theme
+* Custom flags can now use SVG
+* Add compatibility with Jetpack featured content module
+* Fix Twenty Fourteen featured posts possibly not filtered per language
+* Fix home url not working with WordPress MU Domain mapping
+* Fix Assigning a parent category breaking the hierarchy of translated category
+* Fix: Accept 0,1 and 1.0 as q factors in browser preferred language detection (Props Dominic Rubas)
+* Fix performance issue when using hundreds of widgets
+* Fix translations possibly wrong if the post language is changed without saving the post after
+
+= 2.3.11 (2018-10-03) =
+
+* Pro: Add action 'pll_created_sync_post'
+* Pro: Fix language and translations not included for tags in the REST API
+* Fix Assigning a parent category breaking the hierarchy of translated category
+
+= 2.3.10 (2018-08-16) =
+
+* Fix Lingotek notice not dismissable
+* Fix fatal error with the widget calendar
+
+= 2.3.9 (2018-08-14) =
+
+* Add a notice to inform about Polylang for WooCommerce
+* Deprecate PLL_Pointer
+* Fix bulk editing pages with no language breaking hierarchy #281
+* Fix an edge case where rewrite rules could be messed on a multisite
+* MU Domain Mapping: fix secondary domain redirected to primary domain
+
+= 2.3.8 (2018-07-16) =
+
+* Pro: Duplicate term meta when duplicating a post creates new terms
+* Pro: Add compatibility with ACF Pro when it's bundled with the theme
+* Pro: Fix a fatal error when duplicating posts
+* Set cookie during the home redirect
+* Accept a port in the url to detect the site home
+* Add filter 'pll_is_cache_active' to allow to load the cache compatibility #270 #274
+* Fix potential fatal error when a 3rd party misuses the 'wpml_active_languages' filter #268
+* Fix Uncaught TypeError: s.split is not a function. Props Wouter Van Vliet #262
+* Fix text alignment for RTL scripts in Lingotek panel #247
+* Fix html language attribute filter on admin
+* Fix cookie expiration time when set in js. Props Jens Nachtigall #271
+* Fix fatal error when a 3rd party misuses the WP_Query tax_query param. Props JanneAalto #252
+* Fix an edge case which could mess home pages on a multisite
+
+
+= 2.3.7 (2018-06-07) =
+
+* Pro: The Events Calendar: Fix untranslated events shown in all languages
+* Avoid displaying edit links of translations of the privacy policy page to non-admin
+* Fix draft created when creating a new page on multisite
+* Do not prevent using the cache for home when using WP Rocket 3.0.5 or later #236
+* Fix language filter applied to wrong queries on admin side
+
+= 2.3.6 (2018-05-17) =
+
+* Pro: Fix post type archive slug not translated in ACF page link fields
+* WP 4.9.6: Translate the privacy policy page
+* WP 4.9.6: Add the translated user descriptions to exported personal data
+* Update Plugin updater to version 1.6.16
+* Fix conflict with the plugin View Admin As. Props Jory Hogeveen. #253
+
+= 2.3.5 (2018-05-08) =
+
+* Pro: Fix translated CPT slugs when one CPT name is a substring of another one. Props Steve Reimer.
+* Pro: Fix canonical redirection for post types archives when the CPT slug is translated
+* Pro: Fix ACF private key uselessly synchronized when the public custom field is not synchronized
+* Add filter 'pll_filter_query_excluded_query_vars'
+* Redirect www. to non www. when using multiple domains
+* Fix Yoast SEO category sitemap not filtered by language when using multiple domains
+* Fix PLL_COOKIE === false not honored when using a cache plugin. #248
+* Fix empty predefined languages list
+
+= 2.3.4 (2018-03-27) =
+
+* Pro: Fix conflict with Pods related to translated slugs for custom post types
+* Add Friulian to the predefined languages list
+* Fix conflict (javascript error) with Gütenberg #225
+* Fix conflict on ajax requests introduced by WooCoommerce 3.3.4
+* Fix queries by 'category_name' not auto translated #238
+
+= 2.3.3 (2018-03-15) =
+
+* Pro: Fix tax query using a term sharing slugs (fix a conflict with Fusion Builder)
+* Restore Polylang (free) on REST requests, while disabling the language filter as in v2.3
+* Rework auto translated query with taxonomy in different language #223
+* Synchronize Yoast SEO primary category (needs Yoast SEO 7.0+)
+* Fix PHP warning introduced by Yoast SEO 7.0 #229
+* Fix tax query when using the relation 'OR'
+* Fix a conflict with the combination of Barrel + WP Bakery Page Builder
+* Fix broken redirect with MU domain mapping #226
+* Fix site title not translated in password change email
+
+= 2.3.2 (2018-03-05) =
+
+* Pro: Fix REST requests not filtered by the requested language (introduced in 2.3).
+* Pro: Fix error 404 on single posts if posts are untranslatable
+* Deactivate Polylang (free) on REST requests by default.
+* Fix translated terms unassigned from posts when deleting a term
+* Fix auto translated query with taxonomy in different language returning empty results since WP 4.9 #223
+* Fix conflict with a homepage option of the theme Extra
+* Fix warning when filtering get_pages()
+
+= 2.3.1 (2018-02-15) =
+
+* Pro: Fix GET REST request with slug parameter deleting the post slug
+* Fix http request with a custom query var being redirected to the home page #216
+
+= 2.3 (2018-01-30) =
+
+* Pro: Duplicating a post now duplicates untranslated terms and the featured image (if media are translatable)
+* Pro: Add filter 'pll_sync_post_fields'
+* Pro: Translate ACF Pro clone fields when creating a new field group translation
+* Pro: Allow to share slugs when creating a post or term with the REST API
+* Pro: Load asynchronously the script added on front for multiple domains and subdomains
+* Pro: Fix 'lang' parameter not interpreted when the query includes 'name'
+* Refactor the synchronization of metas for better synchronization and performance improvement
+* Refactor the synchronization of taxonomy terms for performance improvement
+* Refactor language and translations saving for performance improvement
+* Refactor the synchronization of sticky posts
+* Remove all languages files. All translations are now maintained on https://translate.wordpress.org/projects/wp-plugins/polylang #199
+* Refactor the list of languages to merge predefined languages, Facebook locales and fixes for W3C locales
+* Automatically deactivate Polylang when activating Polylang Pro
+* Disable programmatically translated post types and taxonomies in settings. Props Ulrich Pogson. #180
+* Set the cookie language in Javascript when a cache plugin is active
+* Automatically remove the home page from cache when requesting the detection of the browser preferred language
+* Use relative urls for the admin language filter in admin bar. #209
+* Disable auto translation of WP_Term_Query if it has a 'lang' parameter
+* Don't filter REST requests by default. #211
+* Fix Yoast SEO statistics in dashboard showing only the default language. #211
+* Fix WP Rocket clearing the cache of the wrong adjacent post
+* Fix random header image
+* Fix home page not correctly loaded when adding a query var
+* Fix: Impossible to change the language code when the language code is also a WordPress locale.
+
+= 2.2.8 (2018-01-09) =
+
+* Pro: Fix: Impossible to link past events by translation in The Events Calendar
+* Disallow to delete translations of the default term for all taxonomies
+* Fix: Auto add pages adds WooCommerce pages in default language to menus in all languages
+* Fix most used tag cloud in Tags metabox in WP4.9+. Props Pär Thernström. #208
+
+= 2.2.7 (2017-11-30) =
+
+* Fix queries by taxonomy broken since WP 4.9
+* Fix PHP notice in icl_object_id()
+
+= 2.2.6 (2017-11-22) =
+
+* Pro: Fix query by post name and alternative language always returning the post in current language (when sharing slugs)
+* Pro: Fix query by taxonomy and alternative language returning empty results
+* Rework how translation files are loaded in ajax on front when the user is logged (in WP 4.7+)
+* Add filter 'get_objects_with_no_lang_limit'
+* Force loading the admin side when using WP CLI (Props chrisschrijver)
+* Fix check for terms with no language not scaling
+* Fix pll_count_posts not working with multiple post types
+* Fix inconsistent spacing between flag and language name in language switcher parent menu item (Props Amit Tal)
+* Fix spacing between flag and language name when displaying an RTL language
+* Fix get_terms not accepting comma separated values for 'lang' parameter (Props Pavlo Zhukov)
+* Fix possible wrong language detected in url when using subdomains (Props Pavlo Zhukov)
+* Fix double escaped query
+
+= 2.2.5 (2017-11-09) =
+
+* Update plugin updater class to 1.6.15
+* Add $link in cache key of links filters
+* Add support for 'nav_menu' post type in wpml_object_id
+* Fix conflict with Timber (introduced in 2.2.4)
+
+= 2.2.4 (2017-10-26) =
+
+* Pro: Fix unknown language not redirected to default when using multiple domains
+* Pro: Fix empty 'lang' query var not deactivating the language query filter
+* Pro: Fix conflict with The Events Calendar and Visual Composer when used together
+* Add new filter `pll_hide_archive_translation_url` #174
+* Add support for undocumented and deprecated WPML functions `wpml_object_id_filter` and `icl_get_current_language`
+* Fix 'orderby' and 'order' in `wpml_active_languages`. Needs WP 4.7+
+* Fix `icl_get_languages` not returning all languages when skip_missing = 0. Props Loïc Blascos
+* Fix `pll_translate_string` not working on admin #178
+* Fix PHP Warning in widget video in WP 4.9
+* Fix query using 'any' post type not filtered per language (introduced in 2.2)
+* Fix untranslatable string in About metabox. Props Farhad Sakhaei
+* Fix error with PHP 7.1 and Duplicate Post. Props Enea Scerba
+* Fix query auto translation not active in ajax requests on frontend
+* Fix query auto translation for 'postname' and 'pagename'
+* Fix terms query auto translation not working for 'include' when no taxonomy is provided (WP 4.5+)
+
+= 2.2.3 (2017-09-24) =
+
+* Fix editor removed on pages (introduced in 2.2.2)
+
+= 2.2.2 (2017-09-22) =
+
+* Pro: Fix Duplicate post button not working when the user meta has been corrupted
+* Fix PHP notice with the plugin Members #175
+* Fix page template select displayed when editing a translated page for posts
+* Fix incompatibility with WP 4.8.2 (placeholder %1$s in prepare)
+
+= 2.2.1 (2017-08-30) =
+
+* Pro: partially refactor REST API classes
+* Pro: Fix duplicate content user meta not removed from DB when uninstalling the plugin
+* Fix strings translations not removed from DB when uninstalling the plugin
+* Fix incorrect translation files loaded in ajax on front when the user is logged in (WP 4.7+)
+* Fix widget language dropdown removed when saving a widget (introduced in 2.2)
+* Fix queries with negative values for the 'cat' parameter (introduced in 2.2 for queries made on frontend)
+* Fix performance issue in combination with some plugins when the language is set from the content (introduced in 2.2)
+
+= 2.2 (2017-08-16) =
+
+* Pro: Add support for the REST API
+* Pro: Add integration with The Events Calendar
+* Pro: Refactor ACF Pro integration for post metas and integrate term metas
+* Pro: Ask confirmation if synchronizing a post overwrites an existing translation
+* Pro: Separate sync post logic from interface
+* Pro: Fix 'Detect browser language' option automatically deactivated
+* Pro: Fix redirect to 404 when the 'page' slug translation includes non alphanumeric characters.
+* Pro: Fix untranslated post type archive slug
+* Pro: Fix ACF taxonomy fields not copied when the taxonomy is not translated #156
+* Pro: Fix fatal error with ACF4
+* Support a different content text direction in admin #45
+* Add support for wildcards and 'copy-once' attribute in wpml-config.xml
+* Add minimal support for the filters 'wpml_display_language_names' and 'icl_ls_languages'
+* Improve compatibility with the plugin WordPress MU Domain Mapping #116
+* Improve speed of the sticky posts filter #41
+* Remove redirect_lang option for multiple domains and subdomains
+* Use secure cookie when using SSL
+* Allow to copy/sync term metas with the filter 'pll_copy_term_metas'
+* Filter ajax requests in term.php according to the term language
+* Add error message in customizer when setting an untranslated static front page #47
+* Load static page class only if we are using a static front page
+* Refactor parse_query filters to use the same code on frontend and admin
+* Don't use add_language_to_link in filters
+* Move ajaxPrefilter footer script on top
+* Use wp_doing_ajax() instead of DOING_AJAX constant
+* Fix queries custom tax not excluded from language filter on admin
+* Fix WP translation not loaded when the language is set from the content on multisite.
+* Fix the list of core post types in PLL_OLT_Manager for WP 4.7+
+* Fix post name and tag slug incorrectly sanitized for German and Danish
+* Fix lang attribute in dropdowns
+* Fix wpml_permalink filter #139
+* Fix WPML constants undefined on backend #151
+* Fix a conflict with the plugin Custom Permalinks #143
+* Fix menu location unexpectedly unset
+
+= 2.1.6 (2017-07-17) =
+
+* Pro: fix duplicate post button not working in PHP 7.1
+* Pro: fix CPTUI untranslated labels on admin
+* Adapt related posts filter to use slug instead of name to follow changes made on Jetpack server ( Props Steve Kaeser )
+* Fix PHP notices when translating CPT and custom tax titles in Yoast SEO
+* Fix PHP warning when all plugins are networked activated
+
+= 2.1.5 (2017-05-31) =
+
+* Add compatibility with new media widgets introduced in WP 4.8
+* Removing the language information in URL for the default language is now default
+* Update plugin updater class to 1.6.12
+* Pro: fix PHP notices when duplicating the content
+* Fix: test existence of `twentyseventeen_panel_count` instead of relying only on the active template
+* Fix: set current property to false when removing the current-menu-item class #134 props @mowar
+* Fix PHP notice when editing a term without language
+* Fix possible PHP notice when deleting a category
+* Fix fatal error with Gantry 5
+
+= 2.1.4 (2017-05-16) =
+
+* Pro: fix user not logged in on secondary domain when previewing changes
+* Pro: fix archive links without language code in ACF link field (ACF 5.4.0+)
+* Fix redirection from www subdomain to wrong language domain.
+* Fix: selecting "Front page displays latest posts" in the customizer not cleaning the languages cache
+* Fix accessibility of the admin language switcher
+
+= 2.1.3 (2017-04-11) =
+
+* Pro: Fix translated slug of 'page' if it is translated to an empty string
+* Update plugin updater class to 1.6.11
+* Strings registered with a wpml-config.xml file or WPML functions are now multiline by default
+* Translate the site title in emails sent to the user
+* Fix sanitize_user for specific locales
+* Fix deprecation notice in Yoast SEO integration
+* Fix: Clean term cache after the language has been set in mass #119
+
+= 2.1.2 (2017-03-09) =
+
+* Pro: Add filter 'pll_xdata_nonce_life'
+* Pro: Fix translation of WooCommerce product attribute slug
+* Pro: Fix product synchronization in WooCommerce 2.7
+* Pro: Fix error message when bulk trashing synchronized posts
+* Add option to discard item spacing in the output of pll_the_languages() ( Props Ceslav Przywara ) #93 #95
+* Add as, dzo, kab, km, ml_IN, nl_BE, pa_IN, rhg, sah, ta_IN, tah, te, tt_RU to the predefined list of languages
+* Update plugin updater class to 1.6.10
+* Fix: Remove the dependency to is_ssl() to detect the language in the url ( language set from the directory name )
+* Fix issue with secondary level domains
+* Fix strings not translated in emails
+* Fix incorrect usage of add_action() ( Props Peter J. Herrel ) #103
+* Fix wrong redirect in customizer in WP 4.7
+
+= 2.1.1 (2017-02-15) =
+
+* Pro: Add filter 'pll_enable_duplicate_media' for a fine control of automatic media duplication
+* Add filter 'pll_links_model' for the links model class name
+* Trim any starting ^ from modified rewrite rules
+* Pro: Fix wrong count of plugins to update
+* Fix slashed strings translations not saved #94
+
+= 2.1 (2017-01-25) =
+
+* Minimum WordPress version is now 4.4
+* Pro: Add support for synchronized posts (same post in multiple languages)
+* Pro: Add support for custom post type UI and the Divi Builder
+* Improve support of Yoast SEO (no category base and post type archive breadcrumb title)
+* Move Languages menu at top level instead of submenu of the WordPress settings
+* Copy the original post date when creating a translation and when the date is synchronized (Props Jory Hogeveen) #32
+* Remove hreflang attributes on paged pages and paged posts
+* Add label to widget language dropdown for better accessibility (Props Lawrence Francell) #53 #56
+* Remove constants POLYLANG_URL and PLL_LOCAL_URL
+* wp_get_sidebars_widgets() and is_active_sidebar() are now filtered according to widgets languages #54
+* Add functions pll_esc_html__(), pll_esc_html_e(), pll_esc_attr__() and pll_esc_attr_e() to the API (Props jegbagus) #83
+* Pro: Fix conflict between WooCommerce shop on front and translated shop base slug
+* Pro: Fix $wp_rewrite search base and author_base not translated #68
+* Pro: Fix page preview does not log in the user when using subdomains
+* Fix: avoid setting the language cookie on 404 pages
+* Fix: rewrite rules order modified for custom post types archives
+* Fix: conflict with WP All Import causing our filters to fail in "Add Media" modal when editing a post
+* Fix: auto add pages not working for nav menus assigned to several locations
+* Fix: Jetpack infinite scroll for multiple domains #58 #74
+* Fix: serialize error in Strings translations when balanceTags option is active #63
+* Fix: static front page preview when redirected from the languages page #49
+* Fix: Auto add pages not working for nav menus assigned to several locations
+* Fix: Conflict with Woocommerce Show Single Variation
+* Fix: Parent page not synchronized in Quick edit (introduced in 2.0.8)
+* Fix: WPML API wpml_element_has_translations and wpml_post_language_details
+* Fix: unattached media translations not in language switcher
+* Fix: Conflict with WP Residence advanced search
+
+= 2.0.12 (2016-12-19) =
+
+* Fix plugin not loaded first (introduced in 2.0.11)
+* Fix wrong translations files loaded when the language is set from the content in WP 4.7 #76
+* Fix notice when a tax query has no terms (using EXISTS or NOT EXISTS)
+
+= 2.0.11 (2016-12-12) =
+
+* Pro: Fix shared term slugs broken by a late change in WP 4.7 #73
+* Pro: Fix media taxonomies lost when creating a media translation when taxonomies sync is activated #72
+* Fix fatal error in customizer when Twenty Seventen is activated and another theme is previewed #71
+* Fix wrong plugin language on admin if user locale is different from site locale in WP 4.7
+
+= 2.0.10 (2016-12-05) =
+
+* Add support for front page panels of Twenty Seventeen
+* Remove draft posts from the language switcher even when the user is logged in
+* Fix: Make argument 2 of icl_object_id optional
+* Fix a conflict with the Divi theme (#67)
+
+= 2.0.9 (2016-11-15) =
+
+* Fix javascript error in some ajax requests
+
+= 2.0.8 (2016-11-14) =
+
+* Disable admin language feature in WP 4.7+
+* Pro: fix case where a media could lose its parent post when translated on the fly by the content duplication
+* Pro: fix on the fly media created at content duplication attached to parent page instead of child page
+* Fix translations input fields not populated in languages metabox when creating a new translation in WP 4.7
+* Fix possibility to delete the translations of the default category in WP 4.7
+* Fix tag search not filtered per language in Quick edit in WP 4.7
+* Fix dropdown language switcher not working for untranslated pages
+
+= 2.0.7 (2016-10-18) =
+
+* Fix issues with static front pages introduced in version 2.0.6
+
+= 2.0.6 (2016-10-17) =
+
+* Pro: Fix translated paged slug not working on paged static front page
+* Add support for WPML filter 'wpml_language_form_input_field'
+* Fix PHP notice when using the WPML filter 'wpml_current_language'
+* Fix cases where the admin language filter is not correctly taken into account
+* Fix paged static front pages in plain permalinks
+* Fix paged static front pages for multiple domains (#43)
+* Fix warning occurring when a 3rd party plugin attempts to register anything but a string in the strings translations panel
+* Fix cross domain http request for media when using multiple domains or subdomains
+* Fix error 404 on pages when no language has been created yet
+
+= 2.0.5 (2016-09-22) Five years after! =
+
+* Pro: Fix conflict with WPBakery Visual Composer
+* Pro: Fix conflict between multiple domains SSO and FORCE_SSL_ADMIN
+* Pro: Fix duplicated fields not displayed in new translation in ACF Pro 5.4+
+* Add Tibetan and Silesian to the predefined languages list
+* Remove duplicated strings from the strings translations (even when they have a different name or group)
+* The languages and translations of custom post types and taxonomies are no more activated by default at activation
+* Allow to deactivate auto translation in secondary by setting 'lang' to an empty value
+* Fix: invalidate the cache of PLL_MO ids when adding a new language
+* Fix: don't filter secondary queries when editing a post in an untranslated post type
+
+= 2.0.4 (2016-09-06) =
+
+* Add Gujarati to the predefined languages list
+* Fix conflict with Page Builder. Other parts of the conflict are fixed in Page Builder 2.4.14
+* Fix plugins translations incorrectly loaded in WP 4.6
+* Fix error 404 on paged urls when using a non standard port
+
+= 2.0.3 (2016-08-16) =
+
+* Pro: Fix PHP notice when hiding the language code in url and the language is set from subdomains
+* Pro: Fix one more media being created when the duplicate media in all languages is activated (introduced in 2.0)
+* Pro: Fix shared term slugs not working on PHP 7
+* Pro: Fix Polylang storing integers in some ACF Pro fields where ACF Pro stores strings
+* Pro: Fix ACF Pro custom fields synchronized even when the custom fields synchronization option is deactivated (#40)
+* Fix PHP notice: Undefined variable: original_value in /modules/wpml/wpml-api.php on line 168
+* Fix translations loaded too soon by plugins not correctly reloaded since WP 4.6 (#39)
+* Fix: Remove the delete link for translations of the default category on PHP 7
+* Fix unescaped i18n strings in Lingotek presentation
+
+= 2.0.2 (2016-08-03) =
+
+* Avoid fatal error when a 3rd party theme or plugin has a malformed wpml-config.xml file: the malformed wpml-config.xml file is simply ignored
+
+= 2.0.1 (2016-08-02) =
+
+* Fix fatal error on PHP < 5.4 (introduced in 2.0)
+* Fix custom flags not being loaded (introduced in 2.0)
+
+= 2.0 (2016-08-02) =
+
+* Pro: Improve integration with ACF Pro
+* Pro: Add support for single sign on across multiple domains or subdomains
+* Pro: Add support for browser language detection when using multiple domains
+* Pro: Add support for translation of the static portion of the post permalink structure
+* Pro: Fix deactivated languages appearing in Yoast SEO sitemaps
+* Pro: Fix impossibility to visit a deactivated language when using subdomains or multiple domains (#10)
+* Pro: Fix when sharing slug on the page for posts, only one of them is accessible (#33)
+* Add the possibility to use the language switcher as dropdown in menu
+* Add support for custom logo introduced in WP 4.5 (#6)
+* The backend current language ( PLL()->curlang ) is now equal to the language of current post or term being edited (#19)
+* The sample permalink is now updated when changing the language in the Languages metabox
+* Revamp the wpml-config.xml reader to use simplexml instead of our custom xml parser
+* Improve support for the WPML API (including Hook API introduced in WPML 3.2)
+* Add support for translation of meta titles and descriptions of custom post types and custom taxonomies in Yoast SEO
+* Replace uncached functions by WPCOM VIP functions when available
+* Improve compatibility with WP 4.6
+* Fix parent category wrongly assigned to post when synchronizing children categories (#21)
+* Fix custom fonts not loaded when using multiple domains or subdomains
+* Fix remove_accents() not working for German and Danish (#24)
+* Fix incorrect static front pages urls on backend
+* Fix impossible to directly enter the page number in strings translation table (introduced in 1.9.3)
+* Fix conflict with WP Sweep (needs WP Sweep 1.0.8+)
+* Fix potential performance issue by querying only taxonomies to show in quick edit to filter the category checklist
+* Fix conflict (database error) with ReOrder-posts-within-categories plugin
+* Fix languages per page option not saved
+
+= 1.9.3 (2016-06-28) =
+
+* Pro: Allow to add slashes in url slugs translations
+* Pro: Fix archive links not using translated slugs
+* Pro: Fix visitor being redirected to 404 if his browser preference is set to an inactive language
+* Fix strings translations table always back to page 1 when submitting the form (#14)
+* Fix get_pages( array( 'lang' => '' ) ) not querying all the languages
+* Fix switching the admin language filter can override the static front page settings (#16)
+
+= 1.9.2 (2016-06-06) =
+
+* Pro: fix unreachable hierarchical custom post type posts when they are sharing slugs across languages
+* Fix missing argument 3 in icl_t
+* Fix conflict with WooCommerce product variations
+
+= 1.9.1 (2016-05-23) =
+
+* Pro: add compatibility with Beaver Builder
+* Pro: fix media wrongly created when adding a new media translation
+* Add azb, ceb, de_CH_informal, es_GT, mr, nl_NL_formal to the predefined list of languages
+* Fix the language switcher not linking to media translations for anonymous visitors
+
+= 1.9 (2016-04-27) =
+
+* Pro: add the possibility to translate custom post types slugs, taxonomies slugs and more
+* Pro: add the possibility to share the same post or term slug across languages
+* Pro: add the possibility to duplicate the content when creating a new translation
+* Pro: add the possibility to create all translations at once when uploading a media
+* Pro: add the possibility to disable a language
+* Add license and update management
+* Add inline docs for all filters and actions
+* When possible, the rel alternate hreflang now display only the language code (without the country code)
+* When combined with flags in the language switcher, wrap the language name inside tags
+* Add customizer selective refresh support for the language switcher widget ( needs WP 4.5+ )
+* Fix dynamic options of the language switcher widget not working in the customizer
+* Fix possible error 404 on page shortlink when using subdomains or multiple domains
+* Fix get_adjacent_post() and wp_get_archives() for untranslated post types ( needs WP 4.4+ )
+* Fix language homepage urls not present in Yoast SEO sitemap (when the homepages display posts)
+
+= 1.8.5 (2016-04-03) =
+
+* Revert from $_SERVER['PHP_SELF'] to $_SERVER['SCRIPT_FILENAME'] to detect if the user is on login/register/signup page
+* Fix incompatibility introduced by WP 4.5 in Edit single taxonomy term screen
+* Fix existing post overridden when creating a language and a conflicting plugin sets the global $post on languages pages
+
+= 1.8.4 (2016-03-06) =
+
+* Revert canonical redirection of static front page when combining plain permalinks + default language hidden in url (introduced in 1.8.2)
+
+= 1.8.3 (2016-03-04) =
+
+* fix: All pages are redirected to the home page on some installations (introduced in 1.8.2)
+
+= 1.8.2 (2016-03-02) =
+
+* Add support for the 'wpml_get_default_language()' function from the WPML API
+* Stop blocking saving settings when errors are detected (invalid domains)
+* Use publicly_queryable => true instead of public => true for the language taxonomy (WP 4.5+)
+* fix: PHP notice when pll_default_language() is called before a language is created
+* fix: PHP notice undefined property PLL_Language::$page_on_front
+* fix: canonical redirection of static front page when combining plain permalinks + default language hidden in url
+* fix: YARPP compatibility broken in v1.8
+* fix: Remove the delete link for translations of the default category (introduced back by WP 4.3)
+* fix: settings not displayed with WP 4.1 or older
+
+= 1.8.1 (2016-01-31) =
+
+* Update the list of Facebook locales used for Opengraph support with Yoast SEO and Jetpack
+* fix: secondary query with translated post type and untranslated taxonomy mixes languages (introduced in 1.8)
+* fix: issue with paged static front page when hiding the default language in url
+* fix: potential issue with cache after synchronizations
+* fix: trailing slash added to canonical home url outputted by Yoast SEO when using default permalinks
+
+= 1.8 (2016-01-19) =
+
+* Minimum WordPress version is now 4.0
+* Add ary, bn_BD, en_ZA, es_AR, fr_CA and fr_BE to the predefined languages list
+* Adopt WordPress coding standards
+* New structure for translated posts and terms (=> several methods of PLL_Model are deprecated).
+* Revamp the management of the static front page and page for posts
+* Improve performance for navigation menus with a lot of pages
+* The Polylang and WPML API are now loaded when 'plugins_loaded' is fired (on frontend only if at least one language has been defined)
+* Add 'pll_get_post_translations()' and 'pll_get_term_translations()' to the API
+* Add filter 'pll_cookie_expiration' to change the cookie expiration time
+* Add support for 'wpml_get_language_information()' function from the WPML API
+* The default language is now managed directly from the languages list table
+* Various accessibility improvements
+* It is now possible to choose the languages flags from the available list (custom flags on frontend still work as previously)
+* Revamp the settings page (now a list table with inline configuration)
+* Add an option to remove all data when uninstalling the plugin
+* Add test of subdomains and domains accessibility
+* Add post state for translations of the front page and posts page
+* Add better support of the customizer menus introduced in WP 4.3
+* Media taxonomies (created by 3rd party plugins) are now filtered by language when editing a media
+* Synchronization of taxonomies (created by 3rd party plugins) and meta are now enabled for media
+* The 'hreflang' tag now refers to the locale instead of the 2-letters language code
+* Workaround for WordPress locales not being W3C valid (see #33511)
+* Workaround a bug in Nextgen Gallery causing redirect on album
+* Add compatibility with Duplicate Post plugin to avoid duplicated post keeping the link to translations
+* Add compatibility with Jetpack Related Posts
+* fix: incorrect rewrite rules after changing how the language is set (need to flush rewrite rules after this)
+* fix: password protected pages don't work on multiple domains
+* fix: ensure that the page parent is in the correct language when using bulk edit
+* fix: is_tax set on category and post tags archives when it should not
+* fix: automatically added new top-level pages to menus are not filtered by language
+* fix: nav menus locations are messed when changing the default language
+* fix: error 404 for untranslated taxonomies pages
+* fix: single posts and pages links do not include the language code when using the default permalinks and forcing the language code in url
+* fix: missing trailing slash on home url when using default permalinks or a static front page
+* fix: sticky visibility is copied to new translation only if the synchronization is activated
+* fix: remove "» Languages » [language name]" from the feed title
+* fix: spaces are not honored when searching strings translations
+* fix: default language not set and terms translations not correctly imported when using WordPress Importer
+* fix: the browser language detection does not differentiate 'en_US' and 'en_GB'
+* fix: non alphanumeric characters query vars values lead to an infinite redirection loop on static front pages
+* fix: user profile not saved for a language when the language code contains a "-"
+* fix: non translated posts page always link to the static front page even when they should not
+* fix: remove hreflang="x-default" when using one domain per language
+* fix: deprecated function notice in WP 4.5 alpha
+* fix: wrong url for attachments when media are translated and using subdomains
+* fix: wrong url for unattached attachments when using subdirectories (since WP 4.4)
+* fix: wrong url scheme for custom flags
+
+= 1.7.12 (2015-11-13) =
+
+* The language taxonomy is now public for compatibility with WP 4.4
+* fix: nav menus locations are not correctly populated in customizer in WP 4.4
+* fix: the termmeta table was still deleted at upgrade
+* fix: fatal error when using the argument 'post_id' in 'pll_the_languages()' (introduced in 1.7.11) [props EKesty](https://wordpress.org/support/topic/bug-on)
+* fix: potential notice in 'pll_the_languages()' [props mattkeys](https://wordpress.org/support/topic/bug-on)
+
+= 1.7.11 (2015-10-15) =
+
+* fix: conflict with GET ajax requests sent by the jquery method load
+* fix: notice in frontend-nav-menu.php at line 211 (introduced in 1.7.10) [props Jesse Graupmann](https://wordpress.org/support/topic/warning-and-notice-on-upgrade)
+* fix: the parent list in page attributes metabox is not in the correct language (introduced in 1.7.10)
+* fix: error 404 for attachments
+* fix: the language switcher is not displayed when combining "Forces link to front page" and "Hides languages with no translation"
+
+= 1.7.10 (2015-09-28) =
+
+* Add Occitan translation contributed by [Cédric Valmary](http://www.totenoc.eu/)
+* Add de_DE_formal, en_NZ, es_CO, hy, oci, ps and tl to the predefined languages list
+* Add the filter 'pll_predefined_languages' and the actions 'pll_language_edit_form_fields' and 'pll_language_add_form_fields'
+* the termmeta table (used in Polylang < 1.2) is no more deleted when uninstalling the plugin (as it will soon be included in WP)
+* fix: prevent creating a media translation if one already exists
+* fix: Attempt to translate the nav menus for themes registering a theme location but not using it in wp_nav_menu()
+* fix: Jetpack infinite scroll
+* fix: issue with terms languages when two languages have the same name
+* fix: notices when deleting a tag and Lingotek is active
+* fix: the languages cache is not cleaned when updating the site home url
+* fix: conflict with the theme Ambition
+* fix: front page canonical url displayed by Yoast SEO
+* fix: typo in options definition at install [props null.bit](https://wordpress.org/support/topic/suggestions-for-two-new-filters?replies=5#post-7466159)
+* fix: error when adding a term in a non-translated taxonomy
+
+= 1.7.9 (2015-08-17) =
+
+* Minimum WordPress version is now v3.9
+* Add: hreflang="x-default" on front page when the default language code is not hidden in urls
+* fix: remove hreflang links in html head section of paged archives to please Google
+* fix: conflict with WPSEO sitemap caching when using multiple domains. [props Junaid Bhura](https://wordpress.org/support/topic/wp-seo-sitemap-and-translation-subdomain-issue?replies=8#post-7113817)
+* fix: change the order of strings translations columns for better display on mobile devices in WP 4.3
+* fix: various issues with nav menus and customizer in WP 4.3
+* fix: correctly disallow unchecking both show names and show flags in the language switcher form
+
+= 1.7.8 (2015-07-21) =
+
+* fix: conflict with PHP < 5.4 introduced in 1.7.7
+
+= 1.7.7 (2015-07-20) =
+
+* Add Romanian translation contributed by uskro
+* Add Japanese translation contributed by [Eiko Toda](http://www.eikotoda.com)
+* Update French translation contributed by [fxbenard](http://fxbenard.com/)
+* The language locale is now validated with the same pattern as in WP 4.3. See #28303
+* fix: make sure that the language switcher never finds translations for untranslated post types (could occur when the post type was previously translated)
+* fix: display the default category according to the admin language filter in settings->writing
+* fix: flushing rewrite rules at network activation and de-activation is back. [props RavanH](https://polylang.wordpress.com/2015/06/10/polylang-1-7-6-and-multisite/comment-page-1/#comment-1138)
+* fix: avoid a conflict with WP Super Cache preloading (loading 'polylang_mo' posts which are 404). [props ecdltf](https://wordpress.org/support/topic/polylang_mo-and-404s-take-2)
+* fix: customizer menus issues introduced by changes in WP 4.1
+* fix: strings translations are not saved when pressing enter
+* fix: it is not possible to de-activate the translation for custom post types and taxonomies from wpml-config.xml
+* fix: conflict with plugins using stringified json in ajax requests
+
+= 1.7.6 (2015-06-10) =
+
+* Add Galician translation contributed by [Toño Calo](http://fedellar.wordpress.com/)
+* fix: incorrect post type archive link for untranslated post types
+* fix: notices in wp-import.php
+* fix: avoid flushing rewrite rules at network activation and de-activation
+* fix: the note below the category list table displays the default category according to the admin language filter
+* fix: wrong future posts permalinks
+* fix: deleting a media translation deletes the file too
+* fix: when using persistent object cache, get_terms is not always filtered by the correct language on admin side
+* fix: it is possible to create two categories having the same translation
+* fix: fatal error when using the dropdown language switcher in WP < 4.1
+
+= 1.7.5 (2015-05-11) =
+
+* Add 'pll_languages_list' filter
+* fix: warning when a plugin calls 'icl_object_id' with an untranslated post type (seen in ACF 4.4.1)
+* fix: the language is not correctly set from the url when using PATHINFO permalinks (introduced in 1.6!)
+* fix: notice when a search is filtered by a taxonomy term in a different language
+
+= 1.7.4 (2015-05-03) =
+
+* fix: translated taxonomies and post types from wpml-config.xml are not filtered on frontend (introduced in 1.7.2)
+* fix: WPML strings translations not always loaded (introduced in 1.7)
+* fix: $.ajaxPrefilter() may not work as expected [props ScreenfeedFr](https://wordpress.org/support/topic/ajaxprefilter-may-not-work-as-expected)
+* fix: can't hide the language code for the default language when using subdomains
+* fix: incorrect static front page url when hiding the default language information
+* fix: an untranslated posts page may display posts in all languages
+* fix: javascript error when changing the language of a hierarchical post type from the languages metabox in WP 4.2
+* fix: subdomains urls are malformed when the main site uses www.
+* fix: suggest tags are not filtered in quick edit
+* fix: parent page dropdown list not filtered in quick edit
+
+= 1.7.3 (2015-04-11) =
+
+* the transient 'pll_languages_list' now stores an array of arrays instead of an array of PLL_Language objects
+* fix: fatal error for users hosted at GoDaddy (due to PLL_Language objects stored in a transient)
+* fix: additional query vars are removed from home page
+* fix: categories are not filtered by the admin language switcher in posts list table (introduced in 1.7)
+* fix: when using multiple domains, the domain url is lost when modifying the language slug
+* fix: the queried object is incorrectly set for author archives (introduced in 1.6.5)
+* fix: notice when a nav menu assigned to a translated nav menu location has been deleted
+* fix: no canonical redirection when using pretty permalinks and querying default permalinks
+
+= 1.7.2 (2015-03-23) =
+
+* fix: comments are filtered for posts in a post type not managed by Polylang
+* fix: translated static front page don't work when setting PLL_CACHE_HOME_URL to false (introduced in 1.7)
+* fix: the query for taxonomies on custom post types is broken (when adding the language code to the url)
+
+= 1.7.1 (2015-03-20) =
+
+* fix: wrong redirection when using a static front page and replacing the page name by the language code (introduced in 1.7)
+
+= 1.7 (2015-03-19) =
+
+* Minimum WordPress version is now v3.8
+* Add new languages to the predefined languages list: Swiss German, Hazaragi
+* Add compatibility with nested tax queries introduced in WP 4.1
+* Add compatibility with splitting shared terms to be introduced in WP 4.2
+* Add the possibility to change the domain in the default language when using multiple domains (avoids a conflict with the domain mapping plugin)
+* Add the possibility to set the language from the code in url when using default permalinks
+* Adding the language code in url is now default at first activation (should improve the out of the box compatibility with other plugins and themes)
+* Add new language switcher option to hide a language with no translation
+* pll_the_languages() now outputs the js code to handle language change in dropdown list (as done by the widget)
+* Improve performance by using base64 encoded flags + various slight optimizations
+* Improve protection against chained redirects
+* The find posts list is now filtered per media language when clicking on attach link in Media library
+* Copy alternative text when creating a media translation
+* The category checklist in quick edit is now filtered per post language instead of admin language filter
+* Quick and bulk language edit don't break translations anymore if the new language is free
+* Make it impossible to change the language of the default categories
+* Make sure that a default category defined in settings->writing is translated in all languages
+* Tweak css for mobiles in add and edit term form
+* Tweak the query getting the list of available posts in the autocomplete input field in the post languages metabox
+* fix: after adding a term translation, need to refresh the page before adding a new term
+* fix: term translations rows are not modified in list table when a term is added / deleted or inline edited
+* fix: post translations rows are not modified in list table when a post is inline edited
+* fix: using brackets in language name breaks strings translations
+* fix: quick edit may conflict with other plugins
+* fix: impossible to use several dropdown languages widgets
+* fix: pll_the_languages() may display a dropdown with empty options
+* fix: the categories widget does not work correctly with dropdown
+* fix: autosave post always created after manual save
+* fix: tax query not filtered by language when using 'NOT IN' operator on a translated taxonomy
+* fix: incorrect translation url for searches filtered by taxonomy
+* fix: backward incompatibility for edited_term_taxonomy action introduced in WP 4.2
+* fix: the home link may be incorrect on MS Windows
+* fix: tags in wrong language may be assigned when bulk editing posts in several languages
+* fix: tags created when bulk editing posts are not assigned any language
+* fix: Illegal string offset 'taxonomy' introduced in v1.6.5
+* fix: Undefined property: WP_Query::$queried_object_id when calling pll_the_languages(array('raw' => 1)) in a function hooked to 'wp'. props [KLicheR](https://wordpress.org/support/profile/klicher)
+* fix: Notice in admin.php when used with MailPoet plugin
+
+= 1.6.5 (2015-02-18) =
+
+* Add new correspondences between WordPress locales and Facebook locales (for WPSEO and Jetpack users)
+* fix: quick draft posts are always assigned the default category in the default language
+* fix: Notice: Undefined offset: 0 in wp-includes/query.php introduced in WP 4.1
+* fix: is_tax and is_archive are not correctly set when a custom taxonomy term is queried
+* fix: conflict introduced by WPSEO 1.7.2+
+
+= 1.6.4 (2015-02-01) =
+
+* Add es_MX to predefined languages list
+* Add compatibility with WordPress SEO sitemaps for multiple domains and subdomains
+* fix: a new post is assigned the wrong (untranslated) default category if no category is assigned by the user
+* fix: the home links now have the right scheme even if PLL_CACHE_HOME_URL is not set to false
+* fix: fatal error when using old versions of WPSEO (I should do what I tell other to do!)
+* fix: strings translations are not switched when using switch_to_blog
+
+= 1.6.3 (2015-01-09) =
+
+* Add Georgian translation contributed by [Tours in Georgia](http://www.georgia-tours.eu/)
+* fix: WXR export does not include the language of untranslated terms (will now work only for newly saved terms)
+* fix: better cleaning of DB when translated objects are deleted
+* fix: incorrect (ajax) translations links when modifying a term language
+* fix: warning: Illegal string offset 'taxonomy' introduced by the combination of WP 4.1 and some plugins.
+
+= 1.6.2 (2014-12-14) =
+
+* fix: bugs and inconsistencies compared to WPML in 'icl_get_languages' (should fix a conflict with Avada)
+* fix: https issue
+* fix: stop displaying an error when adding en_US as new language (translation not downloaded)
+* fix: infinite redirect loop on (unattached) attachment links
+* fix: impossible to add tags in post quick edit (introduced in 1.5)
+* fix: the customizer does not land to the right page when cumulating: static front page + page name in url + default language code not hidden
+* fix: read parent theme wpml-config.xml before child theme
+* fix: add protection to avoid empty language
+* fix: page preview link again
+
+= 1.6.1 (2014-11-19) =
+
+* Add Brazilian Portuguese translation contributed by [Henrique Vianna](http://henriquevianna.com/)
+* Improve compatibility with Types: allow custom fields to be populated when creating a new translation
+* Make it impossible to remove the translations of the default category
+* Fix: possibility to add a path when using multiple domains (same path for all languages) broken since v1.5.6
+* Fix: preview link for non default language when using multiple domains
+* Fix: error displayed when setting the static front page and only one language has been defined
+* Fix: revert changes on rewrite rules with front introduced in 1.6
+* Fix: conflict with WordPress SEO when no language has been created
+
+= 1.6 (2014-10-27) =
+
+* Add Croatian translation contributed by Bajro
+* Add new languages to predefined languages list: Azerbaijani, English (Australia), English (UK), Basque
+* Add flag in front of the language select dropdown for posts and terms
+* Add widget text translation
+* Add opengraph support for locale and translations when WordPress SEO or Jetpack are activated
+* Add error message if attempting to assign an untranslated page as static front page
+* Add 'pll_sanitize_string_translation' filter to sanitize registered strings translations when saved
+* Fix: change the en_US flag to US flag. The UK flag is now associated to en_GB
+* Fix: change Belarusian locale from be_BY to bel to in agreement with translate.wordpress.org
+* Fix home pages duplicate urls when using domains or subdomains
+* Fix rewrite rules with front
+* Fix: terms are always in default language when created from post bulk edit
+
+= 1.5.6 (2014-10-11) =
+
+* Fix: the admin language filter is not active for paginated taxonomy in nav menu admin panel
+* Fix: wrong redirection if a domain is a substring of another domain (ex: mysite.com and mysite.co)
+* Fix: impossible to translate numeric values in options defined in wpml-config.xml
+* Fix: call to undefined method PLL_Links::get_translation_url() with Avada theme
+* Fix: manage_{$this->screen->taxonomy}_custom_icolumn is a filter and not an action
+
+= 1.5.5 (2014-09-10) =
+
+* Fix: missing argument 4 in icl_translate
+* Fix: conflict with Vantage theme
+* Fix: possible issue with cookie domain on 'localhost'
+* Fix: filtering string translations does not work when the group name contains a space
+* Fix: Possible 404 error for attachments
+* Fix: PHP notice when a shared term is not translated in all taxonomies
+
+= 1.5.4 (2014-08-13) =
+
+* Add new API functions: pll_get_post_language, pll_get_term_language, pll_translate_string
+* Add better compatibility with Jetpack 3
+* Fix: attachments don't get any language when uploaded from frontend
+* Fix: authors cannot create tags
+* Fix: too restrictive capability checks for some edge cases
+* Fix: conflict with WPSEO: taxonomy metas cannot be saved
+
+= 1.5.3 (2014-07-12) =
+
+* Add: Capability check before creating links in post list table
+* Add: Possibility not to cache languages objects with option PLL_CACHE_LANGUAGES (for GoDaddy users)
+* Fix: Saving a header or a background in menu Appearance resets nav menus locations (introduced in 1.5)
+* Fix: sub-sub-options and deeper levels defined in wpml-config.xml are not translated
+* Fix: Fatal error when creating a new site when Polylang is network activated (introduced in v1.5.1)
+* Fix: Admin language forced to English when activating Polylang (before creating any new language)
+* Fix: 'pll_count_posts' second parameter not taken into account
+* Fix: 'edit-post' and 'create-posts' capabilities are not differentiated when saving a post
+
+= 1.5.2 (2014-06-24) =
+
+* Fix: Revert post translations terms cleaning introduced in 1.5 as it seems to cause problems
+* Fix: Impossible to delete a biographical info (introduced in 1.5)
+* Fix: Security issue reported by [Gregory Viguier](http://www.screenfeed.fr/)
+
+= 1.5.1 (2014-06-19) =
+
+* Add: filter 'pll_settings_tabs' and action 'pll_settings_active_tab_{$tab}'
+* Add: possibility to add a path when using multiple domains (same path for all languages)
+* Fix: Bad redirection if /language/ is added to urls (introduced in 1.5)
+* Fix: Nav menu locations are not saved in customizer (introduced in 1.4)
+* Fix: Unable to unset nav menu locations
+* Fix: Incorrect link for date archives in language switcher (introduced in 1.5)
+* Fix: Fatal error when using featured content in Twenty Fourteen
+* Fix: Posts bulk edit broken (introduced in 1.5)
+* Fix: Polylang does not play nice with switch_to_blog
+* Fix: Warning: reset() expects parameter 1 to be array, null given in admin-filters-columns.php on line 81
+
+= 1.5 (2014-05-29) =
+
+* Add Ukrainian translation contributed by [http://getvoip.com/](http://getvoip.com/)
+* Refresh translation metaboxes (again): now translated posts are chosen from an autocomplete input field
+* Categories and post tags translations are also chosen in an autocomplete input field
+* Better error management on languages pages
+* Use Dashicons instead of Icomoon icons for WP 3.8+
+* Check if translated post is readable by the current user before displaying the language switcher
+* Minimum Twenty Fourteen version is now 1.1
+* Code cleaning
+* Add support for Quick draft introduced in WP 3.8
+* Add support for object cache plugins for recent posts and recent comments widgets
+* Add support for pages with modified query in the language switcher (ex: when multiple post types queried on the same page)
+* Add new API functions: pll_languages_list, pll_set_post_language, pll_set_term_language, pll_save_post_translations, pll_save_term_translations, pll_count_posts
+* Add new filter pll_the_languages_args
+* Add support for ICL_LANGUAGE_CODE == 'all' on admin side
+* Fix: Galician flag
+* Fix: static page on front pagination is broken
+* Fix: search url may be broken
+* Fix: PHP notice in icl_get_languages
+* Fix: more robust way of detecting language in url when using directory
+* Fix: delete translations terms orphans in database
+* Fix: inconsistent behavior when setting page on front from customizer
+* Fix: deleting a category assigns posts to wrong default category
+* Fix: quick edit breaks synchronization
+* Fix: some security issues
+
+= 1.4.5 (2014-04-19) =
+
+* Fix: Notice when combined with WPSEO 1.5+
+* Fix: Impossible to disable a widget language filter once set (introduced in 1.4.4)
+* Fix: Unexpected redirection of the homepage with language code when permalink structure has no trailing slash (introduced in 1.4.4)
+* Fix: Some installs lead to wrong redirection when using domains (introduced in 1.4.4)
+* Fix: Possible infinite redirection while previewing posts (introduced in 1.4.4)
+* Fix: Uploaded medias don't get a language since WP 3.9
+* Fix: Compatibility with Twenty Fourteen Ephemera widget in the version shipped with WP 3.9
+
+= 1.4.4 (2014-04-09) =
+
+* Add: Compatibility with widgets customizer introduced in WP 3.9
+* Fix: No post in translation dropdown after switching the language in edit post (introduced in 1.4.3)
+* Fix: No canonical redirection when there is no language code in url and the language code is not hidden for the default language
+* Fix: Suppress language cookie when using multiple domains
+
+= 1.4.3 (2014-03-22) =
+
+* Add: Serbian translation contributed by Sinisa
+* Add: Myanmar translation contributed by Sithu Thwin
+* Fix: comment form redirects to wp-admin when using multiple domains or subdomains.
+* Fix: fatal error with old versions of PHP (tested on PHP 5.2.4)
+* Fix: Bad gateway experienced by users hosted by wpengine.com
+* Fix: links got from tiny MCE link button are filtered with admin language filter instead of current post language
+* Fix: possibly wrong redirection in check_language_code_in_url when using multiple domains or subdomains
+
+= 1.4.2 (2014-02-24) =
+
+* Add: check multiple post types in PLL_Model::count_posts
+* Fix: error 404 on category links when setting the language by content (introduced in 1.4.1)
+* Fix: PHP notices in frontend-nav-menu.php with Artisteer themes
+* Fix: decrease the memory usage of untranslated posts list
+* Fix: home page not correctly redirected to canonical when using page on front and page name is kept in url
+
+= 1.4.1 (2014-02-16) =
+
+* Add: Czech translation contributed by [Přemysl Karbula](http://www.premyslkarbula.cz)
+* Fix: the displayed language is not correct in quick edit for categories and post tags
+* Fix: the language switcher does not display the correct link for translated parent categories if only children have posts
+* Fix: 3rd parameter of icl_object_id is not optional
+* Fix: issue when combining multiple domains and browser detection -> the combination is now forbidden
+* Fix: conflict Shiba Media Library: link between media translations is lost when using media quick edit
+* Fix: notice when using taxonomies in wpml-config.xml
+* Fix: incorrect post format link
+* Fix: Twenty Fourteen Ephemera widget strings are not translated
+
+= 1.4 (2014-01-22) =
+
+* Add Traditional Chinese translation contributed by [香腸](http://sofree.cc/)
+* Minimum WordPress version is now v3.5
+* Refresh translations metaboxes: now translated posts are chosen in a dropdown list
+* Check if translated archives for category, tag and post format are empty before displaying the language switcher
+* Add specific management of translated featured tag in Twenty Fourteen
+* Add the possibility not to cache homepage urls with option PLL_CACHE_HOME_URL (for users having several domains).
+* The function get_pages is now filtered by language
+* Ajax requests on frontend are now automatically detected. It is no more necessary to set 'pll_load_front' :)
+* Various performance improvements
+* 'pll_get_post_types' and 'pll_get_taxonomies' filters must be added *before* 'after_setup_theme' is fired
+* Pre 1.2 data will be removed from DB at first upgrade at least 60 days after upgrade to 1.4
+* Removed some duplicate code between admin and frontend
+* Bug correction: incorrect pagination when using domains or subdomains
+* Bug correction: post format link not translated
+* Bug correction: impossible to use child terms with same name in hierarchical taxonomies
+* Bug correction: the terms list table is filtered according to new translation language instead of admin language filter
+
+= 1.3.1 (2013-12-13) =
+
+* Bug correction: fatal error on settings page if a static front page without language is set
+* Bug correction: wrong home url when using different domains per language
+
+= 1.3 (2013-12-11) =
+
+* Refresh admin UI for better look in WP 3.8 and more dynamic comportment
+* The "Detect browser language" option does now also controls returning visits (based on cookie).
+* Improved performance by optimizing some queries for WP 3.5+
+* The user biography in default language is now stored in default WordPress usermeta
+* Add language parameter in API function pll_home_url and allow to call it on admin side
+* Calling 'get_terms' with the 'lang' parameter now uses a cache object per language
+* Bug correction: conflict with unstranslated taxonomies
+* Bug correction: possible malformed translation archive url in language switcher
+* Bug correction: a wrong language may be displayed in quick edit dropdown
+* Bug correction: it is possible to add multiple translations (in the same language) for a single taxonomy term
+* Bug correction: non public post types and taxonomies are visible in Polylang settings
+* Bug correction: the language is always chosen from cookie (or browser preferences) in some installations
+* Bug correction: Firefox language preference is not recognized when comparison is made on locale (instead of ISO 639-1 language code)
+* Bug correction: incorrect tax_query in PLL_Auto_Translate
+
+= 1.2.4 (2013-11-28) =
+
+* Better support for theme customizer
+* Bug correction: admin bar search does not filter by language
+* Bug correction: possible conflict on secondary query when querying taxonomies or single page
+* Bug correction: post type is not included in url when editing or adding a term translation
+* Bug correction: various warnings and PHP notices
+
+= 1.2.3 (2013-11-17) =
+
+* Avoid fatal error when upgrading with Nextgen Gallery active
+* Bug correction: menus locations of non default language are lost at theme deactivation
+* Bug correction: impossible to set menus locations of non default language in some specific cases
+* Bug correction: bbpress admin is broken
+
+= 1.2.2 (2013-11-14) =
+
+* Updated Polish translation thanks to [Bartosz](http://www.dfactory.eu/)
+* Delay strings translations upgrade from 'wp_loaded' to 'admin_init' to avoid fatal error when wp-ecommerce is active
+* Remove Jetpack infinite scroll compatibility code as it seems useless with new Polylang 1.2 code structure
+* Bug correction: fatal error when doing ajax on frontend
+* Bug correction: ICL_LANGUAGE_CODE incorrectly defined when doing ajax on frontend
+* Bug correction: ['current_lang'] and ['no-translation'] indexes disappeared from pll_the_languages raw output
+* Bug correction: invalid argument supplied for foreach() in /polylang/include/mo.php on line 57
+* Bug correction: cookie may not be correctly set
+* Bug correction: languages columns may not be displayed in custom post types and custom taxonomies tables
+
+= 1.2.1 (2013-11-11) =
+
+* Update badly encoded Latvian translation
+* Suppress one query in PLL_WPML_Config when not in multisite
+* Bug correction: strings translations are not correctly upgraded
+* Bug correction: nav menus locations are not correctly upgraded for non default language
+
+= 1.2 (2013-11-10) =
+
+This version does include important changes in database. More than ever, make a database backup before upgrading
+
+* Add Arabic translation contributed by [Anas Sulaiman](http://ahs.pw/)
+* Major rewrite with new structure
+* Change the language and translations model from meta to taxonomy (no extra termmeta table created anymore)
+* Move the strings translations from option to a custom post type
+* Add support for language code in subdomain and for one different domain per language (experimental)
+* Add support of WordPress Importer plugin. Export must have been done with Polylang 1.2+ (experimental)
+* Add support for theme navigation customizer (was de-activated by Polylang since WP 3.4)
+* Request confirmation for deleting a language
+* Better management of default category for each language
+* Now check if date and post type archives are translated before displaying the language switcher
+* Update management of the 'copy' action of the custom fields section in wpml-config.xml
+* Add support for ICL_LANGUAGE_CODE and ICL_LANGUAGE_NAME of the WPML API on admin side
+* Add support of WPSEO custom strings translations when the language is set from content
+* Modify admin language filter for valid html and better visibility
+* Synchronization is now disabled by default (due to too much conflicts / questions on the forum)
+* Include rel="alternate" hreflang="x" selflink per google recommendation
+* Improve inline documentation
+* Bug correction: wrong datatype for second argument in polylang/include/auto-translate.php (introduced in 1.1.6)
+* Bug correction: same id is used for all language items in menu
+* Bug correction: wpml-config.xml file not loaded for sitewide active plugins on network installations
+* Bug correction: page parent dropdown list (in page attributes metabox) not correctly displayed when switching from a language with empty list
+
+= 1.1.6 (2013-10-13) =
+
+* Add the possibility to display the upgrade notice on plugins page
+* Bug correction: Illegal string offset 'taxonomy' in polylang/include/auto-translate.php
+* Bug correction: user defined strings translations are not loaded on admin side
+* Bug correction: untranslated post types are auto translated
+* Bug correction: tags are not added to post when the name exists in several languages and they are not translations of each other
+
+= 1.1.5 (2013-09-15) =
+
+* Add compatibility with Aqua Resizer (often used in porfolio themes)
+* Add support of 'icl_get_default_language' function from the WPML API
+* Remove the 3 characters limitation for the language code
+* Change default names for zh_CN, zh_HK, zh_TW
+* Bug correction: urls are modified in search forms
+
+= 1.1.4 (2013-08-16) =
+
+* Add simplified Chinese language contributed by [Changmeng Hu](http://www.wpdaxue.com)
+* Add Indonesian language contributed by [ajoull](http://www.ajoull.com/)
+* Bug correction: nav menu locations are lost when using the admin language filter
+* Bug correction: the cookie is not set when adding the language code to all urls (introduced in 1.1.3)
+
+= 1.1.3 (2013-07-21) =
+
+* Add Venetian language contributed by Michele Brunelli
+* Bug correction: wrong rewrite rules for non translated custom post type archives
+* Bug correction: 'post_id' parameter of pll_the_languages does not work
+* Bug correction: warning in wp_nav_menu_objects with Artisteer generated themes
+* Bug correction: warning when used together with theme my login plugin
+* Bug correction: language slug is modified and translations are lost when creating a nav menu with the same name as a language
+
+= 1.1.2 (2013-06-18) =
+
+* Posts and terms now inherit parent's language if created outside the standard WordPress ui
+* Improve the compatibility with the plugins Types and The Events Calendar, and again with WordPress SEO
+* Improve performance
+* Improve html validation
+* Add 'raw' argument to 'pll_the_languages'
+* Add the filter 'pll_translation_url'
+* Bug correction: no language is set for a (translated custom taxonomy) term when added from a (non translated) custom post type edit page
+* Bug correction: warning if 'get_terms' is called with a non-array 'include' argument (introduced in 1.1.1)
+* Bug correction: warning if the menu language switcher has nothing to display
+
+= 1.1.1 (2013-05-20) =
+
+* Move nav menu language switcher split from 'wp_nav_menu_objects' to 'wp_get_nav_menu_items' filter
+* Add the filter 'pll_redirect_home'
+* Automatically translate ids in 'include' argument of 'get_terms' (useful for the menus in the Suffusion theme)
+* Add compatibility with Jetpack infinite scroll
+* Bug correction: rtl text direction not set when adding the language code to all urls (introduced in 1.1)
+* Bug correction: hide again navigation panel in theme customizer as it still doesn't work
+* Bug correction: is_home not set on translated page when searching an empty string
+* Bug correction: fatal error when creating a post or term from frontend (introduced in 1.1)
+* Bug correction: attachments may load a wrong language when media translation was enabled then disabled
+* Bug correction: warning when querying posts before the action 'wp_loaded' has been fired (in auto-translate.php)
+* Bug correction: potential issue if other plugins use the filter 'get_nav_menu'
+* Bug correction: interference between language inline edit and search in admin list tables
+* Bug correction: auto-translate breaks queries tax_query when the 'field' is set to 'id'
+* Bug correction: search is not filtered by language for default permalinks (introduced in 1.1)
+* Tests done with WP 3.6 beta 3 and Twenty thirteen
+
+= 1.1 (2013-05-10) =
+
+* When adding the language to all urls, the language is now defined in (plugins_loaded, 1) for better compatibility with some plugins (WordPress SEO)
+* When querying posts and terms, ids are now automatically translated
+* Add the possibility to group string translations
+* Add the possibility to delete strings registered with 'icl_register_string'
+* Move the option 'polylang_widgets' in general polylang options
+* Better integration of the multilingual nav menus (everything is now integrated in the menus page of WordPress
+* The language switcher is now a menu item which can be placed everywhere in a nav menu
+* Posts or terms created from frontend are now assigned the current language (or another one if specified in the variable 'lang')
+* Bug correction: continents-cities-xx_XX.mo not downloaded
+* Bug correction: a gzipped 404 page is downloaded when a mo file does not exist on WordPress languages files repository
+* Bug correction: post_date_gmt not synchronized together with post_date
+* Tests done with WP 3.6 beta 2 and Twenty thirteen
+
+= 1.0.4 (2013-04-08) =
+
+* Add Estonian translation contributed by [Ahto Naris](http://profiles.wordpress.org/ahtonaris/)
+* Now compatible with languages files stored in wp-content/languages/themes
+* Bug correction: page preview does not work when adding the language code to all urls
+* Bug correction: error when a post type or taxonomy label is not a string
+* Bug correction: admin text section of wpml-config.xml (introduced in 1.0.3)
+* Bug correction: infinite redirect loop when querying an unattached media and the language code is added to all urls
+* Bug correction: the text direction is not set from Polylang options when the language code is added to all urls
+* Bug correction: get_adjacent_post is filtered by language even for post types without language
+* Bug correction: the home url is not not in the correct language in wp-login.php
+* Bug correction: the language is not correctly set when using date and name permalinks (introduced in 1.0.3)
+
+= 1.0.3 (2013-03-17) =
+
+* Add Catalan translation contributed by [Núria Martínez Berenguer](http://nuriamb.capa.webfactional.com)
+* Add Ukrainian translation contributed by [cmd soft](http://www.cmd-soft.com/)
+* Improve compatibility with WordPress SEO (sitemap for categories and tags)
+* A query is no more filtered by language when setting the parameter 'lang' to an empty value
+* Add the possibility to create a custom wpml-config.xml file in wp-content/polylang/
+* Bug correction: custom menus are not displayed on search page (introduced in 1.0.2)
+* Bug correction: sql error when filtering terms by language (introduced in 1.0.2)
+* Bug correction: SSL doesn't work properly
+* Bug correction: php notice on IIS servers
+* Bug correction: clicking on the radio buttons in the admin language switcher does not work in Chrome
+* Bug correction: on multisite, the signup page is redirected to the home page
+* Bug correction: date archives are not correctly filtered for the default language when hiding the language code and using date and name permalinks
+* Bug correction: only one wpml-config.xml file is parsed
+
+= 1.0.2 (2013-02-26) =
+
+* Add the possibility to query comments by language
+* Add the possibility not to set a cookie by defining PLL_COOKIE to false (Polylang may not work as expected on some pages)
+* Now a returning visitor is redirected to its preferred language when visiting the front page in the default language
+* Add compatibility with the plugin Custom field template (copy and synchronize custom fields)
+* Improve compatibility with plugins or themes which overwrite columns in posts list table
+* Add the filter 'pll_get_flag'
+* Add support of 'icl_unregister_string' function from the WPML API
+* Bug correction: synchronizing custom fields breaks the plugin Advanced Custom Fields
+* Bug correction: 'pll_default_language' broken
+* Bug correction: rewrite rules are not flushed when re-activating the plugin
+* Bug correction: feed urls are not correctly escaped when using default permalinks
+* Bug correction: notice Undefined index: media_support
+* Bug correction: custom post types and taxonomies set in wpml-config.xml are not hidden
+* Bug correction: get_terms cannot query multiple languages
+* Bug correction: 'icl_register_string' is now persistent as in WPML (fixes Nextgen gallery translations which were not working)
+
+= 1.0.1 (2013-01-28) =
+
+* Add Swedish translation contributed by [matsii](http://wordpress.org/support/profile/matsii)
+* Add 2 new API functions : 'pll_is_translated_post_type' and 'pll_is_translated_taxonomy'
+* Bug correction: when using a static front page, the posts page is not filtered by language (introduced in 1.0)
+* Bug correction: disable translation for hard coded menu as it creates more problems than it solves (introduced in 1.0)
+
+= 1.0 (2013-01-24) =
+
+* Add Hungarian translation contributed by Csaba Erdei
+* Add Norwegian translation contributed by [Tom Boersma](http://www.oransje.com/)
+* Add Slovak translation contributed by [Branco (WebHostingGeeks.com)](http://webhostinggeeks.com/user-reviews/)
+* Code cleaning -> remove compatibility with versions older than 0.8
+* Add search in the string translations list table
+* Add options to better control the synchronization of various metas for posts
+* It is now possible to synchronize sticky posts and publication dates
+* Add option to disable the multilingual support of media
+* Add options to better control the multilingual capability of custom post types and taxonomies
+* Better integration with new media management in WP 3.5
+* Improve menu translation for themes which register a theme location but don't use it in wp_nav_menu (hard coded menu)
+* Add the pll_preferred_language filter allowing plugins to modify the language set by browser preferences detection
+* Add support of the WPML config file
+* Add support of 'icl_get_languages' and 'icl_link_to_element' functions from the WPML API
+* Add compatibility with YARPP and improve compatibility with WordPress SEO
+* Change cookie name which conflicts with Quick cache and allow users to overwrite it by defining the constant PLL_COOKIE
+* Bug correction: again the canonical redirection
+* Bug correction: the languages are not correctly displayed after they have been modified using quick edit
+* Bug correction: undefined index notice when saving strings translation when the admin language filter is active
+* Bug correction: rewrite rules are not correctly flushed when adding / deleting a language (introduced in 0.9.2)
+* Bug correction: the list of pages is displayed when a static font page translation is not translated (now replaced by the list of posts)
+* Bug correction: permalinks are not modified when doing cron and the language code is added to all urls
+* Bug correction: creating a new term with the same name as a language may modify the language code (slug)
+
+= 0.9.8 (2012-12-05) =
+
+* Bug correction: ajax on frontend does not work when adding the language code to all urls
+* Bug correction: search forms using the get_search_form filter do not work
+
+= 0.9.7 (2012-12-04) =
+
+* Bug correction: the admin language filter does filter non translatable post types
+* Bug correction: again the canonical redirection
+* Bug correction: fatal error when Polylang is used together with 'Author Avatars List'
+* Bug correction: widget titles uselessly appear in the strings translations table when the widget is set for only one language
+* Tests done with WordPress 3.5 RC3 and Twenty Twelve
+
+= 0.9.6 (2012-11-26) =
+
+* It is now possible to query the terms by language using the WordPress function 'get_terms'
+* Bug correction: search for empty string in default language displays posts in all languages when hiding the URL language information for default language
+* Bug correction: completely reworked the canonical redirection introduced in 0.9.5 which created more problems than it solved
+* Bug correction: ajax for media translations does not work
+* Started tests with WordPress 3.5 RC1 and Twenty Twelve
+
+= 0.9.5 (2012-11-13) =
+
+* The user can now choose the number of languages and strings translations to display
+* Add compatibility with the 'icl_object_id' function and ICL_LANGUAGE_CODE and ICL_LANGUAGE_NAME constants from the WPML API
+* Add 17 languages to the predefined list (automatic download and update of language files won't work)
+* Bug correction: post preview does not work when adding the language code to all urls
+* Bug correction: redirect to front page in default language when posting a comment on static front page
+* Bug correction: impossible to create terms with the same name in different languages
+* Bug correction: query string added by other plugins is erased when adding the language code to all urls
+* Bug correction: redirect erase 'POST' variables on homepage when adding the language code to all urls
+* Bug correction: English (en_US) loads rtl style when using a localized WordPress package with an rtl language
+* Bug correction: on some installation strings translations do not work with some special characters
+* Bug correction: incoming links are not redirected to canonical url when adding the language code to all urls and hiding the code for the default language
+* Bug correction: search form does not work in non default language when using permalinks without trailing slash
+
+= 0.9.4 (2012-10-23) =
+
+* Add Afrikaans translation contributed by [Kobus Joubert](http://translate3d.com/)
+* Add Belarusian translation contributed by [Alexander Markevitch](http://fourfeathers.by/)
+* Add Afrikaans (af) and Belarusian (be_BY) to predefined languages list (automatic download and update of language files won't work)
+* Add the possibility to translate the date format and time format
+* Add compatibility with the 'icl_get_home_url' function from the WPML API
+* Bug correction: still some issues with string translations
+* Bug correction: search is not filtered by the (default) language when the language is set by content and the language code is hidden for the default language
+* Bug correction: posts & pages preview urls are broken when adding the language code to all urls
+* Bug correction: automatically added new top-level pages to menus are not filtered by language
+* Bug correction: the admin language filter messes the categories languages when editing a post and the parent dropdown list when editing a category
+* Bug correction: search form does not work when using a static front page (introduced in 0.9.2)
+* Bug correction: can't set languages for categories and post tags on blogs created after polylang has been activated at network level
+* Bug correction: menus don't work with catch box theme ('has_nav_menu' not correctly filtered)
+
+= 0.9.3 (2012-10-08) =
+
+* Add Bulgarian translation contributed by [pavelsof](http://wordpress.org/support/profile/pavelsof)
+* Add compatibility with WPML API for strings translations
+* Bug correction: dates are not translated (introduced in 0.9.2)
+* Bug correction: the language is lost when keeping - No change - for language in bulk edit
+* Bug correction: categories and tags are duplicate (when default language is set automatically to existing content and categories and tags share the same name)
+
+= 0.9.2 (2012-09-30) =
+
+* Support new WordPress (WP 3.5+) convention for js and css files naming
+* Improve performance, mainly on frontend
+* Bug correction: the category language is not set when creating it in the post editor (introduced in 0.9)
+* Bug correction: unable to add a query string when using a static front page
+* Bug correction: ajax tag suggestion in "edit post" conflicts with the admin content language filter
+* Bug correction: ugly notices when trying to access a static front page which has not been translated
+* Bug correction: the language code is added to custom post types and taxonomies permalinks even if they are not translatable
+* Bug correction: some arrays in wp_locale mix English and other language
+* Bug correction: the media language is not correctly set when uploading from post if the post has not been saved after choosing the language
+
+= 0.9.1 (2012-09-20) =
+
+* Add Finnish translation contributed by [Jani Alha](http://www.wysiwyg.fi)
+* Bug correction: improve the robustness of the admin content language filter
+* Bug correction: the language switcher displays languages which have no posts or pages (introduced in 0.9)
+* Bug correction: wrong default language when adding a new media
+* Bug correction: the dropdown language switcher does not switch language when there is no post translation
+* Bug correction: issue with translations when using category quick edit
+* Bug correction: home redirects to 404 when combining static front page + force_lang = 1 + hide_default = 0
+
+= 0.9 (2012-09-12) =
+
+* Add Turkish translation contributed by [darchws](http://darch.ws/)
+* Add media translation support
+* Add a persistent content language filter on admin side (WP 3.2+ required)
+* Add biographical info translation
+* Add multiline support for string translations
+* Add the possibility to clean the strings translation database
+* Add quick edit and bulk edit support for posts and pages
+* Add quick edit support for categories and tags
+* The language is now loaded with 'setup_theme' action instead of 'wp' action when always adding language information url
+* Search form now does use javascript only for searchform.php when pretty permalinks are not used
+* Add the option PLL_SEARCH_FORM_JS to disable the js code used to modify the search form
+* Suppress the option PLL_SYNC, replaced by an option in the language settings ui
+* Suppress the PLL_DISPLAY_ALL option
+* Suppress the template tag 'the_languages' (replaced by 'pll_the_languages' since v0.5)
+* Suppress the function 'pll_is_front_page' (useless since 0.8.2)
+* Bug correction: the browser language is sometimes not correctly detected by Android
+* Bug correction: the rtl text direction is not correct when editing an existing language
+* Bug correction: rss feed does not work if translated site title or tagline contains special characters
+* Bug correction: post types and taxonomies labels are not translated on frontend
+* Bug correction: the filter 'pll_copy_post_metas' does not work for metas with multiple values
+* Bug correction: translations table for post and terms are uselessly serialized two times
+* Bug correction: attempt to suppress conflict with themes which hardcode the name of nav menus (but do define a theme location)
+* Bug correction: homepage displays all posts when the front page displays a static page and no page is selected for front page (but one is selected for posts page)
+* Bug correction: widgets disappear when Polylang is enabled
+
+= 0.8.10 (2012-08-06) =
+
+* Add Lithuanian (lt_LT) to predefined languages list (automatic download and update of language files won't work)
+* Add Lithuanian translation contributed by [Naglis Jonaitis](http://najo.lt/)
+* Bug correction: empty string translation issue
+* Bug correction: 'wp_list_pages' does not filter custom post types
+* Bug correction: warning if posts are queried before the action 'wp_loaded' has been fired
+* Bug correction: notice in twentyten when requesting a date archive with no posts
+
+= 0.8.9 (2012-07-20) =
+
+* Add Portuguese translation contributed by [Vitor Carvalho](http://vcarvalho.com/)
+
+= 0.8.8 (2012-07-18) =
+
+* Validation improvement thanks to kg69design
+* Bug correction: custom post types rewrite rules are broken when registered with query_var=>false
+* Bug correction: user admin language not deleted when uninstalling the plugin
+* Bug correction: pll_current_language('name') returns locale instead of language name
+* Bug correction: ajax on frontend does not work
+* Bug correction: homepage pagination broken when redirecting the language page to a static front page
+* Bug correction: taxonomies conflicts on custom post types
+* Bug correction: the admin language is not updated when edited by other users
+
+= 0.8.7 (2012-06-10) =
+
+* Add the possibility to load Polylang API for ajax requests on frontend
+* Bug correction: search form is broken when using a static front page
+* Bug correction: admin bar search does not work
+* Tests done with WordPress 3.4 RC2
+
+= 0.8.6 (2012-05-23) =
+
+* Add the possibility to use a local config file to set options
+* Improve robustness (less PHP notices)
+* Bug correction: Menus not showing in preview mode
+* Bug correction: fatal error when customizing a theme in WP 3.4 beta 4
+* Bug correction: second page of search results returns 404 when using pretty permalinks
+
+= 0.8.5 (2012-05-14) =
+
+* Bug correction : sites using static front page are messed in v0.8.4
+
+= 0.8.4 (2012-05-13) =
+
+* Add a new argument 'post_id' to the function pll_the_languages to display posts translations within the loop
+* Bug correction: every posts in every languages are shown on the homepage when requesting the wrong one with or without 'www.'
+* Bug correction: every posts in every languages are shown when requesting /?p=string
+* Bug correction: the language is not correctly set for wp-signup.php and wp-activate.php
+* Bug correction: wrong home links when using permalinks with front with WP 3.3 and older
+* Bug correction: wrong redirection after posting a comment when adding the language information to all urls
+* Bug correction: term language may be lost in some situations
+* Bug correction: post language is set to default if updated outside the edit post page
+* Bug correction: javascript error in WP 3.1
+* Bug correction: can't toggle visibility of tags metabox in edit post panel
+* Tests done with WordPress 3.4 beta 4
+
+= 0.8.3 (2012-04-10) =
+
+* Add Danish translation contributed by [Compute](http://wordpress.org/support/profile/compute)
+* Add Spanish translation contributed by Curro
+* Add the possibility to add a content in a different language than the current one by setting explicitly the lang parameter in the secondary query
+* Add support of PATHINFO permalinks
+* Bug correction: secondary queries not correctly filtered by language
+* Bug correction: wrong archives links when using permalinks with front
+* Bug correction: wrong homepage link when keeping 'language' in permalinks with front
+* Bug correction: flush_rewrite_rules notice when setting up a static front page (introduced in 0.8.2)
+* Bug correction: every posts in every languages are shown when hitting the homepage with a query string unknown to WP (thanks to Gonçalo Peres)
+* Bug correction: every posts in every languages are shown on the homepage when PHP adds index.php to the url
+* Tests done with WordPress 3.4 beta 1
+
+
+= 0.8.2 (2012-03-20) =
+
+* Add Italian translation contributed by [Luca Barbetti](http://wordpress.org/support/profile/lucabarbetti)
+* Improve performance on admin side
+* Comment status and ping status are now copied when adding a new translation
+* Deprecated API function 'pll_is_front_page' as it is now useless
+* Bug correction: Wrong translation url for taxonomies when adding the language information to all urls
+* Bug correction: "translation" of search page does not work if the site is only made of pages
+* Bug correction: wrong language permalink structure introduced in 0.8.1
+* Bug correction: wrong language set when clicking on "add new" translation in edit category and edit tags panels
+* Bug correction: site does not display if no languages are set
+* Bug correction: get_author_posts_url is 404
+* Bug correction: homepage is 404 when using a static front page and adding the language information to all urls
+
+= 0.8.1 (2012-03-11) =
+
+* Add Latvian translation contributed by [@AndyDeGroo](http://twitter.com/AndyDeGroo)
+* It is now possible to synchronize multiple values for custom fields
+* Add new API function pll_current_language
+* Add the pll_rewrite_rules filter allowing plugins to filter rewrite rules by language
+* WP 3.4 preparation: disable the menu section in the customize theme admin panel (unusable with Polylang)
+* Bug correction: removing 'language' in permalinks does not work in WP 3.4 alpha
+* Bug correction: problems with custom post type archives when 'has_archive' is set (thanks to AndyDeGroo)
+* Bug correction: 404 error when combining %postname% permastructure with "Add language information to all URL" option
+* Bug correction: translated custom strings are duplicated if registered several times
+* Bug correction: queries with an array of post types are not correctly filtered
+* Bug correction: wp-login.php always in English
+
+= 0.8 (2012-02-29) =
+
+* Sticky posts are now filtered by language
+* It is now possible to use the language page as home page
+* Add an "About Polylang" metabox on the languages admin page
+* Add the pll_the_languages filter allowing to filter the whole output of the language switcher
+* Add a new argument 'display_names_as' to the function pll_the_languages
+* Add pll_get_post_types & pll_get_taxonomies filters allowing to enable / disable the language filter for post types & taxonomies
+* Add ckb to predefined languages list
+* Completely reworked the string translation storage in the database
+* Some performance improvements on admin side
+* Improve compatibility with other plugins broken by the home url filter
+* Add an option to disable the home url filter
+* Add an option to disable synchronization of metas between translations
+* Bug correction: body class 'home' is not set on translated homepage
+* Bug correction: robots.txt is broken when adding the language code to all urls (including default language)
+* Bug correction: bad name for the Czech flag
+* Bug correction: bad language information in rss feed for WP < 3.4
+* Bug correction: signup broken on multisite
+* Bug correction: the translation url is set to self when using a static front page and no page for posts and there is no translation
+* Bug correction: problems with custom post type archive titles
+* Bug correction: problems with custom post type if rewrite slug is different from post_type (thanks to AndyDeGroo)
+* Bug correction: quick edit still breaks translation linking of pages (thanks to AndyDeGroo)
+* Bug correction: bad rewrite rules for feeds (introduced in 0.7.2)
+* Bug correction: the order is not saved when creating a language
+* Bug correction: the categories list is not updated when adding a new category (ajax broken)
+
+= 0.7.2 (2012-02-15) =
+
+* Add Polish translation contributed by [Peter Paciorkiewicz](http://www.paciorkiewicz.pl)
+* Add 5 new languages to predefined list
+* completely reworked rewrite rules
+* WP 3.4 preparation: add new WordPress languages files to download when creating a new language
+* Bug correction: custom nav menus do not work in Artisteer generated themes
+* Bug correction: having a single language causes multiple warnings while saving post/page.
+* Bug correction: custom nav menu broken on archives pages
+* Bug correction: the language switcher does not link to translated post type archive when using pretty permalinks
+* Bug correction: the tags are not saved in the right language when translated tags have the same name
+* Bug correction: bad link in post preview when adding language code to all urls
+* Bug correction: feed not filtered by language when adding language code to all urls
+* Bug correction: duplicate canonical link when used together with WordPress SEO by Yoast
+* Bug correction: the all posts admin page is messed if another plugin adds a column
+* Bug correction: 404 error on static front page when adding language code to all urls (including default language)
+
+= 0.7.1 (2012-02-06) =
+
+* Allow using 3 characters languages codes (ISO 639-2 or 639-3)
+* The predefined languages dropdown list now displays the locale to help differentiate some languages
+* Add 5 new languages to predefined list
+* Bug correction: the filter 'pll_copy_post_metas' does not work
+* Bug correction: impossible to add a tag in the edit post panel
+* Bug correction: rewrite rules not correct
+* Bug correction: cache issue with css and js files
+
+= 0.7 (2012-01-30) =
+
+* Add Hebrew translation contributed by [ArielK](http://www.arielk.net)
+* Add support for RTL languages for both frontend and admin
+* Twenty Ten and Twenty Eleven languages files are now automatically downloaded when creating a new language
+* Improve filtering tags by language in the edit post panel
+* Category parent dropdown list is now filtered by language
+* Category parents are now synchronized between translations
+* Add the possibility to have the language information in all URL
+* Add support for post formats
+* Add option allowing not to show the current language in the language switcher (for both menu and widget)
+* Add a title attribute (and the possibility to personalize it with a filter) to flags
+* pll_get_post and pll_get_term second parameter is now optional and defaults to current language
+* Add pll_the_language_link filter allowing to filter translation links outputted by the language switcher
+* The option PLL_DISPLAY_ALL is no longer supported
+* Bug correction: Autosave reset to default language
+* Bug correction: blog info not translated in feeds
+* Bug correction: post comments feed always in default language
+* Bug correction: undefined index notice when setting up a custom menu widget
+* Bug correction: rewrite rules are not correctly reset when deactivating the plugin
+* Bug correction: is_home not correctly set on pages 2, 3...
+* Bug correction: avoid naming conflicts (in sql queries) with other themes / plugins
+* Bug correction: bad language detection and url rewriting of custom post types archives
+
+= 0.6.1 (2012-01-12) =
+
+* Add Dutch translation contributed by [AlbertGn](http://wordpress.org/support/profile/albertgn)
+* Disable everything except the languages management panel while no language has been created
+* Bug correction: can't have the same featured image in translated posts
+* Bug correction: parent page dropdown does appear only after the page has been saved
+* Bug correction: archives widget not working anymore
+* Bug correction: string translations does not work for WP < 3.3
+* Bug correction: fix fatal error in string translations caused by widgets using the old API
+* Bug correction: the strings translation panel is unable to translate strings with special characters
+* Bug correction: Polylang "is_front_page" returns true on archives pages
+
+= 0.6 (2012-01-07) =
+
+* Add Greek translation contributed by [theodotos](http://www.ubuntucy.org)
+* WordPress languages files are now automatically downloaded when creating a new language (and updated when updating WordPress)
+* Add the possibility to change the order of the languages in the language switcher
+* Add the possibility to translate the site title, tagline and widgets titles
+* Categories, post tags, featured image, page parent, page template and menu order are now copied when adding a new translation
+* Translations are now accessibles in the "Posts", "Pages", "Categories" and "Post tags" admin panels
+* Improve the dropdown language switcher widget (sends now to translated page or home page based on options)
+* Move custom flags from polylang/local_flags to wp_content/polylang
+* Add two options to "pll_the_languages" ('hide_if_no_translation' and 'hide_current'). *The function does not output ul tag anymore*
+* Improve API
+* Bug correction: Twenty eleven custom Header problem with v0.5.1
+* Bug correction: front-page.php not loaded for translated front page
+
+= 0.5.1 (2011-12-18) =
+
+* Improved German translation contributed by [Christian Ries](http://www.singbyfoot.lu)
+* Bug correction: translated homepage not recognized as home page when it displays posts
+* Bug correction: predefined language list does not work on IE8
+* Bug correction: on some installations, "Add New" post doesn't keep intended language
+* Bug correction: fatal error when Polylang is used together with the plugin Tabbed Widgets
+* Bug correction: language Switcher points sometimes to wrong places
+
+= 0.5 (2011-12-07) =
+
+* Add multisite support
+* Rework the Polylang admin panel. There is now a set of predefined languages
+* Improve categories and tags language filter in the edit post panel
+* Categories and tags created in the edit post panel are now created with the same language as the post
+* The language switcher can now force the link to the front page instead of the translated page
+* The nav menus can now display a language switcher
+* Improved performance
+* Optimized the calendar widget (less code and sql queries executed)
+* Added the possibility to display posts and terms with no language set (see the documentation to know how to enable this functionality)
+* Started the creation of a small API for theme and plugin programmers
+* Bug correction: when using a static front page, the page for posts does not work when using the default permalink settings
+* Bug correction: the search form does not work if a static front page is used
+* Bug correction: quick edit breaks translations
+* Bug correction: categories and post tags translations don't work for more than 2 languages
+* Bug correction: the output of wp_page_menu is not correct for non default languages
+
+= 0.4.4 (2011-11-28) =
+
+* Bug correction: When using a static front page, the translated home page displays posts instead of the translated page
+* Bug correction: Automatic language setting of existing categories and post tags does not work correctly
+
+= 0.4.3 (2011-11-19) =
+
+* Add Russian translation contributed by [yoyurec](http://yoyurec.in.ua)
+* Bug correction: impossible to suppress the language name in the language switcher widget settings
+* Bug correction: post's page does not work when using a static front page
+* Bug correction: flags in local_flags directory are removed after an automatic upgrade (now works for an upgrade from 0.4.3+ to a higher version)
+* Bug correction: switching to default language displays a 404 Error when hiding the default language in url and displaying the language switcher as dropdown
+* Other minor bug corrections
+* Tests done with WordPress 3.3 beta 3
+
+= 0.4.2 (2011-11-16) =
+
+* Bug correction: language settings page is broken in v0.4.1
+
+= 0.4.1 (2011-11-16) =
+
+* Bug correction: flags shows even when you set doesn't to show
+* Bug correction: custom taxonomies do not work
+* Bug correction: some users get the fatal error: call to undefined function wp_get_current_user() in /wp-includes/user.php on line 227
+
+= 0.4 (2011-11-10) =
+
+* Add a documentation (in English only)
+* Add the possibility to hide the url language information for the default language
+* Add the possibility to set the admin language in the user profile
+* Add the possibility to fill existing posts, pages, categories & tags with the default language
+* Add support for custom post types and custom taxonomies
+* Add the possibility to display flags in the language switcher
+* Add CSS classes to customize rendering of the language switcher
+* Add the possibility to display the language switcher as a dropdown list
+* Add support for calendar widget
+* Improve performance: less sql queries
+* Improve data validation when creating or updating languages
+* Bug correction: 'wp_list_pages' page order is ignored when the plugin is enabled
+* Bug correction: when using 'edit' or 'add new' (translation) for posts, the categories appear in the wrong language
+* Bug correction: pages are not included in language post count
+* Bug correction: the language switcher does not display languages if there are only pages
+* Bug correction: the widget filter does not allow to come back to 'all languages' once a language has been set
+* Other minor bug corrections
+
+= 0.3.2 (2011-10-20) =
+
+* Bug correction: authors pages are not filtered by language
+* Bug correction: language pages use the archive template
+* Bug correction: database error for comments on posts and pages
+* Bug correction: "Add new" translation for pages creates a post instead of a page
+* Bug correction: the search query does not look into pages
+
+= 0.3.1 (2011-10-16) =
+
+* Bug correction: the widget settings cannot be saved when activating Polylang
+* Bug correction: the archives widget does not display any links
+* Bug correction: ajax form for translations not working in the 'Categories' and 'Post tags' admin panels
+
+= 0.3 (2011-10-07) =
+
+* Add language filter for widgets
+* Improved performance for filtering pages by language
+* Improved security
+* Minor bug correction with versions management
+
+= 0.2 (2011-10-05) =
+
+* Add language filter for nav menus
+* Add German translation
+* Add language filter for recent comments
+* Add ajax to term edit form
+* Add ajax to post metabox
+* Improved performance for filtering terms by language
+* Bugs correction
+
+= 0.1 (2011-09-22) =
+* Initial release
diff --git a/wp-content/plugins/polylang-pro/css/build/admin-export-import.css b/wp-content/plugins/polylang-pro/css/build/admin-export-import.css
new file mode 100644
index 000000000..d9b7b67ba
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/admin-export-import.css
@@ -0,0 +1,55 @@
+/* Metaboxes holder in Strings translations screen */
+.languages_page_mlang_strings .metabox-holder > div {
+ display: flex;
+}
+.languages_page_mlang_strings .metabox-holder > div > div {
+ flex-grow: 1;
+}
+.languages_page_mlang_strings .metabox-holder > div > div:nth-child(2n) {
+ margin-left: 1rem;
+}
+.languages_page_mlang_strings .metabox-holder > div > div.closed {
+ border:0;
+ background: none;
+}
+.languages_page_mlang_strings .metabox-holder > div > div.closed .postbox-header{
+ border: 1px solid #ccd0d4;
+ background: #fff;
+}
+
+#pll-export-strings-box.postbox .submit, /* Override WordPress styles */
+#pll-import-translations-box.postbox .submit {
+ float: none;
+ padding: 0;
+}
+
+#export-string-translation .pll-translation-flag {
+ margin: auto 10px auto 7px;
+}
+
+#export-string-translation label,
+#export-string-translation label[for="pll-select-format"] span,
+#import-translation label {
+ display: block;
+ margin: 0.35em 0 0.5em;
+}
+
+.pll-legend {
+ display: block;
+ padding: 2px 0;
+ color: #1d2327;
+ font-weight: 400;
+ text-shadow: none;
+ margin: 0.35em 0 0.5em;
+}
+
+/* Narrow devices */
+@media screen and ( max-width: 782px ) {
+ /* Metaboxes holder in Strings translations screen */
+ .languages_page_mlang_strings .metabox-holder > div {
+ flex-direction: column;
+ }
+ .languages_page_mlang_strings .metabox-holder > div > div:nth-child(2n) {
+ margin-left: 0;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/admin-export-import.min.css b/wp-content/plugins/polylang-pro/css/build/admin-export-import.min.css
new file mode 100644
index 000000000..c7b7ca018
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/admin-export-import.min.css
@@ -0,0 +1 @@
+.languages_page_mlang_strings .metabox-holder>div{display:flex}.languages_page_mlang_strings .metabox-holder>div>div{flex-grow:1}.languages_page_mlang_strings .metabox-holder>div>div:nth-child(2n){margin-left:1rem}.languages_page_mlang_strings .metabox-holder>div>div.closed{background:none;border:0}.languages_page_mlang_strings .metabox-holder>div>div.closed .postbox-header{background:#fff;border:1px solid #ccd0d4}#pll-export-strings-box.postbox .submit,#pll-import-translations-box.postbox .submit{float:none;padding:0}#export-string-translation .pll-translation-flag{margin:auto 10px auto 7px}#export-string-translation label,#export-string-translation label[for=pll-select-format] span,#import-translation label,.pll-legend{display:block;margin:.35em 0 .5em}.pll-legend{color:#1d2327;font-weight:400;padding:2px 0;text-shadow:none}@media screen and (max-width:782px){.languages_page_mlang_strings .metabox-holder>div{flex-direction:column}.languages_page_mlang_strings .metabox-holder>div>div:nth-child(2n){margin-left:0}}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/admin.css b/wp-content/plugins/polylang-pro/css/build/admin.css
new file mode 100644
index 000000000..d71aad602
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/admin.css
@@ -0,0 +1,459 @@
+/* languages admin panel */
+#add-lang select {
+ width: 95%;
+}
+
+#add-lang label {
+ margin: 0.35em 0 0.5em;
+}
+
+.pll-legend {
+ display: block;
+ padding: 2px 0;
+ color: #1d2327;
+ font-weight: 400;
+ text-shadow: none;
+ margin: 0.35em 0 0.5em;
+}
+
+.column-locale,
+.languages .column-slug {
+ width : 15%
+}
+
+.column-default_lang {
+ width : 5%;
+}
+
+.column-term_group,
+.column-flag, .column-count {
+ width : 10%;
+}
+
+td.column-default_lang .icon-default-lang:before,
+.pll-wizard-content .icon-default-lang:before {
+ font-family: 'dashicons';
+ content: "\f155";
+}
+
+.pll-icon:before{
+ display: inline-block;
+ text-align: left;
+ width: 15px;
+}
+.pll-circle:before{
+ content: "\25cf";
+}
+
+/* about Polylang metabox */
+#pll-about-box p,
+#pll-recommended p {
+ text-align: justify;
+}
+
+#pll-about-box input {
+ margin: 0;
+ padding: 0;
+ float: right;
+}
+
+/* strings translation table */
+.stringstranslations .column-name,
+.stringstranslations .column-context {
+ width: 10%;
+}
+
+.stringstranslations .column-string {
+ width: 33%;
+}
+
+.translation label {
+ display: inline-block;
+ width: 23%;
+ vertical-align: top;
+}
+
+.translation {
+ display: flex; /* fix #691 to remove default margin bottom */
+}
+@media screen and (max-width: 782px) { /* reset default display property for small device */
+ .translation{
+ display: block;
+ }
+}
+.translation textarea{
+ display: block; /* fix #691 to remove default margin bottom */
+}
+.translation input,
+.translation textarea {
+ width: 72%;
+ box-sizing: border-box; /* to be sure field don't overrun outside their wrapper */
+ margin-bottom: 4px; /* fix #691 set the same margin bottom for both textarea and input tags */
+}
+
+/* settings */
+.pll-settings {
+ margin-top: 20px;
+}
+
+.pll-settings .plugin-title {
+ width: 25%;
+}
+
+#wpbody-content .pll-settings .pll-configure tr {
+ display: table-row;
+}
+
+#wpbody-content .pll-settings .pll-configure td {
+ display: table-cell;
+}
+
+#wpbody-content .pll-settings .pll-configure > td {
+ padding: 20px 20px 20px 40px;
+}
+
+.pll-configure legend {
+ font-size: 14px;
+ font-weight: 600;
+ margin-bottom: 0.5em;
+}
+
+.pll-configure td .description {
+ margin-top: 2px;
+ margin-bottom: 0.5em;
+}
+
+.pll-configure p.submit {
+ margin-top: 20px;
+}
+
+.pll-configure .button {
+ margin-right: 20px;
+}
+
+.pll-configure fieldset {
+ margin-bottom: 1.5em;
+}
+
+.pll-inline-block-list {
+ margin: 0;
+}
+
+.pll-inline-block-list li {
+ display: inline-block;
+ margin: 0;
+ width: 250px;
+}
+
+/* settings URL modifications */
+#pll-domains-table td {
+ padding: 2px 2px 2px 1.5em;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: none;
+}
+
+.pll-settings-url-col {
+ display: inline-block;
+ width: 49%;
+ vertical-align: top;
+}
+
+/* settings Activation keys */
+.pll-table-top td {
+ vertical-align: top;
+}
+
+#pll-licenses-table label {
+ font-size: 1em;
+ font-weight: 600;
+}
+
+.pll-configure .pll-deactivate-license {
+ margin: 0 0 0 20px;
+}
+
+/* language columns in edit.php and edit-tags.php */
+.wp-list-table th[class*='column-language_'],
+.wp-list-table td[class*='column-language_'] {
+ width: 1.5em;
+ box-sizing: content-box; /* Override ACF 5.9.0 styles */
+}
+
+/* Text direction in post.php and edit-tags.php */
+.pll-dir-rtl textarea,
+.pll-dir-rtl input[type="text"] {
+ direction: rtl;
+}
+
+.pll-dir-ltr textarea,
+.pll-dir-ltr input[type="text"] {
+ direction: ltr;
+}
+
+.pll-dir-ltr .tr_lang,
+.pll-dir-rtl .tr_lang {
+ direction: inherit;
+}
+
+/* languages metabox in post.php */
+#ml_box p {
+ margin-top: 1em;
+}
+
+#post-translations p {
+ float: left;
+ margin-top: 1em;
+}
+
+.rtl #post-translations p {
+ float: right;
+}
+
+#post-translations table {
+ table-layout: fixed;
+ width: 100%;
+ clear: both;
+}
+
+#post-translations a {
+ text-decoration: none;
+}
+
+#post-translations .pll-language-column,
+#post-translations .pll-column-icon {
+ width: 20px;
+}
+
+#post-translations .tr_lang {
+ width: 100%;
+}
+
+#post-translations td {
+ padding: 2px;
+}
+
+#post-translations .spinner,
+#term-translations .spinner {
+ float: none;
+ margin: 0;
+ background-position: center;
+ width: auto;
+}
+
+#select-post-language .pll-select-flag {
+ padding: 4px;
+ margin-right: 10px;
+}
+
+.rtl #select-post-language .pll-select-flag {
+ padding: 4px;
+ margin-right: 0px;
+ margin-left: 10px;
+}
+
+/* specific cases for media */
+#select-media-language .pll-select-flag {
+ padding: 4px;
+ margin-right: 10px;
+}
+
+.pll-media-edit-column {
+ float: right;
+}
+
+/* language and translations in edit-tags.php */
+.pll-translation-flag { /* also for media */
+ margin-right: 14px;
+}
+
+#select-add-term-language .pll-select-flag {
+ padding: 11px;
+ margin-right: 13px;
+}
+
+#select-edit-term-language .pll-select-flag {
+ padding: 11px;
+ margin-right: 4px;
+}
+
+#term-translations p {
+ /* same style as label */
+ font-weight: 400;
+ font-style: normal;
+ padding: 2px;
+ color: #23282d;
+}
+
+#add-term-translations,
+#edit-term-translations {
+ width: 95%;
+}
+
+#term-translations .pll-language-column {
+ line-height: 28px;
+ width: 20%;
+}
+
+#term-translations .pll-edit-column,
+#add-term-translations .pll-language-column {
+ width: 20px;
+}
+
+#edit-term-translations .pll-language-column {
+ padding: 15px 10px;
+ font-weight: normal;
+}
+
+/* icon fonts */
+.pll_icon_add:before {
+ content: "\f132";
+}
+
+.pll_icon_edit:before {
+ content: "\f464";
+}
+
+[class^="pll_icon_"] {
+ font: 20px/1 'dashicons';
+ vertical-align: middle;
+}
+
+/* admin bar */
+#wpadminbar #wp-admin-bar-languages .ab-item img {
+ margin: 0 8px 0 2px;
+}
+
+#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon {
+ float: none;
+ top: 4px;
+}
+
+#wpadminbar #wp-admin-bar-languages .ab-icon:before {
+ content: "\f326";
+ top: 1px;
+}
+
+#wp-admin-bar-languages.pll-filtered-languages {
+ background: #a03f3f;
+}
+
+#wpadminbar #wp-admin-bar-languages.pll-filtered-languages span.ab-label{ /* Enforce white color for WordPress admin light theme. */
+ color: #fff;
+}
+
+/* Notices */
+.pll-notice.notice {
+ padding-right: 38px;
+ position: relative;
+}
+
+.pll-notice a.notice-dismiss {
+ text-decoration: none;
+}
+
+.pll-notice .button {
+ margin-right: 10px;
+}
+
+@media screen and ( max-width: 782px ) {
+ /* settings */
+ #wpbody-content .pll-settings .pll-configure > td {
+ padding: 20px;
+ }
+
+ #wpbody-content .pll-settings #cb {
+ padding: 20px 9px;
+ }
+
+ /* settings URL modifications */
+ .pll-inline-block {
+ width: auto;
+ }
+
+ .pll-settings-url-col {
+ display: block;
+ width: 100%;
+ }
+
+ /* settings licenses */
+ #wpbody-content .pll-settings #pll-licenses-table td {
+ display: block;
+ }
+
+ .pll-configure .pll-deactivate-license {
+ margin: 10px 0 5px;
+ }
+
+ /* strings translations table */
+ .translation label {
+ display: block;
+ width: 95%;
+ padding-left: 0;
+ }
+
+ .translation input,
+ .translation textarea {
+ width: 95%;
+ }
+
+ /* hide selected language flag and translations language name */
+ #select-add-term-language .pll-select-flag,
+ #select-edit-term-language .pll-select-flag,
+ #edit-term-translations .pll-language-name {
+ display: none;
+ }
+
+ #edit-term-translations {
+ width: 100%;
+ }
+
+ #add-term-translations .pll-language-column {
+ line-height: 38px;
+ }
+
+ #edit-term-translations td {
+ padding: 8px 10px;
+ }
+
+ #edit-term-translations .pll-language-column,
+ #edit-term-translations .pll-edit-column {
+ width: 20px;
+ }
+
+ /* translations tables should be kept as table */
+ .term-translations .pll-language-column,
+ .term-translations .pll-edit-column,
+ .term-translations .pll-translation-column {
+ display: table-cell;
+ }
+
+ .term-translations .hidden {
+ display: none;
+ }
+
+ /* admin bar */
+ #wpadminbar #wp-admin-bar-languages {
+ display: block; /*shows our menu on mobile devices */
+ }
+
+ #wpadminbar #wp-admin-bar-languages > .ab-item {
+ width: 50px;
+ text-align: center;
+ }
+
+ #wpadminbar #wp-admin-bar-languages > .ab-item .ab-icon:before {
+ font: 32px/1 'dashicons';
+ top: -1px;
+ }
+
+ #wpadminbar #wp-admin-bar-languages > .ab-item img {
+ margin: 19px 0;
+ }
+
+ #wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon {
+ margin-right: 6px;
+ font-size: 20px !important;
+ line-height: 20px !important;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/admin.min.css b/wp-content/plugins/polylang-pro/css/build/admin.min.css
new file mode 100644
index 000000000..81a59eb50
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/admin.min.css
@@ -0,0 +1 @@
+#add-lang select{width:95%}#add-lang label,.pll-legend{margin:.35em 0 .5em}.pll-legend{color:#1d2327;display:block;font-weight:400;padding:2px 0;text-shadow:none}.column-locale,.languages .column-slug{width:15%}.column-default_lang{width:5%}.column-count,.column-flag,.column-term_group{width:10%}.pll-wizard-content .icon-default-lang:before,td.column-default_lang .icon-default-lang:before{content:"\f155";font-family:dashicons}.pll-icon:before{display:inline-block;text-align:left;width:15px}.pll-circle:before{content:"\25cf"}#pll-about-box p,#pll-recommended p{text-align:justify}#pll-about-box input{float:right;margin:0;padding:0}.stringstranslations .column-context,.stringstranslations .column-name{width:10%}.stringstranslations .column-string{width:33%}.translation label{display:inline-block;vertical-align:top;width:23%}.translation{display:flex}@media screen and (max-width:782px){.translation{display:block}}.translation textarea{display:block}.translation input,.translation textarea{box-sizing:border-box;margin-bottom:4px;width:72%}.pll-settings{margin-top:20px}.pll-settings .plugin-title{width:25%}#wpbody-content .pll-settings .pll-configure tr{display:table-row}#wpbody-content .pll-settings .pll-configure td{display:table-cell}#wpbody-content .pll-settings .pll-configure>td{padding:20px 20px 20px 40px}.pll-configure legend{font-size:14px;font-weight:600;margin-bottom:.5em}.pll-configure td .description{margin-bottom:.5em;margin-top:2px}.pll-configure p.submit{margin-top:20px}.pll-configure .button{margin-right:20px}.pll-configure fieldset{margin-bottom:1.5em}.pll-inline-block-list{margin:0}.pll-inline-block-list li{display:inline-block;margin:0;width:250px}#pll-domains-table td{border:none;-webkit-box-shadow:none;box-shadow:none;padding:2px 2px 2px 1.5em}.pll-settings-url-col{display:inline-block;vertical-align:top;width:49%}.pll-table-top td{vertical-align:top}#pll-licenses-table label{font-size:1em;font-weight:600}.pll-configure .pll-deactivate-license{margin:0 0 0 20px}.wp-list-table td[class*=column-language_],.wp-list-table th[class*=column-language_]{box-sizing:content-box;width:1.5em}.pll-dir-rtl input[type=text],.pll-dir-rtl textarea{direction:rtl}.pll-dir-ltr input[type=text],.pll-dir-ltr textarea{direction:ltr}.pll-dir-ltr .tr_lang,.pll-dir-rtl .tr_lang{direction:inherit}#ml_box p{margin-top:1em}#post-translations p{float:left;margin-top:1em}.rtl #post-translations p{float:right}#post-translations table{clear:both;table-layout:fixed;width:100%}#post-translations a{text-decoration:none}#post-translations .pll-column-icon,#post-translations .pll-language-column{width:20px}#post-translations .tr_lang{width:100%}#post-translations td{padding:2px}#post-translations .spinner,#term-translations .spinner{background-position:50%;float:none;margin:0;width:auto}#select-post-language .pll-select-flag{margin-right:10px;padding:4px}.rtl #select-post-language .pll-select-flag{margin-left:10px;margin-right:0;padding:4px}#select-media-language .pll-select-flag{margin-right:10px;padding:4px}.pll-media-edit-column{float:right}.pll-translation-flag{margin-right:14px}#select-add-term-language .pll-select-flag{margin-right:13px;padding:11px}#select-edit-term-language .pll-select-flag{margin-right:4px;padding:11px}#term-translations p{color:#23282d;font-style:normal;font-weight:400;padding:2px}#add-term-translations,#edit-term-translations{width:95%}#term-translations .pll-language-column{line-height:28px;width:20%}#add-term-translations .pll-language-column,#term-translations .pll-edit-column{width:20px}#edit-term-translations .pll-language-column{font-weight:400;padding:15px 10px}.pll_icon_add:before{content:"\f132"}.pll_icon_edit:before{content:"\f464"}[class^=pll_icon_]{font:20px/1 dashicons;vertical-align:middle}#wpadminbar #wp-admin-bar-languages .ab-item img{margin:0 8px 0 2px}#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon{float:none;top:4px}#wpadminbar #wp-admin-bar-languages .ab-icon:before{content:"\f326";top:1px}#wp-admin-bar-languages.pll-filtered-languages{background:#a03f3f}#wpadminbar #wp-admin-bar-languages.pll-filtered-languages span.ab-label{color:#fff}.pll-notice.notice{padding-right:38px;position:relative}.pll-notice a.notice-dismiss{text-decoration:none}.pll-notice .button{margin-right:10px}@media screen and (max-width:782px){#wpbody-content .pll-settings .pll-configure>td{padding:20px}#wpbody-content .pll-settings #cb{padding:20px 9px}.pll-inline-block{width:auto}.pll-settings-url-col{display:block;width:100%}#wpbody-content .pll-settings #pll-licenses-table td{display:block}.pll-configure .pll-deactivate-license{margin:10px 0 5px}.translation label{display:block;padding-left:0;width:95%}.translation input,.translation textarea{width:95%}#edit-term-translations .pll-language-name,#select-add-term-language .pll-select-flag,#select-edit-term-language .pll-select-flag{display:none}#edit-term-translations{width:100%}#add-term-translations .pll-language-column{line-height:38px}#edit-term-translations td{padding:8px 10px}#edit-term-translations .pll-edit-column,#edit-term-translations .pll-language-column{width:20px}.term-translations .pll-edit-column,.term-translations .pll-language-column,.term-translations .pll-translation-column{display:table-cell}.term-translations .hidden{display:none}#wpadminbar #wp-admin-bar-languages{display:block}#wpadminbar #wp-admin-bar-languages>.ab-item{text-align:center;width:50px}#wpadminbar #wp-admin-bar-languages>.ab-item .ab-icon:before{font:32px/1 dashicons;top:-1px}#wpadminbar #wp-admin-bar-languages>.ab-item img{margin:19px 0}#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon{font-size:20px!important;line-height:20px!important;margin-right:6px}}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/bulk-translate.css b/wp-content/plugins/polylang-pro/css/build/bulk-translate.css
new file mode 100644
index 000000000..1821966d4
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/bulk-translate.css
@@ -0,0 +1,57 @@
+.bulk-translate-save .button {
+ margin-right: 20px;
+}
+
+#wpbody-content #pll-translate .pll-bulk-translate-fields-wrapper {
+ display: flex;
+}
+
+#wpbody-content #pll-translate fieldset {
+ flex-basis: fit-content;
+ margin-right: 10%;
+}
+
+#pll-translate .pll-translation-flag {
+ margin: auto 10px auto 7px;
+}
+
+.rtl #pll-translate .pll-translation-flag {
+ margin: auto 7px auto 10px;
+}
+
+#pll-translate .title {
+ display: block;
+ line-height: 2.5;
+}
+
+#pll-translate label {
+ display: flex;
+ align-items: center;
+}
+
+#pll-translate label span.description{
+ line-height: normal;
+}
+
+#pll-translate label[for="pll-select-format"] {
+ padding-left: 18px;
+}
+
+#pll-translate #pll-select-format {
+ margin-left: 0.5rem;
+}
+
+@supports(selector(:has(*))) {
+ #pll-translate label[for="pll-select-format"] {
+ display: none;
+ }
+ #pll-translate label:has([name="translate"][value="pll_export_post"]:checked) ~ [for="pll-select-format"] {
+ display: flex;
+ }
+}
+
+@media screen and ( max-width: 782px ) {
+ #wpbody-content #pll-translate .pll-bulk-translate-fields-wrapper {
+ flex-direction: column;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/bulk-translate.min.css b/wp-content/plugins/polylang-pro/css/build/bulk-translate.min.css
new file mode 100644
index 000000000..1408b1599
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/bulk-translate.min.css
@@ -0,0 +1 @@
+.bulk-translate-save .button{margin-right:20px}#wpbody-content #pll-translate .pll-bulk-translate-fields-wrapper{display:flex}#wpbody-content #pll-translate fieldset{flex-basis:fit-content;margin-right:10%}#pll-translate .pll-translation-flag{margin:auto 10px auto 7px}.rtl #pll-translate .pll-translation-flag{margin:auto 7px auto 10px}#pll-translate .title{display:block;line-height:2.5}#pll-translate label{align-items:center;display:flex}#pll-translate label span.description{line-height:normal}#pll-translate label[for=pll-select-format]{padding-left:18px}#pll-translate #pll-select-format{margin-left:.5rem}@supports(selector(:has(*))){#pll-translate label[for=pll-select-format]{display:none}#pll-translate label:has([name=translate][value=pll_export_post]:checked)~[for=pll-select-format]{display:flex}}@media screen and (max-width:782px){#wpbody-content #pll-translate .pll-bulk-translate-fields-wrapper{flex-direction:column}}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/dialog.css b/wp-content/plugins/polylang-pro/css/build/dialog.css
new file mode 100644
index 000000000..103d15af1
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/dialog.css
@@ -0,0 +1,85 @@
+/* By default Polylang dialog box use WordPress jQuery UI dialog styles.
+ However WooCommerce loads its own jQuery UI dialog styles and we need to override them by ours
+ to revert to the default WordPress ones.
+*/
+.pll-confirmation-modal.ui-widget,
+.pll-confirmation-modal.ui-widget .ui-widget,
+.pll-confirmation-modal .ui-widget {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 13px;
+}
+.pll-confirmation-modal.ui-dialog {
+ padding: 0;
+ z-index: 100102;
+ background: #fff;
+ border: 0;
+ color: #444;
+ border-radius: 0; /* Override WooCommerce dialog styles - jQuery UI 1.11.4 - WP < 5.6 */
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-titlebar {
+ background: #fcfcfc;
+ border-radius: 0;
+ border: 0;
+ border-bottom: 1px solid #dfdfdf;
+ height: 36px;
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 2;
+ padding: 0 36px 0 16px;
+ color: #444;
+ position: static;
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-title {
+ float: none;
+ width: auto;
+ margin: 0;
+}
+.pll-confirmation-modal .ui-widget-header .ui-icon {
+ background: none;
+ position: static;
+}
+.pll-confirmation-modal .ui-button.ui-dialog-titlebar-close {
+ padding: 0;
+ margin: 0;
+ top: 0;
+ right: 0;
+ width: 36px;
+ height: 36px;
+ border: 0; /* Override WooCommerce dialog styles - jQuery UI 1.11.4 - WP < 5.6 */
+ background: none; /* Override WooCommerce dialog styles - jQuery UI 1.11.4 - WP < 5.6 */
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-content {
+ border: 0;
+ padding: 16px;
+ color: #444;
+ position: static;
+ box-sizing: border-box;
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-buttonpane{
+ margin: 0;
+ padding: 16px;
+ border: 0;
+ background: #fcfcfc;
+ border-top: 1px solid #dfdfdf;
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-buttonpane .ui-button{
+ margin: 0 0 0 16px;
+ padding: 0 10px 1px;
+ background: #f7f7f7;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ position: static;
+ line-height: 2;
+ vertical-align: top;
+}
+.ui-dialog.pll-confirmation-modal .ui-button:hover,
+.ui-dialog.pll-confirmation-modal .ui-button:focus {
+ background: #fafafa;
+ border-color: #999;
+ color: #23282d;
+}
+.pll-confirmation-modal + .ui-widget-overlay {
+ background: #000;
+ opacity: 0.7;
+ z-index: 100101;
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/dialog.min.css b/wp-content/plugins/polylang-pro/css/build/dialog.min.css
new file mode 100644
index 000000000..b5bd71857
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/dialog.min.css
@@ -0,0 +1 @@
+.pll-confirmation-modal .ui-widget,.pll-confirmation-modal.ui-widget,.pll-confirmation-modal.ui-widget .ui-widget{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.pll-confirmation-modal.ui-dialog{background:#fff;border:0;border-radius:0;color:#444;padding:0;z-index:100102}.ui-dialog.pll-confirmation-modal .ui-dialog-titlebar{background:#fcfcfc;border:0;border-bottom:1px solid #dfdfdf;border-radius:0;color:#444;font-size:18px;font-weight:600;height:36px;line-height:2;padding:0 36px 0 16px;position:static}.ui-dialog.pll-confirmation-modal .ui-dialog-title{float:none;margin:0;width:auto}.pll-confirmation-modal .ui-widget-header .ui-icon{background:none;position:static}.pll-confirmation-modal .ui-button.ui-dialog-titlebar-close{background:none;border:0;height:36px;margin:0;padding:0;right:0;top:0;width:36px}.ui-dialog.pll-confirmation-modal .ui-dialog-content{border:0;box-sizing:border-box;color:#444;padding:16px;position:static}.ui-dialog.pll-confirmation-modal .ui-dialog-buttonpane{background:#fcfcfc;border:0;border-top:1px solid #dfdfdf;margin:0;padding:16px}.ui-dialog.pll-confirmation-modal .ui-dialog-buttonpane .ui-button{background:#f7f7f7;border:1px solid #ccc;border-radius:3px;line-height:2;margin:0 0 0 16px;padding:0 10px 1px;position:static;vertical-align:top}.ui-dialog.pll-confirmation-modal .ui-button:focus,.ui-dialog.pll-confirmation-modal .ui-button:hover{background:#fafafa;border-color:#999;color:#23282d}.pll-confirmation-modal+.ui-widget-overlay{background:#000;opacity:.7;z-index:100101}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/machine-translation-settings.css b/wp-content/plugins/polylang-pro/css/build/machine-translation-settings.css
new file mode 100644
index 000000000..5e536e841
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/machine-translation-settings.css
@@ -0,0 +1,103 @@
+.pll-settings .pll-inner-notice {
+ margin: 5px 0 15px;
+ border: 1px solid #c3c4c7;
+ border-left-width: 4px;
+ padding: 1px 12px;
+ background: #fff;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
+}
+
+.form-table .pll-inner-notice {
+ margin-bottom: 5px;
+}
+
+.pll-settings .notice-success {
+ border-left-color: #00a32a;
+}
+
+.pll-settings .notice-warning {
+ border-left-color: #dba617;
+}
+
+.pll-settings .notice-error {
+ border-left-color: #d63638;
+}
+
+.pll-settings .pll-inner-notice p {
+ margin: 0.5em 0;
+ padding: 2px;
+}
+
+.pll-settings .pll-message:not(.pll-origin-message),
+.pll-settings .notice-success .pll-origin-message,
+.pll-settings .notice-warning .pll-origin-message,
+.pll-settings .notice-error .pll-origin-message {
+ display: none;
+}
+
+.pll-settings .notice-success .pll-success-message,
+.pll-settings .notice-warning .pll-warning-message.pll-message-shown,
+.pll-settings .notice-error .pll-error-message.pll-message-shown {
+ display: block;
+}
+
+.pll-settings [disabled] + .spinner,
+.pll-progress-bar-wrapper .spinner {
+ visibility: visible;
+}
+
+.pll-success-message .pll-icon {
+ color: rgb(18, 91, 145);
+}
+
+.pll-error-message .pll-icon,
+.pll-warning-message .pll-icon {
+ color: rgb(145, 30, 31);
+}
+
+.pll-icon {
+ font-size: 1.8em;
+ margin-right: 3px;
+ margin-left: 1px;
+ vertical-align: -2px;
+}
+
+.pll-progress-bar-wrapper {
+ position: relative;
+ max-width: 500px;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+ text-align: left;
+ font-size: 2em;
+ border: 1px solid rgb(64, 70, 72);
+ border-radius: 4px;
+ overflow: hidden;
+ white-space: nowrap;
+ color: rgb(23, 114, 181);
+ text-indent: 1em;
+}
+
+.pll-progress-bar-wrapper div {
+ position: absolute;
+ height: 100%;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ background-color: rgb(23, 114, 181);
+ color: rgb(232, 230, 227);
+}
+
+.pll-settings [type="password"] + .button {
+ margin-left: 20px;
+ margin-right: 0;
+}
+
+.pll-settings [type="password"] + .button + .spinner {
+ float: none;
+}
+
+.pll-progress-bar-wrapper .spinner {
+ float: none;
+ margin: 0;
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/machine-translation-settings.min.css b/wp-content/plugins/polylang-pro/css/build/machine-translation-settings.min.css
new file mode 100644
index 000000000..9fe31b161
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/machine-translation-settings.min.css
@@ -0,0 +1 @@
+.pll-settings .pll-inner-notice{background:#fff;border:1px solid #c3c4c7;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 0 15px;padding:1px 12px}.form-table .pll-inner-notice{margin-bottom:5px}.pll-settings .notice-success{border-left-color:#00a32a}.pll-settings .notice-warning{border-left-color:#dba617}.pll-settings .notice-error{border-left-color:#d63638}.pll-settings .pll-inner-notice p{margin:.5em 0;padding:2px}.pll-settings .notice-error .pll-origin-message,.pll-settings .notice-success .pll-origin-message,.pll-settings .notice-warning .pll-origin-message,.pll-settings .pll-message:not(.pll-origin-message){display:none}.pll-settings .notice-error .pll-error-message.pll-message-shown,.pll-settings .notice-success .pll-success-message,.pll-settings .notice-warning .pll-warning-message.pll-message-shown{display:block}.pll-progress-bar-wrapper .spinner,.pll-settings [disabled]+.spinner{visibility:visible}.pll-success-message .pll-icon{color:#125b91}.pll-error-message .pll-icon,.pll-warning-message .pll-icon{color:#911e1f}.pll-icon{font-size:1.8em;margin-left:1px;margin-right:3px;vertical-align:-2px}.pll-progress-bar-wrapper{border:1px solid #404648;border-radius:4px;color:#1772b5;font-size:2em;height:2em;line-height:2em;max-width:500px;overflow:hidden;position:relative;text-align:left;text-indent:1em;vertical-align:middle;white-space:nowrap}.pll-progress-bar-wrapper div{background-color:#1772b5;color:#e8e6e3;height:100%;left:0;overflow:hidden;position:absolute;top:0}.pll-settings [type=password]+.button{margin-left:20px;margin-right:0}.pll-settings [type=password]+.button+.spinner{float:none}.pll-progress-bar-wrapper .spinner{float:none;margin:0}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/metabox-button.css b/wp-content/plugins/polylang-pro/css/build/metabox-button.css
new file mode 100644
index 000000000..04df336d4
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/metabox-button.css
@@ -0,0 +1,25 @@
+.pll-button {
+ padding: 0;
+ height: 20px;
+ background: none;
+ border: none;
+ font-size: 20px;
+ cursor: pointer;
+}
+
+.pll-button:not(.wp-ui-text-highlight) {
+ color: #DDDDDD;
+}
+
+.pll-button svg {
+ fill: currentColor;
+}
+
+.pll-before-post-translations-button {
+ float: right;
+ margin: 13px 7px;
+}
+
+.rtl .pll-before-post-translations-button {
+ float: left;
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/metabox-button.min.css b/wp-content/plugins/polylang-pro/css/build/metabox-button.min.css
new file mode 100644
index 000000000..422452d49
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/metabox-button.min.css
@@ -0,0 +1 @@
+.pll-button{background:none;border:none;cursor:pointer;font-size:20px;height:20px;padding:0}.pll-button:not(.wp-ui-text-highlight){color:#ddd}.pll-button svg{fill:currentColor}.pll-before-post-translations-button{float:right;margin:13px 7px}.rtl .pll-before-post-translations-button{float:left}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/selectmenu.css b/wp-content/plugins/polylang-pro/css/build/selectmenu.css
new file mode 100644
index 000000000..6040faa26
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/selectmenu.css
@@ -0,0 +1,239 @@
+/* Greatly modified version of the jquery-ui.css */
+
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+
+.ui-menu .ui-menu {
+ position: absolute;
+}
+
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+
+/* for jQuery UI 1.12 which introduces a wrapper */
+.ui-menu .ui-menu-item:not([role]) {
+ padding: 0;
+}
+
+.ui-menu-item-wrapper {
+ padding: 3px 1em 3px 2em;
+}
+.rtl .ui-menu .ui-menu-item {
+ text-align: right;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+
+.ui-menu-icons .ui-menu-item[role] {
+ padding-left: 2em;
+}
+
+.rtl .ui-menu-item-wrapper, /* for jQuery UI 1.12 which introduces a wrapper */
+.rtl .ui-menu-icons .ui-menu-item[role] {
+ padding-left: 1em;
+ padding-right: 2em;
+}
+
+/* left-aligned */
+.ui-selectmenu-text .ui-icon,
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .3em;
+ margin: auto 0;
+}
+
+.rtl .ui-selectmenu-text .ui-icon,
+.rtl .ui-menu .ui-icon {
+ right: .3em;
+ left: auto;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 23px;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+
+.ui-selectmenu-open {
+ display: block;
+}
+
+.ui-selectmenu-button, /* jQuery UI 1.11.4 - WP < 5.6 */
+.ui-selectmenu-button.ui-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ box-sizing: border-box; /* To keep width calculation in percent since WP 5.6 */
+ text-align: left;
+ white-space: nowrap;
+ vertical-align: top;
+ padding: 0;
+ line-height: normal; /* Override WC Bookings styles with WP < 5.6 */
+ height: 28px; /* Override WC Bookings styles with WP < 5.6 */
+}
+
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ position: absolute;
+ top: 26%;
+ width: 16px;
+ height: 16px;
+ text-indent: 0; /* due to text-indent for jquery ui-dialog in wizard */
+ background: none;
+}
+
+.rtl .ui-selectmenu-button span.ui-icon {
+ left: 0.5em;
+ right: auto;
+}
+
+
+.ui-selectmenu-button.ui-widget span.ui-selectmenu-text, /* Override WC Bookings styles with WP < 5.6 */
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.1em 2.1em 0.2em 2em;
+ display: block;
+ line-height: 23px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ margin: 0;
+}
+
+.rtl .ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: right;
+ padding: 0.2em 2em 0.2em 2.1em;
+}
+
+.ui-widget-content,
+.ui-state-default,
+.ui-selectmenu-button.ui-state-default, /* Override WC Bookings styles with WP < 5.6 */
+.ui-button.ui-selectmenu-button-closed, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+.ui-button.ui-selectmenu-button-open, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ background: #fff;
+ border: 1px solid #ddd;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07) inset;
+ color: #32373c;
+}
+/* Override to have same styles as WP form styles since WordPress 5.4 */
+.toplevel_page_mlang .ui-selectmenu-button.ui-state-default,
+.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-closed, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-open{ /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+ box-shadow: 0 0 0 transparent;
+ border-radius: 4px;
+ border: 1px solid #7e8993;
+}
+
+/* From this line and below: override WooCommerce bookings plugin styles which overrides default WordPress styles */
+.pll-selectmenu-menu .ui-widget,
+.pll-selectmenu-button.ui-widget {
+ font-size: 13px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+}
+
+.toplevel_page_mlang .ui-button.ui-selectmenu-button:focus{
+ color: #016087; /* Same color as WordPress focused select HTML tag */
+ border-color: #007cba;
+ box-shadow: 0 0 0 1px #007cba;
+ outline: 2px solid transparent;
+ background: #fff; /* Override bookings plugin styles which overrides default WordPress styles */
+}
+
+.toplevel_page_mlang .ui-menu-item,
+.toplevel_page_mlang .ui-widget-content .ui-state-hover,
+.toplevel_page_mlang .ui-widget-content .ui-state-focus,
+.toplevel_page_mlang .ui-widget-content .ui-state-active {
+ color: #016087; /* Same color as option in a WordPress focused select HTML tag */
+ margin: 0;
+}
+
+.ui-selectmenu-open .ui-widget-content .ui-state-hover, /* Override WC Bookings styles with WP < 5.6 */
+.ui-selectmenu-open .ui-widget-content .ui-state-focus, /* Override WC Bookings styles with WP < 5.6 */
+.ui-selectmenu-open .ui-widget-content .ui-state-active, /* Override WC Bookings styles with WP < 5.6 */
+.pll-selectmenu-menu .ui-widget-content .ui-state-hover,
+.pll-selectmenu-menu .ui-widget-content .ui-state-focus,
+.pll-selectmenu-menu .ui-widget-content .ui-state-active { /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+ background: #d5d5d5;
+ border: 0;
+}
+
+.ui-selectmenu-button.ui-state-focus {
+ border: 1px solid #5b9dd9;
+ box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
+}
+
+.ui-icon-triangle-1-s:before {
+ content: "";
+ background: #fff url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E) no-repeat right 0px top 55%;
+ background-size: 16px 16px;
+ box-sizing: border-box;
+ position: absolute;
+ width: 16px;
+ height: 16px;
+}
+
+.pll-selectmenu-button.ui-button:hover,
+.pll-wizard .ui-button:hover,
+.pll-wizard .ui-button:focus {
+ background: #fff; /* To override jQuery ui-dialog styles provided by WordPress */
+}
+
+.ui-widget-content {
+ max-height: 231px;
+ box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3);
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/selectmenu.min.css b/wp-content/plugins/polylang-pro/css/build/selectmenu.min.css
new file mode 100644
index 000000000..92e0fbd3c
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/selectmenu.min.css
@@ -0,0 +1 @@
+.ui-widget-overlay{height:100%;left:0;position:fixed;top:0;width:100%}.ui-menu{display:block;list-style:none;margin:0;outline:none;padding:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{cursor:pointer;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);margin:0;min-height:0;padding:3px 1em 3px .4em;position:relative}.ui-menu .ui-menu-item:not([role]){padding:0}.ui-menu-item-wrapper{padding:3px 1em 3px 2em}.rtl .ui-menu .ui-menu-item{text-align:right}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item[role]{padding-left:2em}.rtl .ui-menu-icons .ui-menu-item[role],.rtl .ui-menu-item-wrapper{padding-left:1em;padding-right:2em}.ui-menu .ui-icon,.ui-selectmenu-text .ui-icon{bottom:0;left:.3em;margin:auto 0;position:absolute;top:0}.rtl .ui-menu .ui-icon,.rtl .ui-selectmenu-text .ui-icon{left:auto;right:.3em}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-selectmenu-menu{display:none;left:0;margin:0;padding:0;position:absolute;top:0}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{border:0;font-size:1em;font-weight:700;height:auto;line-height:23px;margin:.5em 0 0;padding:2px .4em}.ui-selectmenu-open{display:block}.ui-selectmenu-button,.ui-selectmenu-button.ui-button{box-sizing:border-box;display:inline-block;height:28px;line-height:normal;overflow:hidden;padding:0;position:relative;text-align:left;text-decoration:none;vertical-align:top;white-space:nowrap}.ui-selectmenu-button span.ui-icon{background:none;height:16px;left:auto;position:absolute;right:.5em;text-indent:0;top:26%;width:16px}.rtl .ui-selectmenu-button span.ui-icon{left:.5em;right:auto}.ui-selectmenu-button span.ui-selectmenu-text,.ui-selectmenu-button.ui-widget span.ui-selectmenu-text{display:block;line-height:23px;margin:0;overflow:hidden;padding:.1em 2.1em .2em 2em;text-align:left;text-overflow:ellipsis;white-space:nowrap}.rtl .ui-selectmenu-button span.ui-selectmenu-text{padding:.2em 2em .2em 2.1em;text-align:right}.ui-button.ui-selectmenu-button-closed,.ui-button.ui-selectmenu-button-open,.ui-selectmenu-button.ui-state-default,.ui-state-default,.ui-widget-content,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);color:#32373c}.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-closed,.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-open,.toplevel_page_mlang .ui-selectmenu-button.ui-state-default{border:1px solid #7e8993;border-radius:4px;box-shadow:0 0 0 transparent}.pll-selectmenu-button.ui-widget,.pll-selectmenu-menu .ui-widget{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.toplevel_page_mlang .ui-button.ui-selectmenu-button:focus{background:#fff;border-color:#007cba;box-shadow:0 0 0 1px #007cba;color:#016087;outline:2px solid transparent}.toplevel_page_mlang .ui-menu-item,.toplevel_page_mlang .ui-widget-content .ui-state-active,.toplevel_page_mlang .ui-widget-content .ui-state-focus,.toplevel_page_mlang .ui-widget-content .ui-state-hover{color:#016087;margin:0}.pll-selectmenu-menu .ui-widget-content .ui-state-active,.pll-selectmenu-menu .ui-widget-content .ui-state-focus,.pll-selectmenu-menu .ui-widget-content .ui-state-hover,.ui-selectmenu-open .ui-widget-content .ui-state-active,.ui-selectmenu-open .ui-widget-content .ui-state-focus,.ui-selectmenu-open .ui-widget-content .ui-state-hover{background:#d5d5d5;border:0}.ui-selectmenu-button.ui-state-focus{border:1px solid #5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.ui-icon-triangle-1-s:before{background:#fff url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E") no-repeat right 0 top 55%;background-size:16px 16px;box-sizing:border-box;content:"";height:16px;position:absolute;width:16px}.pll-selectmenu-button.ui-button:hover,.pll-wizard .ui-button:focus,.pll-wizard .ui-button:hover{background:#fff}.ui-widget-content{box-shadow:0 2px 6px hsla(0,0%,39%,.3);max-height:231px}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/css/build/style.css b/wp-content/plugins/polylang-pro/css/build/style.css
new file mode 100644
index 000000000..573a293b3
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/style.css
@@ -0,0 +1,289 @@
+/**
+* Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
+/**
+ * Colors
+ */
+/**
+ * Breakpoints & Media Queries
+ */
+/**
+ * SCSS Variables.
+ *
+ * Please use variables from this sheet to ensure consistency across the UI.
+ * Don't add to this sheet unless you're pretty sure the value will be reused in many places.
+ * For example, don't add rules to this sheet that affect block visuals. It's purely for UI.
+ */
+/**
+* Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
+/**
+ * Colors
+ */
+/**
+ * Fonts & basic variables.
+ */
+/**
+ * Typography
+ */
+/**
+ * Grid System.
+ * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/
+ */
+/**
+ * Radius scale.
+ */
+/**
+ * Elevation scale.
+ */
+/**
+ * Dimensions.
+ */
+/**
+ * Mobile specific styles
+ */
+/**
+ * Editor styles.
+ */
+/**
+ * Block & Editor UI.
+ */
+/**
+ * Block paddings.
+ */
+/**
+ * React Native specific.
+ * These variables do not appear to be used anywhere else.
+ */
+/**
+* Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
+/**
+ * Long content fade mixin
+ *
+ * Creates a fading overlay to signify that the content is longer
+ * than the space allows.
+ */
+/**
+ * Typography
+ */
+/**
+ * Breakpoint mixins
+ */
+/**
+ * Focus styles.
+ */
+/**
+ * Applies editor left position to the selector passed as argument
+ */
+/**
+ * Styles that are reused verbatim in a few places
+ */
+/**
+ * Allows users to opt-out of animations via OS-level preferences.
+ */
+/**
+ * Reset default styles for JavaScript UI based pages.
+ * This is a WP-admin agnostic reset
+ */
+/**
+ * Reset the WP Admin page styles for Gutenberg-like pages.
+ */
+.flag {
+ width: 16px;
+ height: 11px;
+ display: inline-block;
+}
+
+.components-modal__frame.confirmBox {
+ height: auto;
+}
+.components-modal__frame.confirmBox .buttons {
+ display: block;
+ text-align: right;
+}
+.components-modal__frame.confirmBox .buttons button:first-child {
+ margin-right: 1rem;
+}
+
+.translations p {
+ margin-top: 1em;
+}
+.translations td span {
+ box-sizing: border-box;
+}
+.translations .pll-column-icon:not(.pll-delete-column) > a {
+ color: var(--wp-admin-theme-color);
+ width: 20px;
+ padding: 2px 0 0;
+}
+.translations .pll-column-icon > button {
+ padding: 0;
+}
+.translations .pll-column-icon.pll-delete-column > .pll-button:not(:disabled) {
+ color: #cc1818;
+}
+
+body:not(.rtl) .translations .pll-translation-language {
+ margin-left: 10px;
+}
+
+.rtl .translations .pll-translation-language {
+ margin-right: 10px;
+}
+
+:not(.pll-delete-column) > .components-button.pll-button, :not(.pll-delete-column) > .components-button.pll-button:focus:enabled:not(.wp-ui-text-highlight),
+:not(.pll-delete-column) > .components-button.pll-button,
+:not(.pll-delete-column) > .components-button.pll-button:focus:enabled:not(.wp-ui-text-highlight) {
+ color: #ccc;
+}
+
+:not(.pll-delete-column) > .components-button.pll-button.wp-ui-text-highlight, :not(.pll-delete-column) > .components-button.pll-button.wp-ui-text-highlight:focus:enabled,
+:not(.pll-delete-column) > .components-button.pll-button.wp-ui-text-highlight,
+:not(.pll-delete-column) > .components-button.pll-button.wp-ui-text-highlight:focus:enabled {
+ color: var(--wp-admin-theme-color);
+}
+
+.pll-delete-column > .components-button.pll-button:disabled:hover {
+ color: #1e1e1e;
+}
+
+.pll-before-post-translations-button {
+ float: right;
+ margin: 7px 0 0;
+}
+
+.rtl .pll-before-post-translations-button {
+ float: left;
+}
+
+.pll-button {
+ height: auto;
+}
+.pll-button.has-icon.has-text svg {
+ margin: 0;
+}
+
+.pll-metabox-location .components-button.has-icon {
+ min-width: auto;
+}
+
+.pll-metabox-error.components-notice {
+ margin: 0;
+}
+
+.translation-input {
+ position: relative;
+}
+.translation-input .components-spinner {
+ position: absolute;
+ top: 7px;
+ right: 16px;
+ margin: 0;
+}
+.translation-input input {
+ width: 100%;
+}
+.translation-input input[dir=rtl] + .components-spinner {
+ left: 5px;
+ right: auto;
+}
+
+.rtl .translation-input .components-spinner {
+ right: 8px;
+}
+.rtl .translation-input input[dir=rtl] + .components-spinner {
+ left: 18px;
+}
+
+.translation-input__suggestions {
+ max-height: 200px;
+ transition: all 0.15s ease-in-out;
+ padding: 4px 0;
+ width: 302px;
+ overflow-y: auto;
+}
+
+.translation-input__suggestion {
+ padding: 4px 8px;
+ color: #6c7781;
+ display: block;
+ font-size: 13px;
+ cursor: pointer;
+ background: #fff;
+ width: 100%;
+ border: none;
+ text-align: left;
+ border: none;
+ box-shadow: none;
+}
+.translation-input__suggestion:hover {
+ background: #e0e0e0;
+}
+.translation-input__suggestion:focus, .translation-input__suggestion.is-selected {
+ background: color(theme(primary) shade(15%));
+ color: #fff;
+ outline: none;
+}
+
+.block-editor-block-inspector #select-post-language {
+ margin: 10px auto 5px auto;
+}
+.block-editor-block-inspector #select-post-language .pll-translation-icon {
+ margin-right: 10px;
+ padding: 2px;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.pll-language-item {
+ margin: 10px auto 5px auto;
+}
+.pll-language-item .pll-select-flag {
+ margin-right: 10px;
+ margin-left: 3px;
+ padding: 2px;
+ display: inline-block;
+}
+.pll-language-item .pll-language-name {
+ font-size: 1.1em;
+}
+
+.pll-metabox-info {
+ font-style: italic;
+ color: #757575;
+ font-size: 0.9em;
+}
+
+.pll-defaut-lang-icon {
+ width: 15px;
+ height: 15px;
+}
+.pll-defaut-lang-icon path {
+ fill: var(--wp-admin-theme-color);
+}
+
+.pll-language-item .pll-defaut-lang-icon {
+ vertical-align: text-top;
+}
+
+body:not(.rtl) .pll-language-item .pll-defaut-lang-icon {
+ margin-left: 5px;
+}
+
+.rtl .pll-language-item .pll-defaut-lang-icon {
+ margin-right: 5px;
+}
+
+.pll-default-lang-column .pll-defaut-lang-icon {
+ margin-top: 2px;
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/style.min.css b/wp-content/plugins/polylang-pro/css/build/style.min.css
new file mode 100644
index 000000000..5adfef5c3
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/style.min.css
@@ -0,0 +1 @@
+.flag{width:16px;height:11px;display:inline-block}.components-modal__frame.confirmBox{height:auto}.components-modal__frame.confirmBox .buttons{display:block;text-align:right}.components-modal__frame.confirmBox .buttons button:first-child{margin-right:1rem}.translations p{margin-top:1em}.translations td span{box-sizing:border-box}.translations .pll-column-icon:not(.pll-delete-column)>a{color:var(--wp-admin-theme-color);width:20px;padding:2px 0 0}.translations .pll-column-icon>button{padding:0}.translations .pll-column-icon.pll-delete-column>.pll-button:not(:disabled){color:#cc1818}body:not(.rtl) .translations .pll-translation-language{margin-left:10px}.rtl .translations .pll-translation-language{margin-right:10px}:not(.pll-delete-column)>.components-button.pll-button,:not(.pll-delete-column)>.components-button.pll-button:focus:enabled:not(.wp-ui-text-highlight),:not(.pll-delete-column)>.components-button.pll-button,:not(.pll-delete-column)>.components-button.pll-button:focus:enabled:not(.wp-ui-text-highlight){color:#ccc}:not(.pll-delete-column)>.components-button.pll-button.wp-ui-text-highlight,:not(.pll-delete-column)>.components-button.pll-button.wp-ui-text-highlight:focus:enabled,:not(.pll-delete-column)>.components-button.pll-button.wp-ui-text-highlight,:not(.pll-delete-column)>.components-button.pll-button.wp-ui-text-highlight:focus:enabled{color:var(--wp-admin-theme-color)}.pll-delete-column>.components-button.pll-button:disabled:hover{color:#1e1e1e}.pll-before-post-translations-button{float:right;margin:7px 0 0}.rtl .pll-before-post-translations-button{float:left}.pll-button{height:auto}.pll-button.has-icon.has-text svg{margin:0}.pll-metabox-location .components-button.has-icon{min-width:auto}.pll-metabox-error.components-notice{margin:0}.translation-input{position:relative}.translation-input .components-spinner{position:absolute;top:7px;right:16px;margin:0}.translation-input input{width:100%}.translation-input input[dir=rtl]+.components-spinner{left:5px;right:auto}.rtl .translation-input .components-spinner{right:8px}.rtl .translation-input input[dir=rtl]+.components-spinner{left:18px}.translation-input__suggestions{max-height:200px;transition:all .15s ease-in-out;padding:4px 0;width:302px;overflow-y:auto}.translation-input__suggestion{padding:4px 8px;color:#6c7781;display:block;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:left;border:none;box-shadow:none}.translation-input__suggestion:hover{background:#e0e0e0}.translation-input__suggestion:focus,.translation-input__suggestion.is-selected{background:color(theme(primary) shade(15%));color:#fff;outline:none}.block-editor-block-inspector #select-post-language{margin:10px auto 5px auto}.block-editor-block-inspector #select-post-language .pll-translation-icon{margin-right:10px;padding:2px;display:inline-block;vertical-align:middle}.pll-language-item{margin:10px auto 5px auto}.pll-language-item .pll-select-flag{margin-right:10px;margin-left:3px;padding:2px;display:inline-block}.pll-language-item .pll-language-name{font-size:1.1em}.pll-metabox-info{font-style:italic;color:#757575;font-size:.9em}.pll-defaut-lang-icon{width:15px;height:15px}.pll-defaut-lang-icon path{fill:var(--wp-admin-theme-color)}.pll-language-item .pll-defaut-lang-icon{vertical-align:text-top}body:not(.rtl) .pll-language-item .pll-defaut-lang-icon{margin-left:5px}.rtl .pll-language-item .pll-defaut-lang-icon{margin-right:5px}.pll-default-lang-column .pll-defaut-lang-icon{margin-top:2px}
diff --git a/wp-content/plugins/polylang-pro/css/build/wizard.css b/wp-content/plugins/polylang-pro/css/build/wizard.css
new file mode 100644
index 000000000..b6c6a62a9
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/wizard.css
@@ -0,0 +1,951 @@
+@charset "UTF-8";
+body {
+ margin: 65px auto 24px;
+ box-shadow: none;
+ background: #f1f1f1;
+ padding: 0;
+ border: 0; /* fix-pro #856 override WP install.css */
+}
+
+#pll-logo {
+ border: 0;
+ margin: 0 0 24px;
+ padding: 0;
+ text-align: center;
+ font-family: sans-serif;
+ font-size: 64px;
+ text-transform: uppercase;
+ color: #000;
+ line-height: normal;
+}
+#pll-logo a {
+ display: flex;
+ justify-content: center;
+ color: #000;
+ text-decoration: none;
+}
+
+#pll-logo img {
+ max-width: 100%;
+ margin-right: 16px;
+}
+.rtl #pll-logo img {
+ margin-right: 0;
+ margin-left: 16px;
+}
+
+.pll-wizard-footer {
+ text-align: center
+}
+
+.pll-wizard .select2-container {
+ text-align: left;
+ width: auto
+}
+
+.pll-wizard .hidden {
+ display: none
+}
+
+.pll-wizard-content {
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
+ padding: 2em;
+ margin: 0 0 20px;
+ background: #fff;
+ overflow: hidden;
+ zoom: 1;
+ text-align: left;
+}
+.rtl .pll-wizard-content{
+ text-align: right;
+}
+
+.pll-wizard-content h1,
+.pll-wizard-content h2,
+.pll-wizard-content h3,
+.pll-wizard-content table {
+ margin: 0 0 20px;
+ border: 0;
+ padding: 0;
+ color: #666;
+ clear: none;
+ font-weight: 500
+}
+
+.pll-wizard-content p {
+ margin: 20px 0;
+ font-size: 1em;
+ line-height: 1.75em;
+ color: #666
+}
+
+.pll-wizard-content table {
+ font-size: 1em;
+ line-height: 1.75em;
+ color: #666;
+ width: 100%;
+ margin-top: 20px;
+}
+.pll-wizard-content table td span{
+ display: inline-block;
+}
+
+.pll-wizard-content table caption {
+ caption-side: bottom;
+ font-style: italic;
+ text-align: right;
+}
+.rtl .pll-wizard-content table caption {
+ text-align: left;
+}
+
+.pll-wizard-content table caption .icon-default-lang{
+ font-style: normal;
+}
+
+.pll-wizard-content a {
+ color: #a03f3f;
+}
+
+.pll-wizard-content a:focus,
+.pll-wizard-content a:hover,
+.pll-wizard-footer-links:hover {
+ color: #dd5454
+}
+
+.pll-wizard-content .pll-wizard-next-steps {
+ overflow: hidden;
+ margin: 0 0 24px;
+ padding-bottom: 2px
+}
+
+.pll-wizard-content .pll-wizard-next-steps h2 {
+ margin-bottom: 12px
+}
+
+.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-first {
+ float: left;
+ width: 50%;
+ box-sizing: border-box
+}
+
+.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-last {
+ float: right;
+ width: 50%;
+ box-sizing: border-box
+}
+
+.pll-wizard-content .pll-wizard-next-steps ul {
+ padding: 0 2em 0 0;
+ list-style: none outside;
+ margin: 0
+}
+
+.pll-wizard-content .pll-wizard-next-steps ul li a {
+ display: block;
+ padding: 0 0 .75em
+}
+
+.pll-wizard-content .pll-wizard-next-steps ul li a::before {
+ color: #82878c;
+ font: normal 20px/1 dashicons;
+ speak: none;
+ display: inline-block;
+ padding: 0 10px 0 0;
+ top: 1px;
+ position: relative;
+ text-decoration: none!important;
+ vertical-align: top
+}
+
+.pll-wizard-steps {
+ padding: 0 0 24px;
+ margin: 0;
+ list-style: none outside;
+ overflow: hidden;
+ color: #ccc;
+ width: 100%;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: inline-flex
+}
+
+.pll-wizard-steps li {
+ width: 100%;
+ float: left;
+ padding: 0 0 .8em;
+ margin: 0;
+ text-align: center;
+ position: relative;
+ border-bottom: 4px solid #ccc;
+ line-height: 1.4em
+}
+
+.pll-wizard-steps li a {
+ color: #a03f3f;
+ text-decoration: none;
+ padding: 1.5em;
+ margin: -1.5em;
+ position: relative;
+ z-index: 1
+}
+
+.pll-wizard-steps li a:focus,
+.pll-wizard-steps li a:hover {
+ color: #dd5454;
+ text-decoration: underline
+}
+
+.pll-wizard-steps li::before {
+ content: "";
+ border: 4px solid #ccc;
+ border-radius: 100%;
+ width: 4px;
+ height: 4px;
+ position: absolute;
+ bottom: 0;
+ left: 50%;
+ margin-left: -6px;
+ margin-bottom: -8px;
+ background: #fff
+}
+
+.pll-wizard-steps li.active {
+ border-color: #a03f3f;
+ color: #a03f3f;
+ font-weight: 700
+}
+
+.pll-wizard-steps li.active::before {
+ border-color: #a03f3f
+}
+
+.pll-wizard-steps li.done {
+ border-color: #a03f3f;
+ color: #a03f3f
+}
+
+.pll-wizard-steps li.done::before {
+ border-color: #a03f3f;
+ background: #a03f3f
+}
+
+.pll-wizard .pll-wizard-actions {
+ overflow: hidden;
+ margin: 20px 0 0;
+ position: relative
+}
+
+.pll-wizard .pll-wizard-actions .button {
+ font-size: 16px;
+ font-weight: 300;
+ padding: 1em 2em;
+ line-height: 1em;
+ margin-right: .5em;
+ margin-bottom: 2px;
+ margin-top: 10px;
+ height: auto;
+ border-radius: 4px;
+ box-shadow: none;
+ min-width: auto;
+ border-color: #a03f3f;
+ color: #a03f3f;
+}
+
+.pll-wizard .pll-wizard-content .button {
+ border-color: #a03f3f;
+ color: #a03f3f;
+}
+
+.pll-wizard .pll-wizard-content .button-primary,
+.pll-wizard .pll-wizard-actions .button-primary {
+ background-color: #a03f3f;
+ border-color: #a03f3f;
+ color: #fff;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 0 #a03f3f;
+ text-shadow: 0 -1px 1px #a03f3f, 1px 0 1px #a03f3f, 0 1px 1px #a03f3f, -1px 0 1px #a03f3f;
+ margin: 0;
+ opacity: 1
+}
+
+.pll-wizard .pll-wizard-content .button-small .dashicons {
+ font-size: 15px;
+ height: auto;
+ vertical-align: middle;
+}
+
+.pll-wizard .button-primary:active,
+.pll-wizard .button-primary:focus,
+.pll-wizard input[type="checkbox"]:focus + label.button-primary,
+.pll-wizard .button-primary:hover {
+ background: #dd5454;
+ border-color: #dd5454;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 0 #dd5454
+}
+.pll-wizard .pll-wizard-actions .button-primary[disabled],
+.pll-wizard .pll-wizard-actions .button-primary:disabled,
+.pll-wizard .pll-wizard-actions .button-primary.disabled {
+ cursor: wait;
+ background-color: #bb5454 !important;
+ border-color: #bb5454 !important;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 0 #bb5454 !important;
+ text-shadow: 0 -1px 1px #bb5454, 1px 0 1px #bb5454, 0 1px 1px #bb5454, -1px 0 1px #bb5454 !important;
+ color: #ffa3a3 !important;
+}
+.pll-wizard-content p:last-child {
+ margin-bottom: 0
+}
+
+.pll-wizard-footer-links {
+ font-size: .85em;
+ color: #7b7b7b;
+ margin: 1.18em auto;
+ display: inline-block;
+ text-align: center
+}
+
+.pll-wizard-services {
+ border: 1px solid #eee;
+ padding: 0;
+ margin: 0 0 1em;
+ list-style: none outside;
+ border-radius: 4px;
+ overflow: hidden
+}
+
+.pll-wizard-services p {
+ margin: 0 0 1em 0;
+ padding: 0;
+ font-size: 1em;
+ line-height: 1.5em
+}
+
+.pll-wizard-service-item {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ padding: 0;
+ border-bottom: 1px solid #eee;
+ color: #666;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center
+}
+
+.media-step .pll-wizard-service-item{
+ border: 0;
+}
+
+.media-step .pll-wizard-service-item:last-child{
+ display: block;
+}
+
+.media-step .pll-wizard-service-item .pll-wizard-service-enable{
+ padding-bottom: 0;
+}
+
+.pll-wizard-service-item:last-child {
+ border-bottom: 0
+}
+
+.pll-wizard-service-item .pll-wizard-service-name {
+ -webkit-flex-basis: 0;
+ flex-basis: 0;
+ min-width: 160px;
+ text-align: center;
+ font-weight: 700;
+ padding: 2em 0;
+ -webkit-align-self: stretch;
+ align-self: stretch;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-align: baseline;
+ -webkit-align-items: baseline;
+ align-items: baseline
+}
+
+.pll-wizard-service-item .pll-wizard-service-name img {
+ max-width: 75px
+}
+
+.pll-wizard-service-item .pll-wizard-service-description {
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ flex-grow: 1;
+ padding: 20px
+}
+
+.pll-wizard-service-item .pll-wizard-service-example {
+ padding: 0 20px 20px
+}
+
+.pll-wizard-service-item .pll-wizard-service-example p{
+ text-align: right;
+}
+.rtl .pll-wizard-service-item .pll-wizard-service-example p{
+ text-align: left;
+}
+
+.pll-wizard-service-item .pll-wizard-service-description p {
+ margin-bottom: 1em
+}
+
+.pll-wizard-service-item .pll-wizard-service-description p:last-child {
+ margin-bottom: 0
+}
+
+.pll-wizard-service-item .pll-wizard-service-description .pll-wizard-service-settings-description {
+ display: block;
+ font-style: italic;
+ color: #999
+}
+
+.pll-wizard-service-item .pll-wizard-service-enable {
+ -webkit-flex-basis: 0;
+ flex-basis: 0;
+ min-width: 75px;
+ text-align: center;
+ cursor: pointer;
+ padding: 2em 0;
+ position: relative;
+ max-height: 1.5em;
+ -webkit-align-self: flex-start;
+ align-self: flex-start;
+ -webkit-box-ordinal-group: 4;
+ -webkit-order: 3;
+ order: 3
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle {
+ position: relative
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] {
+ position:absolute;
+ opacity: 0;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label {
+ position: relative;
+ display: inline-block;
+ width: 44px;
+ height: 20px;
+ border-radius: 10em;
+ cursor: pointer;
+ text-indent: -9999px;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:focus + label {
+ border:1px dashed #777;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::before,
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::after {
+ content: '';
+ position: absolute;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::before {
+ left: 0;
+ top: 0;
+ width: 44px;
+ height: 20px;
+ background: #ddd;
+ border-radius: 10em;
+ transition: background-color .2s;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox] + label::after {
+ width: 16px;
+ height: 16px;
+ transition: all .2s;
+ border-radius: 50%;
+ background: #fff;
+ margin: 2px;
+ top: 0;
+ left: 0;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked + label::before {
+ background:#a03f3f;
+}
+
+.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked + label::after {
+ right: 0;
+ left:auto;
+}
+
+.pll-wizard-service-item .pll-wizard-service-settings {
+ display: none;
+ margin-top: .75em;
+ margin-bottom: 0;
+ cursor: default
+}
+
+.pll-wizard-service-item .pll-wizard-service-settings.hide {
+ display: none
+}
+
+.pll-wizard-service-item.checked .pll-wizard-service-settings {
+ display: inline-block
+}
+
+.pll-wizard-service-item.checked .pll-wizard-service-settings.hide {
+ display: none
+}
+
+.pll-wizard-service-item.closed {
+ border-bottom: 0
+}
+
+.step {
+ text-align: center
+}
+
+.pll-wizard .button .dashicons{
+ vertical-align: middle;
+}
+.rtl .dashicons-arrow-right-alt2:before {
+ content: "\f341";
+}
+.pll-wizard .pll-wizard-actions .button:active,
+.pll-wizard .pll-wizard-actions .button:focus,
+.pll-wizard .pll-wizard-actions .button:hover {
+ box-shadow: none
+}
+
+.pll-wizard-next-steps {
+ border: 1px solid #eee;
+ border-radius: 4px;
+ list-style: none;
+ padding: 0
+}
+
+.pll-wizard-next-steps li {
+ padding: 0
+}
+
+.pll-wizard-next-steps .pll-wizard-next-step-item {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ border-top: 1px solid #eee
+}
+
+.pll-wizard-next-steps .pll-wizard-next-step-item.no-border,
+.pll-wizard-next-steps .pll-wizard-next-step-item:first-child {
+ border-top: 0
+}
+
+.pll-wizard-next-steps .pll-wizard-next-step-description {
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ flex-grow: 1;
+ margin: 1.5em
+}
+
+.pll-wizard-next-steps .pll-wizard-next-step-action {
+ -webkit-box-flex: 0;
+ -webkit-flex-grow: 0;
+ flex-grow: 0;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center
+}
+
+.pll-wizard-next-steps .pll-wizard-next-step-action .button {
+ margin: 1em 1.5em
+}
+
+.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-description,
+.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-actions,
+.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-action .button{
+ margin-top: 0;
+}
+
+
+.pll-wizard-next-steps p.next-step-heading {
+ margin: 0;
+ font-size: .95em;
+ font-weight: 400;
+ font-variant: all-petite-caps
+}
+
+.pll-wizard-next-steps p.next-step-extra-info {
+ margin: 0
+}
+
+.pll-wizard-next-steps h3.next-step-description {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 600;
+}
+
+.pll-wizard-next-steps .pll-wizard-additional-steps {
+ border-top: 1px solid #eee;
+}
+
+.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-next-step-description {
+ margin-bottom: 0
+}
+
+.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions {
+ margin: 0 0 1.5em 0;
+}
+
+.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button {
+ font-size: 15px;
+ margin: 1em 0 1em 1.5em;
+}
+.rtl .pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button {
+ margin: 1em 1.5em 1em 0;
+}
+
+.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button::last-child {
+ margin-right: 1.5em;
+}
+
+.pll-wizard-content img{
+ max-width: 100%;
+ margin-right: 0.5em;
+}
+.rtl .pll-wizard-content img{
+ margin-left: 0.5em;
+}
+
+.pll-wizard-content .form-field label{
+ margin-bottom: 5px;
+ display: block;
+}
+
+.pll-wizard-content .form-field select{
+ padding: 3px;
+}
+
+.pll-wizard-content .languages-step select,
+.pll-wizard-content .untranslated-contents-step select{
+ width: 100%;
+}
+
+.languages-step .form-field .button{
+ margin-left: 15px;
+}
+.languages-step .form-field .button > span{
+ margin-right: 0.3em;
+}
+.rtl .languages-step .form-field .button{
+ margin-left: 0;
+ margin-right: 15px;
+}
+.rtl .languages-step .form-field .button > span{
+ margin-left: 0.3em;
+ margin-right: 0;
+}
+
+.pll-wizard-content .languages-step .select-language-field{
+ display: flex;
+}
+
+.pll-wizard-content #languages{
+ display: none;
+}
+.pll-wizard-content #languages tr th:first-child{
+ width: 80%;
+}
+.pll-wizard-content #languages .dashicons{
+ color: #a03f3f;
+}
+.pll-wizard-content #languages img{
+ margin-right: 5px;
+}
+.pll-wizard-content .error{
+ color: #a03f3f;
+ font-weight: bold;
+}
+.pll-wizard-content #messages .error{
+ background: #fccfcf;
+ padding: 0.5rem;
+ border: 1px solid #a03f3f;
+ margin-bottom: 0.5rem;
+}
+
+.pll-wizard-content #slide-toggle{
+ position:absolute;
+ opacity: 0;
+}
+
+.pll-wizard-content #slide-toggle + label{
+ position:relative;
+}
+.pll-wizard-content #slide-toggle + label + span{
+ display: block;
+}
+
+.pll-wizard-content #slide-toggle + label .dashicons{
+ margin-right: 0.3em;
+}
+.rtl .pll-wizard-content #slide-toggle + label .dashicons{
+ margin-left: 0.3em;
+ margin-right: 0;
+}
+.pll-wizard-content #slide-toggle ~ #screenshot > img {
+ max-height: 500px;
+ margin-top: 10px;
+ -webkit-transition: all .5s cubic-bezier(0, 1, 0.5, 1);
+ transition: all .5s cubic-bezier(0, 1, 0.5, 1);
+}
+.pll-wizard-content #slide-toggle:checked ~ #screenshot > img {
+ max-height: 0;
+}
+.hide {
+ display: none;
+}
+
+input[type="text"].field-in-error,
+input[type="password"].field-in-error,
+input[type="checkbox"].field-in-error,
+input[type="color"].field-in-error,
+input[type="date"].field-in-error,
+input[type="datetime"].field-in-error,
+input[type="datetime-local"].field-in-error,
+input[type="email"].field-in-error,
+input[type="month"].field-in-error,
+input[type="number"].field-in-error,
+input[type="search"].field-in-error,
+input[type="radio"].field-in-error,
+input[type="tel"].field-in-error,
+input[type="text"].field-in-error,
+input[type="time"].field-in-error,
+input[type="url"].field-in-error,
+input[type="week"].field-in-error,
+select.field-in-error,
+textarea.field-in-error,
+span.field-in-error,
+.field-in-error{
+ border-color: #a03f3f;
+}
+
+input[type="text"].field-in-error:focus,
+input[type="password"].field-in-error:focus,
+input[type="checkbox"].field-in-error:focus,
+input[type="color"].field-in-error:focus,
+input[type="date"].field-in-error:focus,
+input[type="datetime"].field-in-error:focus,
+input[type="datetime-local"].field-in-error:focus,
+input[type="email"].field-in-error:focus,
+input[type="month"].field-in-error:focus,
+input[type="number"].field-in-error:focus,
+input[type="search"].field-in-error:focus,
+input[type="radio"].field-in-error:focus,
+input[type="tel"].field-in-error:focus,
+input[type="text"].field-in-error:focus,
+input[type="time"].field-in-error:focus,
+input[type="url"].field-in-error:focus,
+input[type="week"].field-in-error:focus,
+select.field-in-error:focus,
+textarea.field-in-error:focus,
+span.field-in-error:focus,
+.field-in-error:focus{
+ border: 1px solid #a03f3f;
+ box-shadow: 0 0 2px rgba(160, 63, 63, 0.8);
+ outline-color: #a03f3f;
+ outline-style: auto;
+ outline-width: thin;
+}
+
+/* override install styles by returning back to forms styles */
+.form-table input.regular-text{
+ width: 25em;
+}
+.form-table input.field-in-error{
+ border-color: #a03f3f;
+}
+#pll-licenses-table td{
+ padding: 10px 9px;
+}
+#pll-licenses-table .license-valid td p{
+ min-width: 35em;
+}
+#pll-licenses-table .pll-deactivate-license{
+ margin: 0 0 0 20px;
+}
+.rtl #pll-licenses-table .pll-deactivate-license{
+ margin: 0 10px 0 0;
+}
+.pll-wizard-content .documentation {
+ padding: 24px 24px 0;
+ margin: 0 0 24px;
+ overflow: hidden;
+ background: #f5f5f5
+}
+
+.pll-wizard-content .documentation p {
+ padding: 0;
+ margin: 0 0 12px;
+}
+.documentation-container {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ justify-content: flex-end;
+}
+
+.documentation-container .documentation-button-container {
+ -webkit-box-flex: 0;
+ -webkit-flex-grow: 0;
+ flex-grow: 0;
+}
+
+.wc-setup .wc-setup-actions .button.documentation-button {
+ height: 42px;
+ padding: 0 1em;
+ margin: 0;
+}
+#dialog{
+ display: none;
+}
+.pll-wizard .ui-dialog.ui-widget-content{
+ max-height: none;
+}
+.pll-wizard .ui-dialog-title::before{
+ content: "\f534";
+ font-family: dashicons;
+ display: inline-block;
+ line-height: 1;
+ font-weight: 400;
+ font-style: normal;
+ speak: none;
+ text-decoration: inherit;
+ text-transform: none;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ width: 20px;
+ height: 20px;
+ font-size: 20px;
+ vertical-align: middle;
+ text-align: center;
+ margin: 0 5px 5px 0;
+ transition: color 0.1s ease-in;
+}
+.rtl.pll-wizard .ui-dialog-title::before{
+ margin-right: 0;
+ margin-left: 5px;
+}
+.pll-wizard .ui-dialog ul{
+ list-style: disc;
+ padding-left: 20px;
+}
+.rtl.pll-wizard .ui-dialog ul{
+ padding-left: 0;
+ padding-right: 20px;
+}
+.pll-wizard li{
+ margin-bottom: 0;
+}
+#translations{
+ border-collapse: collapse;
+}
+#translations tbody:nth-child(odd){
+ background-color: #f9f9f9;
+}
+#translations.striped > tbody > :nth-child(odd) {
+ background-color: transparent; /* Override common WordPress style */
+}
+.pll-wizard-content mark{
+ background: transparent none;
+}
+.pll-wizard-content mark{
+ color: #7ad03a;
+}
+@media screen and (max-width: 782px) {
+ /* Override WordPress button css rules */
+ .languages-step .form-field .button{
+ font-size: 13px;
+ line-height: 26px;
+ height: 28px;
+ padding: 0 10px 1px;
+ vertical-align: top;
+ }
+
+ #pll-licenses-table .pll-deactivate-license{
+ margin: 10px 0 5px;
+ }
+}
+@media only screen and (max-width:620px) {
+ /* Override dialog width rule */
+ .ui-dialog{
+ width: 100% !important;
+ }
+
+}
+@media only screen and (max-width:500px) {
+ #pll-logo a,
+ .select-language-field{
+ flex-direction: column;
+ }
+ .select-language-field .action-buttons{
+ display: flex;
+ justify-content: flex-end;
+ }
+ .languages-step .form-field .button{
+ margin: 5px 0 0;
+ }
+}
+@media only screen and (max-width:400px) {
+ #pll-logo {
+ font-size: 56px;
+ }
+ .pll-wizard-steps {
+ display: none
+ }
+ .pll-wizard-service-item {
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap
+ }
+ .pll-wizard-service-item .pll-wizard-service-enable {
+ -webkit-box-ordinal-group: 3;
+ -webkit-order: 2;
+ order: 2;
+ padding: 20px 0 0
+ }
+ .pll-wizard-service-item .pll-wizard-service-description {
+ -webkit-box-ordinal-group: 4;
+ -webkit-order: 3;
+ order: 3
+ }
+ .pll-wizard-service-item .pll-wizard-service-name {
+ padding: 20px 20px 0;
+ text-align: left;
+ -webkit-box-pack: justify!important;
+ -webkit-justify-content: space-between!important;
+ justify-content: space-between!important
+ }
+ .pll-wizard-service-item .pll-wizard-service-name img {
+ margin: 0
+ }
+ .pll-wizard-next-steps .pll-wizard-next-step-item {
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap
+ }
+ .pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-description {
+ margin-bottom: 0
+ }
+ .pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-action p {
+ margin: 0
+ }
+}
+@media only screen and (max-width:360px) {
+ #pll-logo {
+ font-size: 48px;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/css/build/wizard.min.css b/wp-content/plugins/polylang-pro/css/build/wizard.min.css
new file mode 100644
index 000000000..d5d262375
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/css/build/wizard.min.css
@@ -0,0 +1 @@
+body{background:#f1f1f1;box-shadow:none;margin:65px auto 24px}#pll-logo,body{border:0;padding:0}#pll-logo{color:#000;font-family:sans-serif;font-size:64px;line-height:normal;margin:0 0 24px;text-align:center;text-transform:uppercase}#pll-logo a{color:#000;display:flex;justify-content:center;text-decoration:none}#pll-logo img{margin-right:16px;max-width:100%}.rtl #pll-logo img{margin-left:16px;margin-right:0}.pll-wizard-footer{text-align:center}.pll-wizard .select2-container{text-align:left;width:auto}.pll-wizard .hidden{display:none}.pll-wizard-content{zoom:1;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.13);margin:0 0 20px;overflow:hidden;padding:2em;text-align:left}.rtl .pll-wizard-content{text-align:right}.pll-wizard-content h1,.pll-wizard-content h2,.pll-wizard-content h3,.pll-wizard-content table{border:0;clear:none;color:#666;font-weight:500;margin:0 0 20px;padding:0}.pll-wizard-content p{color:#666;font-size:1em;line-height:1.75em;margin:20px 0}.pll-wizard-content table{color:#666;font-size:1em;line-height:1.75em;margin-top:20px;width:100%}.pll-wizard-content table td span{display:inline-block}.pll-wizard-content table caption{caption-side:bottom;font-style:italic;text-align:right}.rtl .pll-wizard-content table caption{text-align:left}.pll-wizard-content table caption .icon-default-lang{font-style:normal}.pll-wizard-content a{color:#a03f3f}.pll-wizard-content a:focus,.pll-wizard-content a:hover,.pll-wizard-footer-links:hover{color:#dd5454}.pll-wizard-content .pll-wizard-next-steps{margin:0 0 24px;overflow:hidden;padding-bottom:2px}.pll-wizard-content .pll-wizard-next-steps h2{margin-bottom:12px}.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-first{box-sizing:border-box;float:left;width:50%}.pll-wizard-content .pll-wizard-next-steps .pll-wizard-next-steps-last{box-sizing:border-box;float:right;width:50%}.pll-wizard-content .pll-wizard-next-steps ul{list-style:none outside;margin:0;padding:0 2em 0 0}.pll-wizard-content .pll-wizard-next-steps ul li a{display:block;padding:0 0 .75em}.pll-wizard-content .pll-wizard-next-steps ul li a:before{speak:none;color:#82878c;display:inline-block;font:normal 20px/1 dashicons;padding:0 10px 0 0;position:relative;text-decoration:none!important;top:1px;vertical-align:top}.pll-wizard-steps{color:#ccc;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;list-style:none outside;margin:0;overflow:hidden;padding:0 0 24px;width:100%}.pll-wizard-steps li{border-bottom:4px solid #ccc;float:left;line-height:1.4em;margin:0;padding:0 0 .8em;position:relative;text-align:center;width:100%}.pll-wizard-steps li a{color:#a03f3f;margin:-1.5em;padding:1.5em;position:relative;text-decoration:none;z-index:1}.pll-wizard-steps li a:focus,.pll-wizard-steps li a:hover{color:#dd5454;text-decoration:underline}.pll-wizard-steps li:before{background:#fff;border:4px solid #ccc;border-radius:100%;bottom:0;content:"";height:4px;left:50%;margin-bottom:-8px;margin-left:-6px;position:absolute;width:4px}.pll-wizard-steps li.active{border-color:#a03f3f;color:#a03f3f;font-weight:700}.pll-wizard-steps li.active:before{border-color:#a03f3f}.pll-wizard-steps li.done{border-color:#a03f3f;color:#a03f3f}.pll-wizard-steps li.done:before{background:#a03f3f;border-color:#a03f3f}.pll-wizard .pll-wizard-actions{margin:20px 0 0;overflow:hidden;position:relative}.pll-wizard .pll-wizard-actions .button{border-color:#a03f3f;border-radius:4px;box-shadow:none;color:#a03f3f;font-size:16px;font-weight:300;height:auto;line-height:1em;margin-bottom:2px;margin-right:.5em;margin-top:10px;min-width:auto;padding:1em 2em}.pll-wizard .pll-wizard-content .button{border-color:#a03f3f;color:#a03f3f}.pll-wizard .pll-wizard-actions .button-primary,.pll-wizard .pll-wizard-content .button-primary{background-color:#a03f3f;border-color:#a03f3f;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.25),0 1px 0 #a03f3f;color:#fff;margin:0;opacity:1;text-shadow:0 -1px 1px #a03f3f,1px 0 1px #a03f3f,0 1px 1px #a03f3f,-1px 0 1px #a03f3f}.pll-wizard .pll-wizard-content .button-small .dashicons{font-size:15px;height:auto;vertical-align:middle}.pll-wizard .button-primary:active,.pll-wizard .button-primary:focus,.pll-wizard .button-primary:hover,.pll-wizard input[type=checkbox]:focus+label.button-primary{background:#dd5454;border-color:#dd5454;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.25),0 1px 0 #dd5454}.pll-wizard .pll-wizard-actions .button-primary.disabled,.pll-wizard .pll-wizard-actions .button-primary:disabled,.pll-wizard .pll-wizard-actions .button-primary[disabled]{background-color:#bb5454!important;border-color:#bb5454!important;box-shadow:inset 0 1px 0 hsla(0,0%,100%,.25),0 1px 0 #bb5454!important;color:#ffa3a3!important;cursor:wait;text-shadow:0 -1px 1px #bb5454,1px 0 1px #bb5454,0 1px 1px #bb5454,-1px 0 1px #bb5454!important}.pll-wizard-content p:last-child{margin-bottom:0}.pll-wizard-footer-links{color:#7b7b7b;display:inline-block;font-size:.85em;margin:1.18em auto;text-align:center}.pll-wizard-services{border:1px solid #eee;border-radius:4px;list-style:none outside;margin:0 0 1em;overflow:hidden;padding:0}.pll-wizard-services p{font-size:1em;line-height:1.5em;margin:0 0 1em;padding:0}.pll-wizard-service-item{-webkit-box-pack:justify;-webkit-box-align:center;-webkit-align-items:center;align-items:center;border-bottom:1px solid #eee;color:#666;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;justify-content:space-between;padding:0}.media-step .pll-wizard-service-item{border:0}.media-step .pll-wizard-service-item:last-child{display:block}.media-step .pll-wizard-service-item .pll-wizard-service-enable{padding-bottom:0}.pll-wizard-service-item:last-child{border-bottom:0}.pll-wizard-service-item .pll-wizard-service-name{-webkit-box-align:baseline;-webkit-align-items:baseline;align-items:baseline;-webkit-align-self:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-basis:0;flex-basis:0;font-weight:700;min-width:160px;padding:2em 0;text-align:center}.pll-wizard-service-item .pll-wizard-service-name img{max-width:75px}.pll-wizard-service-item .pll-wizard-service-description{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;padding:20px}.pll-wizard-service-item .pll-wizard-service-example{padding:0 20px 20px}.pll-wizard-service-item .pll-wizard-service-example p{text-align:right}.rtl .pll-wizard-service-item .pll-wizard-service-example p{text-align:left}.pll-wizard-service-item .pll-wizard-service-description p{margin-bottom:1em}.pll-wizard-service-item .pll-wizard-service-description p:last-child{margin-bottom:0}.pll-wizard-service-item .pll-wizard-service-description .pll-wizard-service-settings-description{color:#999;display:block;font-style:italic}.pll-wizard-service-item .pll-wizard-service-enable{-webkit-box-ordinal-group:4;-webkit-align-self:flex-start;align-self:flex-start;cursor:pointer;-webkit-flex-basis:0;flex-basis:0;max-height:1.5em;min-width:75px;-webkit-order:3;order:3;padding:2em 0;position:relative;text-align:center}.pll-wizard-service-item .pll-wizard-service-toggle{position:relative}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]{opacity:0;position:absolute}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label{border-radius:10em;cursor:pointer;display:inline-block;height:20px;position:relative;text-indent:-9999px;width:44px}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:focus+label{border:1px dashed #777}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label:after,.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label:before{content:"";position:absolute}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label:before{background:#ddd;border-radius:10em;height:20px;left:0;top:0;transition:background-color .2s;width:44px}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]+label:after{background:#fff;border-radius:50%;height:16px;left:0;margin:2px;top:0;transition:all .2s;width:16px}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked+label:before{background:#a03f3f}.pll-wizard-service-item .pll-wizard-service-toggle input[type=checkbox]:checked+label:after{left:auto;right:0}.pll-wizard-service-item .pll-wizard-service-settings{cursor:default;display:none;margin-bottom:0;margin-top:.75em}.pll-wizard-service-item .pll-wizard-service-settings.hide{display:none}.pll-wizard-service-item.checked .pll-wizard-service-settings{display:inline-block}.pll-wizard-service-item.checked .pll-wizard-service-settings.hide{display:none}.pll-wizard-service-item.closed{border-bottom:0}.step{text-align:center}.pll-wizard .button .dashicons{vertical-align:middle}.rtl .dashicons-arrow-right-alt2:before{content:"\f341"}.pll-wizard .pll-wizard-actions .button:active,.pll-wizard .pll-wizard-actions .button:focus,.pll-wizard .pll-wizard-actions .button:hover{box-shadow:none}.pll-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.pll-wizard-next-steps li{padding:0}.pll-wizard-next-steps .pll-wizard-next-step-item{border-top:1px solid #eee;display:-webkit-box;display:-webkit-flex;display:flex}.pll-wizard-next-steps .pll-wizard-next-step-item.no-border,.pll-wizard-next-steps .pll-wizard-next-step-item:first-child{border-top:0}.pll-wizard-next-steps .pll-wizard-next-step-description{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;margin:1.5em}.pll-wizard-next-steps .pll-wizard-next-step-action{-webkit-box-flex:0;-webkit-box-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-grow:0;flex-grow:0}.pll-wizard-next-steps .pll-wizard-next-step-action .button{margin:1em 1.5em}.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-actions,.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-action .button,.pll-wizard-next-steps .pll-wizard-next-step-item.no-border .pll-wizard-next-step-description{margin-top:0}.pll-wizard-next-steps p.next-step-heading{font-size:.95em;font-variant:all-petite-caps;font-weight:400;margin:0}.pll-wizard-next-steps p.next-step-extra-info{margin:0}.pll-wizard-next-steps h3.next-step-description{font-size:16px;font-weight:600;margin:0}.pll-wizard-next-steps .pll-wizard-additional-steps{border-top:1px solid #eee}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-next-step-description{margin-bottom:0}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions{margin:0 0 1.5em}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.rtl .pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button{margin:1em 1.5em 1em 0}.pll-wizard-next-steps .pll-wizard-additional-steps .pll-wizard-actions .button::last-child{margin-right:1.5em}.pll-wizard-content img{margin-right:.5em;max-width:100%}.rtl .pll-wizard-content img{margin-left:.5em}.pll-wizard-content .form-field label{display:block;margin-bottom:5px}.pll-wizard-content .form-field select{padding:3px}.pll-wizard-content .languages-step select,.pll-wizard-content .untranslated-contents-step select{width:100%}.languages-step .form-field .button{margin-left:15px}.languages-step .form-field .button>span{margin-right:.3em}.rtl .languages-step .form-field .button{margin-left:0;margin-right:15px}.rtl .languages-step .form-field .button>span{margin-left:.3em;margin-right:0}.pll-wizard-content .languages-step .select-language-field{display:flex}.pll-wizard-content #languages{display:none}.pll-wizard-content #languages tr th:first-child{width:80%}.pll-wizard-content #languages .dashicons{color:#a03f3f}.pll-wizard-content #languages img{margin-right:5px}.pll-wizard-content .error{color:#a03f3f;font-weight:700}.pll-wizard-content #messages .error{background:#fccfcf;border:1px solid #a03f3f;margin-bottom:.5rem;padding:.5rem}.pll-wizard-content #slide-toggle{opacity:0;position:absolute}.pll-wizard-content #slide-toggle+label{position:relative}.pll-wizard-content #slide-toggle+label+span{display:block}.pll-wizard-content #slide-toggle+label .dashicons{margin-right:.3em}.rtl .pll-wizard-content #slide-toggle+label .dashicons{margin-left:.3em;margin-right:0}.pll-wizard-content #slide-toggle~#screenshot>img{margin-top:10px;max-height:500px;-webkit-transition:all .5s cubic-bezier(0,1,.5,1);transition:all .5s cubic-bezier(0,1,.5,1)}.pll-wizard-content #slide-toggle:checked~#screenshot>img{max-height:0}.hide{display:none}.field-in-error,input[type=checkbox].field-in-error,input[type=color].field-in-error,input[type=date].field-in-error,input[type=datetime-local].field-in-error,input[type=datetime].field-in-error,input[type=email].field-in-error,input[type=month].field-in-error,input[type=number].field-in-error,input[type=password].field-in-error,input[type=radio].field-in-error,input[type=search].field-in-error,input[type=tel].field-in-error,input[type=text].field-in-error,input[type=time].field-in-error,input[type=url].field-in-error,input[type=week].field-in-error,select.field-in-error,span.field-in-error,textarea.field-in-error{border-color:#a03f3f}.field-in-error:focus,input[type=checkbox].field-in-error:focus,input[type=color].field-in-error:focus,input[type=date].field-in-error:focus,input[type=datetime-local].field-in-error:focus,input[type=datetime].field-in-error:focus,input[type=email].field-in-error:focus,input[type=month].field-in-error:focus,input[type=number].field-in-error:focus,input[type=password].field-in-error:focus,input[type=radio].field-in-error:focus,input[type=search].field-in-error:focus,input[type=tel].field-in-error:focus,input[type=text].field-in-error:focus,input[type=time].field-in-error:focus,input[type=url].field-in-error:focus,input[type=week].field-in-error:focus,select.field-in-error:focus,span.field-in-error:focus,textarea.field-in-error:focus{border:1px solid #a03f3f;box-shadow:0 0 2px rgba(160,63,63,.8);outline-color:#a03f3f;outline-style:auto;outline-width:thin}.form-table input.regular-text{width:25em}.form-table input.field-in-error{border-color:#a03f3f}#pll-licenses-table td{padding:10px 9px}#pll-licenses-table .license-valid td p{min-width:35em}#pll-licenses-table .pll-deactivate-license{margin:0 0 0 20px}.rtl #pll-licenses-table .pll-deactivate-license{margin:0 10px 0 0}.pll-wizard-content .documentation{background:#f5f5f5;margin:0 0 24px;overflow:hidden;padding:24px 24px 0}.pll-wizard-content .documentation p{margin:0 0 12px;padding:0}.documentation-container{display:-webkit-box;display:-webkit-flex;display:flex;justify-content:flex-end}.documentation-container .documentation-button-container{-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.wc-setup .wc-setup-actions .button.documentation-button{height:42px;margin:0;padding:0 1em}#dialog{display:none}.pll-wizard .ui-dialog.ui-widget-content{max-height:none}.pll-wizard .ui-dialog-title:before{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f534";display:inline-block;font-family:dashicons;font-size:20px;font-style:normal;font-weight:400;height:20px;line-height:1;margin:0 5px 5px 0;text-align:center;text-decoration:inherit;text-rendering:auto;text-transform:none;transition:color .1s ease-in;vertical-align:middle;width:20px}.rtl.pll-wizard .ui-dialog-title:before{margin-left:5px;margin-right:0}.pll-wizard .ui-dialog ul{list-style:disc;padding-left:20px}.rtl.pll-wizard .ui-dialog ul{padding-left:0;padding-right:20px}.pll-wizard li{margin-bottom:0}#translations{border-collapse:collapse}#translations tbody:nth-child(odd){background-color:#f9f9f9}#translations.striped>tbody>:nth-child(odd){background-color:transparent}.pll-wizard-content mark{background:transparent none;color:#7ad03a}@media screen and (max-width:782px){.languages-step .form-field .button{font-size:13px;height:28px;line-height:26px;padding:0 10px 1px;vertical-align:top}#pll-licenses-table .pll-deactivate-license{margin:10px 0 5px}}@media only screen and (max-width:620px){.ui-dialog{width:100%!important}}@media only screen and (max-width:500px){#pll-logo a,.select-language-field{flex-direction:column}.select-language-field .action-buttons{display:flex;justify-content:flex-end}.languages-step .form-field .button{margin:5px 0 0}}@media only screen and (max-width:400px){#pll-logo{font-size:56px}.pll-wizard-steps{display:none}.pll-wizard-service-item{-webkit-flex-wrap:wrap;flex-wrap:wrap}.pll-wizard-service-item .pll-wizard-service-enable{-webkit-box-ordinal-group:3;-webkit-order:2;order:2;padding:20px 0 0}.pll-wizard-service-item .pll-wizard-service-description{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}.pll-wizard-service-item .pll-wizard-service-name{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;justify-content:space-between!important;padding:20px 20px 0;text-align:left}.pll-wizard-service-item .pll-wizard-service-name img{margin:0}.pll-wizard-next-steps .pll-wizard-next-step-item{-webkit-flex-wrap:wrap;flex-wrap:wrap}.pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-description{margin-bottom:0}.pll-wizard-next-steps .pll-wizard-next-step-item .pll-wizard-next-step-action p{margin:0}}@media only screen and (max-width:360px){#pll-logo{font-size:48px}}
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/include/format-util.php b/wp-content/plugins/polylang-pro/include/format-util.php
new file mode 100644
index 000000000..751921d10
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/include/format-util.php
@@ -0,0 +1,95 @@
+
+ */
+ private $patterns = array();
+
+ /**
+ * Filters the given list to return only the values whose the key or value matches the given format.
+ *
+ * @since 3.6
+ *
+ * @param array|Traversable $list An list with keys or values to match against `$format`.
+ * @param string $format A format, where `*` means "any characters" (`.*`), unless escaped.
+ * @param string $mode Optional. Tell if we should filter the keys or values from `$list`.
+ * Possible values are `'use_keys'` and `'use_values'`. Default is `'use_keys'`.
+ * @return array
+ *
+ * @template TArrayValue
+ * @phpstan-param ($mode is 'use_keys' ? array|Traversable : array|Traversable) $list
+ * @phpstan-param 'use_keys'|'values' $mode
+ * @phpstan-return ($mode is 'use_keys' ? array : array)
+ */
+ public function filter_list( $list, string $format, string $mode = 'use_keys' ): array {
+ $filter = function ( $key ) use ( $format ) {
+ return $this->matches( (string) $key, $format );
+ };
+
+ if ( ! is_array( $list ) ) {
+ $list = iterator_to_array( $list );
+ }
+
+ if ( 'use_values' === $mode ) {
+ return array_filter( $list, $filter );
+ }
+
+ return array_filter( $list, $filter, ARRAY_FILTER_USE_KEY );
+ }
+
+ /**
+ * Tells if the given string matches the given format.
+ *
+ * @since 3.6
+ *
+ * @param string $key A string to test.
+ * @param string $format A format, where `*` means "any characters" (`.*`), unless escaped.
+ * @return bool
+ */
+ public function matches( string $key, string $format ): bool {
+ if ( strpos( $format, '*' ) === false ) {
+ return $key === $format;
+ }
+
+ if ( '*' === $format ) {
+ return true;
+ }
+
+ if ( empty( $this->patterns[ $format ] ) ) {
+ $pattern = addcslashes( $format, '.+?[^]$(){}=!<>|:-#/' ); // Escape regular expression characters (list from `preg_quote()` but `*` and `\` are ignored).
+ $pattern = preg_replace(
+ array(
+ '/\\\(?!\*)/', // Escape `\` characters except if followed by `*`.
+ '/(?patterns[ $format ] = $pattern;
+ } else {
+ $pattern = $this->patterns[ $format ];
+ }
+
+ return (bool) preg_match( "/^{$pattern}$/", $key );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/include/functions.php b/wp-content/plugins/polylang-pro/include/functions.php
new file mode 100644
index 000000000..fef93f656
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/include/functions.php
@@ -0,0 +1,20 @@
+get_method(), array( 'PATCH', 'POST', 'PUT' ), true ) ) {
+ return true;
+ }
+
+ return 'GET' === $request->get_method() && 'edit' === $request->get_param( 'context' );
+}
diff --git a/wp-content/plugins/polylang-pro/include/pro.php b/wp-content/plugins/polylang-pro/include/pro.php
new file mode 100644
index 000000000..f1ff96cb1
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/include/pro.php
@@ -0,0 +1,103 @@
+ POLYLANG_VERSION );
+ $args['body']['plugins'] = wp_json_encode( $plugins );
+ }
+ }
+ return $args;
+ }
+
+ /**
+ * Remove Polylang from the list of plugins to update if it is not installed
+ *
+ * @since 2.1.1
+ *
+ * @param stdClass $value The value stored in the update_plugins site transient.
+ * @return stdClass
+ */
+ public function pre_set_site_transient_update_plugins( $value ) {
+ // We encountered a 3rd party plugin setting the transient before the function get_plugins() is available.
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
+ $plugins = get_plugins();
+
+ if ( isset( $value->response ) ) {
+ if ( empty( $plugins['polylang/polylang.php'] ) ) {
+ unset( $value->response['polylang/polylang.php'] );
+ } elseif ( isset( $value->response['polylang/polylang.php']->new_version ) && $plugins['polylang/polylang.php']['Version'] === $value->response['polylang/polylang.php']->new_version ) {
+ $value->no_update['polylang/polylang.php'] = $value->response['polylang/polylang.php'];
+ unset( $value->response['polylang/polylang.php'] );
+ }
+ }
+ return $value;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/integrations/acf/acf-auto-translate.php b/wp-content/plugins/polylang-pro/integrations/acf/acf-auto-translate.php
new file mode 100644
index 000000000..178a449e5
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/acf/acf-auto-translate.php
@@ -0,0 +1,491 @@
+fields[ $field['name'] ] = $field;
+ return $value;
+ }
+
+ /**
+ * Store fields when saving a term or when duplicating a term.
+ *
+ * @since 2.3
+ *
+ * @param int $term_id Id of the term being saved.
+ * @return void
+ */
+ public function store_term_fields( $term_id ) {
+ $this->fields = get_field_objects( 'term_' . $term_id );
+ }
+
+ /**
+ * Copies and possibly translates custom fields when creating a new term translation.
+ *
+ * @since 2.2
+ *
+ * @param mixed $value Custom field value of the source term.
+ * @param string $post_id Expects term_{$term_id} for a term.
+ * @param array $field Custom field.
+ * @return mixed
+ */
+ public function load_value( $value, $post_id, $field ) {
+ if ( 'term_0' === $post_id && isset( $_GET['taxonomy'], $_GET['from_tag'], $_GET['new_lang'] ) && taxonomy_exists( sanitize_key( $_GET['taxonomy'] ) ) && $lang = PLL()->model->get_language( sanitize_key( $_GET['new_lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+
+ $from_tag = (int) $_GET['from_tag']; // phpcs:ignore WordPress.Security.NonceVerification
+ $tr_id = 'term_' . $from_tag; // Converts to ACF internal id.
+ $fields = get_field_objects( $tr_id );
+
+ if ( ! empty( $fields ) ) {
+ $keys = array_keys( $fields );
+
+ /** This filter is documented in /polylang/modules/sync/admin-sync.php */
+ $keys = array_unique( apply_filters( 'pll_copy_term_metas', $keys, false, $from_tag, 0, $lang->slug ) );
+
+ // Second test to load the values of subfields of accepted fields.
+ if ( in_array( $field['name'], $keys ) || preg_match( '#^(' . implode( '|', $keys ) . ')_(.+)#', $field['name'] ) ) {
+ $value = acf_get_value( $tr_id, $field ); // Since ACF 5.0.0.
+ $empty = null; // Parameter 1 is useless in this context.
+ $value = $this->translate_fields( $empty, $value, $field['name'], $field, $lang->slug );
+
+ if ( pll_is_translated_post_type( 'acf-field-group' ) ) {
+ $references = $this->translate_fields_references( $tr_id, $lang->slug );
+ $this->translate_references_in_value( $value, $references );
+ }
+ }
+ }
+ }
+ return $value;
+ }
+
+ /**
+ * Translates a custom field before it is copied or synchronized.
+ *
+ * @since 2.3
+ * @since 2.4 Added parameter $to.
+ *
+ * @param mixed $value Meta value.
+ * @param string $key Meta key.
+ * @param string $lang Language of target.
+ * @param int $from Id of the object from which we copy informations.
+ * @param int $to Id of the object to which we copy informations.
+ * @return mixed
+ */
+ public function translate_meta( $value, $key, $lang, $from, $to = 0 ) {
+ if ( ! empty( $value ) && $field = isset( $this->fields[ $key ] ) ? $this->fields[ $key ] : $this->get_field_object( $key, $from ) ) {
+ $create_if_not_exists = false;
+
+ // Check if we should create translations if they don't exist.
+ // $to is not empty only when translating posts.
+ if ( ! empty( $to ) && ( $post_type = get_post_type( $to ) ) && pll_is_translated_post_type( $post_type ) ) {
+ $duplicate_options = get_user_meta( get_current_user_id(), 'pll_duplicate_content', true );
+ $active = ! empty( $duplicate_options ) && ! empty( $duplicate_options[ $post_type ] );
+ $create_if_not_exists = $active || PLL()->sync_post_model->are_synchronized( $from, $to );
+ }
+
+ $value = $this->translate_field( $value, $lang, $field, $create_if_not_exists );
+ }
+
+ if ( pll_is_translated_post_type( 'acf-field-group' ) && is_string( $value ) && acf_is_field_key( $value ) ) {
+ $references = $this->translate_fields_references( $from, $lang );
+
+ if ( isset( $references[ $value ] ) ) {
+ $value = $references[ $value ];
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * Returns an array containing all the field data for a given field name.
+ * Unlike the original ACF function, it works for clone fields.
+ *
+ * @since 2.6.2
+ *
+ * @param string $key The field name or key.
+ * @param string|int $post_id The post_id of which the value is saved against.
+ * @return array|false
+ */
+ protected function get_field_object( $key, $post_id ) {
+ $field = get_field_object( $key, $post_id );
+
+ if ( $field ) {
+ return $field;
+ }
+
+ $post_id = acf_get_valid_post_id( $post_id );
+ $field_key = acf_get_reference( $key, $post_id ); // Since ACF 5.6.5.
+
+ if ( ! is_string( $field_key ) ) {
+ return false;
+ }
+
+ $field_key = substr( $field_key, -19 ); // Keep the last key in field_xxx_field_yyy for clone fields.
+
+ if ( ! acf_is_field_key( $field_key ) ) {
+ return false;
+ }
+
+ $field = acf_get_field( $field_key );
+
+ if ( empty( $field ) ) {
+ return false;
+ }
+
+ $field['value'] = acf_get_value( $post_id, $field );
+ $field['value'] = acf_format_value( $field['value'], $post_id, $field );
+ return $field;
+ }
+
+ /**
+ * Translates a CPT archive link in a page link field.
+ *
+ * @since 2.3.6
+ *
+ * @param string $link CPT archive link.
+ * @param string $lang Language slug.
+ * @return string Modified link.
+ */
+ protected function translate_cpt_archive_link( $link, $lang ) {
+ $lang = PLL()->model->get_language( $lang );
+ $link = PLL()->links_model->switch_language_in_link( $link, $lang );
+
+ foreach ( array_keys( PLL()->translate_slugs->slugs_model->get_translatable_slugs() ) as $type ) {
+ // Unfortunately ACF does not pass the post type, so let's try with all post type archives.
+ if ( 0 === strpos( $type, 'archive_' ) ) {
+ $link = PLL()->translate_slugs->slugs_model->switch_translated_slug( $link, $lang, $type );
+ }
+ }
+ return $link;
+ }
+
+ /**
+ * Translates a custom field value.
+ *
+ * @since 2.3
+ * @since 2.4 Added parameter $create_if_not_exists.
+ *
+ * @param mixed $value Custom field value.
+ * @param string $lang Language slug.
+ * @param array $field Custom field.
+ * @param bool $create_if_not_exists Should we create the translation if it does not exist.
+ * @return mixed
+ */
+ protected function translate_field( $value, $lang, $field, $create_if_not_exists = false ) {
+ $return = $value;
+
+ switch ( $field['type'] ) {
+ case 'image':
+ case 'file':
+ if ( PLL()->options['media_support'] ) {
+ $return = 0;
+ if ( $tr_id = pll_get_post( $value, $lang ) ) {
+ $return = $tr_id;
+ } elseif ( $create_if_not_exists ) {
+ $return = PLL()->posts->create_media_translation( $value, $lang );
+ }
+ }
+ break;
+
+ case 'gallery':
+ if ( PLL()->options['media_support'] && is_array( $value ) ) {
+ $return = array();
+ foreach ( $value as $img ) {
+ if ( $tr_id = pll_get_post( $img, $lang ) ) {
+ $return[] = $tr_id;
+ } elseif ( $create_if_not_exists ) {
+ $return[] = PLL()->posts->create_media_translation( $img, $lang );
+ }
+ }
+ $return = array_map( 'strval', $return ); // See acf_field_gallery::update_value().
+ }
+ break;
+
+ case 'post_object':
+ case 'relationship':
+ if ( is_numeric( $value ) ) {
+ $return = 0;
+ if ( $tr_id = pll_get_post( $value, $lang ) ) {
+ $return = $tr_id;
+ }
+ } elseif ( is_array( $value ) ) {
+ $return = array();
+ foreach ( $value as $p ) {
+ if ( $tr_id = pll_get_post( $p, $lang ) ) {
+ $return[] = $tr_id;
+ }
+ }
+ $return = array_map( 'strval', $return ); // See the method update_value() for these fields.
+ }
+ break;
+
+ case 'page_link':
+ if ( is_numeric( $value ) ) {
+ // Unique translated post.
+ $return = 0;
+ if ( $tr_id = pll_get_post( $value, $lang ) ) {
+ $return = $tr_id;
+ }
+ } elseif ( is_array( $value ) ) {
+ // Multiple choice.
+ $return = array();
+ foreach ( $value as $p ) {
+ if ( is_numeric( $p ) && $tr_id = pll_get_post( $p, $lang ) ) {
+ $return[] = $tr_id;
+ } else {
+ $return[] = $this->translate_cpt_archive_link( $p, $lang ); // Archive.
+ }
+ }
+ $return = array_map( 'strval', $return ); // See acf_field_page_link::update_value().
+ } else {
+ $return = $this->translate_cpt_archive_link( $value, $lang ); // Archive.
+ }
+ break;
+
+ case 'taxonomy':
+ if ( pll_is_translated_taxonomy( $field['taxonomy'] ) ) {
+ if ( is_numeric( $value ) ) {
+ $return = 0;
+ if ( $tr_id = pll_get_term( $value, $lang ) ) {
+ $return = $tr_id;
+ }
+ } elseif ( is_array( $value ) ) {
+ $return = array();
+ foreach ( $value as $t ) {
+ if ( $tr_id = pll_get_term( $t, $lang ) ) {
+ $return[] = $tr_id;
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ return $return;
+ }
+
+ /**
+ * Translates repeater and flexible content sub fields (for recursive translation of this fields).
+ *
+ * @since 2.2
+ *
+ * @param array $r Reference to a flat list of translated custom fields.
+ * @param mixed $value Custom field value.
+ * @param string $name Custom field name.
+ * @param array $field ACF field or subfield.
+ * @param string $lang Language slug.
+ * @return array Hierarchical list of custom fields values.
+ */
+ protected function translate_sub_fields( &$r, $value, $name, $field, $lang ) {
+ $return = array();
+
+ foreach ( $value as $row => $sub_fields ) {
+ $sub = array();
+ foreach ( $sub_fields as $id => $sub_value ) {
+ $field = acf_get_field( substr( $id, -19 ) ); // Keep the last key in field_xxx_field_yyy for clone fields.
+ if ( $field ) {
+ $sub[ $id ] = $this->translate_fields( $r, $sub_value, $name . '_' . $row . '_' . $field['name'], $field, $lang );
+ } else {
+ $sub[ $id ] = $sub_value;
+ }
+ }
+ $return[] = $sub;
+ }
+
+ return $return;
+ }
+
+ /**
+ * Recursively translates custom group, repeater and flexible content fields.
+ *
+ * @since 2.0
+ *
+ * @param array $r Reference to a flat list of translated custom fields.
+ * @param mixed $value Custom field value.
+ * @param string $name Custom field name.
+ * @param array $field ACF field or subfield.
+ * @param string $lang Language slug.
+ * @return array Hierarchical list of custom fields values.
+ */
+ protected function translate_fields( &$r, $value, $name, $field, $lang ) {
+ if ( empty( $value ) ) {
+ return;
+ }
+
+ $r[ '_' . $name ] = $field['key'];
+
+ $return = array();
+
+ switch ( $field['type'] ) {
+ case 'group':
+ $sub = array();
+ foreach ( $value as $id => $sub_value ) {
+ if ( $field = acf_get_field( $id ) ) {
+ $sub[ $id ] = $this->translate_fields( $r, $sub_value, $name . '_' . $field['name'], $field, $lang );
+ } else {
+ $sub[ $id ] = $sub_value;
+ }
+ }
+ $return[] = $sub;
+ break;
+
+ case 'repeater':
+ case 'flexible_content':
+ $return = $this->translate_sub_fields( $r, $value, $name, $field, $lang );
+ break;
+
+ default:
+ $return = $this->translate_field( $value, $lang, $field );
+ break;
+ }
+
+ return empty( $return ) ? $value : $return;
+ }
+
+ /**
+ * Translated field groups:
+ * Recursively translates the references in value for repeaters and flexible content.
+ *
+ * @since 2.2
+ *
+ * @param array $value Reference to a custom field value.
+ * @param array $references List of custom fields references with source as key and translation as value.
+ * @return void
+ */
+ protected function translate_references_in_value( &$value, $references ) {
+ if ( is_array( $value ) ) {
+ foreach ( $value as $row => $sub_fields ) {
+ if ( is_array( $sub_fields ) ) {
+ foreach ( $sub_fields as $id => $sub_value ) {
+ if ( is_array( $sub_value ) ) {
+ $this->translate_references_in_value( $sub_value, $references );
+ }
+ if ( isset( $references[ $id ] ) ) {
+ $value[ $row ][ $references[ $id ] ] = $sub_value;
+ unset( $value[ $row ][ $id ] );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Translated field groups:
+ * Searches for fields having the same name in translated posts.
+ *
+ * @since 2.2
+ *
+ * @param int|string $from Source post id.
+ * @param string $lang Target language code.
+ * @return array
+ */
+ protected function translate_fields_references( $from, $lang ) {
+ $keys = array();
+ $fields = get_field_objects( $from );
+
+ if ( is_array( $fields ) ) {
+ foreach ( $fields as $field ) {
+ if ( $tr_group = pll_get_post( $field['parent'], $lang ) ) {
+ $tr_fields = acf_get_fields( $tr_group );
+ $this->translate_field_references( $keys, $field, $tr_fields );
+ }
+ }
+ }
+
+ return $keys;
+ }
+
+ /**
+ * Translated field groups:
+ * Loops through sub fields in the recursive search for fields
+ * having the same name among translated fields groups.
+ *
+ * @since 2.2
+ *
+ * @param array $keys Reference to an array mapping the fields keys of the translated post to the field keys of the currentpost.
+ * @param array $fields ACF Custom fields of the current post.
+ * @param array $tr_fields ACF Custom fields of a translation.
+ * @return void
+ */
+ protected function translate_sub_fields_references( &$keys, $fields, $tr_fields ) {
+ foreach ( $fields as $field ) {
+ $this->translate_field_references( $keys, $field, $tr_fields );
+ }
+ }
+
+ /**
+ * Translated field groups:
+ * Recursively searches for fields having the same name among translated fields groups.
+ *
+ * @since 2.2
+ *
+ * @param array $keys Reference to an array mapping the fields keys of the translated post to the field keys of the currentpost.
+ * @param array $field ACF Custom fields of the current post.
+ * @param array $tr_fields ACF Custom fields of a translation.
+ * @return void
+ */
+ protected function translate_field_references( &$keys, $field, $tr_fields ) {
+ $k = array_search( $field['name'], wp_list_pluck( $tr_fields, 'name' ) );
+ if ( false !== $k ) {
+ $keys[ $field['key'] ] = $tr_fields[ $k ]['key'];
+ if ( ! empty( $field['sub_fields'] ) ) {
+ $this->translate_sub_fields_references( $keys, $field['sub_fields'], $tr_fields[ $k ]['sub_fields'] );
+ }
+
+ if ( ! empty( $field['layouts'] ) ) {
+ foreach ( $field['layouts'] as $row => $layout ) {
+ if ( ! empty( $layout['sub_fields'] ) ) {
+ $this->translate_sub_fields_references( $keys, $layout['sub_fields'], $tr_fields[ $k ]['layouts'][ $row ]['sub_fields'] );
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/integrations/acf/acf-sync-metas.php b/wp-content/plugins/polylang-pro/integrations/acf/acf-sync-metas.php
new file mode 100644
index 000000000..235f2c6fd
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/acf/acf-sync-metas.php
@@ -0,0 +1,305 @@
+category ) {
+ add_action( "acf/render_field_settings/type={$type->name}", array( $this, 'render_field_settings' ) );
+ }
+ }
+
+ // Get the metas to copy or synchronize.
+ add_filter( 'pll_copy_post_metas', array( $this, 'copy_metas' ), 1, 4 );
+ add_filter( 'pll_copy_term_metas', array( $this, 'copy_term_metas' ), 1, 4 );
+
+ // Get the private metas to synchronize. Very late to wait for the complete list.
+ add_filter( 'pll_copy_post_metas', array( $this, 'copy_private_metas' ), 999, 3 );
+ add_filter( 'pll_copy_term_metas', array( $this, 'copy_private_metas' ), 998, 3 );
+
+ // It handles the translations of meta fields for import export.
+ add_filter( 'pll_post_metas_to_export', array( $this, 'get_fields_to_export' ), 10, 2 );
+ add_filter( 'pll_term_metas_to_export', array( $this, 'get_fields_to_export' ), 10, 2 );
+ }
+
+ /**
+ * Renders the translations setting.
+ *
+ * @since 2.7
+ *
+ * @param array $field ACF field.
+ * @param array $choices An array of choices for the select (value as key and label as value).
+ * @param string $default Default value for the select.
+ * @return void
+ */
+ protected function render_field_setting( $field, $choices, $default ) {
+ acf_render_field_setting( // Since ACF 5.7.10.
+ $field,
+ array(
+ 'label' => __( 'Translations', 'polylang-pro' ),
+ 'instructions' => '',
+ 'name' => 'translations',
+ 'type' => 'select',
+ 'choices' => $choices,
+ 'default_value' => $default,
+ ),
+ false // The setting is depending on the type of field.
+ );
+ }
+
+ /**
+ * Renders a default translations setting (no translate option).
+ *
+ * @since 2.7
+ * @since 3.3.1 Renamed and merged two methods.
+ *
+ * @param array $field ACF field.
+ * @return void
+ */
+ public function render_field_settings( $field ) {
+ $choices = array(
+ 'ignore' => __( 'Ignore', 'polylang-pro' ),
+ 'copy_once' => __( 'Copy once', 'polylang-pro' ),
+ 'sync' => __( 'Synchronize', 'polylang-pro' ),
+ );
+ $default = in_array( 'post_meta', PLL()->options['sync'] ) ? 'sync' : 'copy_once';
+
+ switch ( $field['type'] ) {
+ case 'text':
+ case 'textarea':
+ case 'wysiwyg':
+ if ( empty( $field['ID'] ) ) { // Workaround a bug in ACF which doesn't save options added after a field has been created.
+ $default = 'translate';
+ }
+ // Intentional fall-through to add the translate option below.
+
+ case 'oembed':
+ case 'url':
+ case 'email':
+ // Add translate option at the 3rd position.
+ $choices = array_merge(
+ array_slice( $choices, 0, 2 ),
+ array( 'translate' => __( 'Translate', 'polylang-pro' ) ),
+ array_slice( $choices, -1 )
+ );
+ break;
+ }
+ $this->render_field_setting( $field, $choices, $default );
+ }
+
+ /**
+ * Recursively constructs the map of translations properties for all metas.
+ *
+ * @since 2.7
+ * @since 3.2 Added the $sync_layout parameter.
+ *
+ * @param array $translations Reference to an array of meta keys.
+ * @param string $name Meta key.
+ * @param array $value ACF field value.
+ * @param array $field ACF field.
+ * @param bool $sync_layout Whether the layout field must be synchronized, passsed by reference.
+ * @return void
+ */
+ protected function get_translations( &$translations, $name, $value, $field, &$sync_layout = false ) {
+ switch ( $field['type'] ) {
+ case 'group':
+ foreach ( $field['sub_fields'] as $sub_field ) {
+ if ( isset( $value[ $sub_field['name'] ] ) ) {
+ $this->get_translations( $translations, "{$name}_{$sub_field['name']}", $value[ $sub_field['name'] ], $sub_field, $sync_layout );
+ }
+ }
+ break;
+
+ case 'repeater':
+ if ( is_array( $value ) ) {
+ foreach ( array_keys( $value ) as $row ) {
+ foreach ( $field['sub_fields'] as $sub_field ) {
+ if ( is_array( $value[ $row ] ) && isset( $value[ $row ][ $sub_field['name'] ] ) ) {
+ $this->get_translations( $translations, "{$name}_{$row}_{$sub_field['name']}", $value[ $row ][ $sub_field['name'] ], $sub_field, $sync_layout );
+ }
+ }
+ }
+ }
+
+ // A child field is synchronized or translatable. Let's synchronize the repeater.
+ if ( $sync_layout ) {
+ $translations['sync'][] = $name;
+ }
+ break;
+
+ case 'flexible_content':
+ if ( is_array( $value ) ) {
+ foreach ( array_keys( $value ) as $row ) {
+ foreach ( $field['layouts'] as $layout ) {
+ foreach ( $layout['sub_fields'] as $sub_field ) {
+ if ( is_array( $value[ $row ] ) && isset( $value[ $row ][ $sub_field['name'] ] ) ) {
+ $this->get_translations( $translations, "{$name}_{$row}_{$sub_field['name']}", $value[ $row ][ $sub_field['name'] ], $sub_field, $sync_layout );
+ }
+ }
+ }
+ }
+ }
+
+ // A child field is synchronized or translatable. Let's synchronize the flexible.
+ if ( $sync_layout ) {
+ $translations['sync'][] = $name;
+ }
+ break;
+
+ default:
+ if ( isset( $field['translations'] ) ) {
+ $translations[ $field['translations'] ][] = $name;
+
+ // If a field is synchronize or translatable, then all its parent layout fields must be synchronized.
+ if ( 'sync' === $field['translations'] || 'translate' === $field['translations'] ) {
+ $sync_layout = true;
+ }
+ }
+ break;
+ }
+ }
+
+ /**
+ * Gets the meta fields to translate.
+ *
+ * @since 3.3
+ *
+ * @param array $keys Array of metas keys to translate.
+ * @param int $from ID of the source object.
+ * @return array Array of updated metas keys to translate.
+ */
+ public function get_fields_to_export( $keys, $from ) {
+ $translations = $this->get_translation_options( $from );
+
+ $fields_to_export = array();
+ if ( ! empty( $translations['translate'] ) ) {
+ $fields_to_export = array_fill_keys( array_values( $translations['translate'] ), 1 );
+ }
+
+ return array_merge( $keys, $fields_to_export );
+ }
+
+ /**
+ * Gets the translation options.
+ *
+ * @since 2.7
+ * @since 3.3 The function has been split from copy_metas().
+ *
+ * @param string|int $from Id of the object from which we copy information.
+ * @param string|int $to Id of the object to which we copy information.
+ * @param bool $sync True if it is synchronization, false if it is a copy.
+ * @return array[] A list of arrays 'ignore', 'copy_once', 'translate' and 'sync' with their associated metas.
+ *
+ * @phpstan-return array{'ignore': array, 'copy_once': array, 'translate': array, 'sync': array}
+ */
+ protected function get_translation_options( $from, $to = 0, $sync = false ) {
+ // Init the translations array.
+ $translations = array_fill_keys(
+ array(
+ 'ignore',
+ 'copy_once',
+ 'translate',
+ 'sync',
+ ),
+ array()
+ );
+
+ $objects = get_field_objects( $from );
+
+ if ( $sync && empty( $objects ) ) {
+ // When saving a translation for the first, we don't have any field objects, so let's try to use fields of the target instead.
+ $objects = get_field_objects( $to );
+ }
+
+ // Get the metas sorted by their translations setting.
+ if ( is_array( $objects ) ) {
+ foreach ( $objects as $name => $object ) {
+ if ( ! empty( $object['value'] ) ) {
+ $this->get_translations( $translations, $name, $object['value'], $object );
+ }
+ }
+ }
+
+ return $translations;
+ }
+
+ /**
+ * Selects the metas to be copied or synchronized.
+ *
+ * @since 2.7
+ *
+ * @param string[] $metas List of custom fields names.
+ * @param bool $sync True if it is synchronization, false if it is a copy.
+ * @param string|int $from Id of the object from which we copy information.
+ * @param string|int $to Id of the object to which we copy information.
+ * @return string[]
+ */
+ public function copy_metas( $metas, $sync, $from, $to ) {
+ $translations = $this->get_translation_options( $from, $to, $sync );
+
+ if ( $sync ) {
+ $metas = array_diff( $metas, $translations['ignore'], $translations['copy_once'], $translations['translate'] );
+ $metas = array_merge( $metas, $translations['sync'] );
+ } else {
+ $metas = array_diff( $metas, $translations['ignore'] );
+ $metas = array_merge( $metas, $translations['sync'], $translations['copy_once'], $translations['translate'] );
+ }
+
+ return $metas;
+ }
+
+ /**
+ * Selects the term metas to be copied or synchronized.
+ *
+ * @since 2.7.4
+ *
+ * @param string[] $metas List of custom fields names.
+ * @param bool $sync True if it is synchronization, false if it is a copy.
+ * @param int $from Id of the object from which we copy informations.
+ * @param int $to Id of the object to which we copy informations.
+ * @return string[]
+ */
+ public function copy_term_metas( $metas, $sync, $from, $to ) {
+ return $this->copy_metas( $metas, $sync, 'term_' . $from, 'term_' . $to );
+ }
+
+ /**
+ * Selects the private ACF metas to be synchronized.
+ *
+ * @since 2.7
+ *
+ * @param string[] $metas List of custom fields names.
+ * @param bool $sync True if it is synchronization, false if it is a copy.
+ * @param int $from Id of the object from which we copy informations.
+ * @return string[]
+ */
+ public function copy_private_metas( $metas, $sync, $from ) {
+ $meta_type = substr( current_filter(), 9, 4 );
+
+ foreach ( get_metadata( $meta_type, $from ) as $key => $value ) {
+ $value = reset( $value );
+ if ( is_string( $value ) && acf_is_field_key( $value ) ) {
+ $metas[] = $key; // Private keys added to non private.
+ }
+ }
+
+ return $metas;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/integrations/acf/acf.php b/wp-content/plugins/polylang-pro/integrations/acf/acf.php
new file mode 100644
index 000000000..2a6bb31f3
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/acf/acf.php
@@ -0,0 +1,321 @@
+model->is_translated_post_type( 'acf-field-group' ) ) {
+ // Use a non-default priority to avoid changes in cache key due to undesired hooks order change.
+ add_filter( 'acf/get_cache_key', array( $this, 'filter_cache_key' ), 50, 2 );
+ add_filter( 'acf/rest/get_fields', array( $this, 'fix_rest_get_fields' ), 10, 2 );
+ }
+
+ add_filter( 'acf/get_taxonomies', array( $this, 'get_taxonomies' ) );
+
+ add_action( 'add_meta_boxes_acf-field-group', array( $this, 'remove_sync' ) );
+ add_action( 'add_meta_boxes_acf-field-group', array( $this, 'duplicate_field_group' ) );
+ add_filter( 'acf/duplicate_field/type=clone', array( $this, 'duplicate_clone_field' ) );
+
+ add_filter( 'acf/location/rule_match/page_type', array( $this, 'rule_match_page_type' ), 20, 3 ); // After ACF.
+
+ add_filter( 'pll_get_post_types', array( $this, 'get_post_types' ), 10, 2 );
+ add_filter( 'pll_bulk_translate_post_types', array( $this, 'bulk_translate_post_types' ) );
+
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
+
+ add_action( 'wp_ajax_acf_post_lang_choice', array( $this, 'acf_post_lang_choice' ) );
+
+ $this->sync_metas = new PLL_ACF_Sync_Metas();
+ $this->auto_translate = new PLL_ACF_Auto_Translate();
+ }
+
+ /**
+ * Adds the current language in the cache key to make sure that filtered queries
+ * are not cached for only one language.
+ *
+ * @since 3.2
+ *
+ * @param string $key Cache key.
+ * @param string $original Original unfiltered cache key.
+ * @return string
+ */
+ public function filter_cache_key( $key, $original ) {
+ $lang = pll_current_language();
+ if ( $lang && 'acf_get_field_group_posts' === $original ) {
+ $key .= ':lang=' . $lang;
+ }
+ return $key;
+ }
+
+
+ /**
+ * Works around a bug in ACF_Rest_Api::get_fields() which unlike get_field_objects()
+ * returns fields which may not belong to the requested object ID.
+ *
+ * @since 3.3.1
+ *
+ * @param array $fields An array of ACF fields.
+ * @param array $resource Contextual information about the current resource request.
+ * @return array
+ */
+ public function fix_rest_get_fields( $fields, $resource ) {
+ $field_object_ids = wp_list_pluck( get_field_objects( $resource['id'] ), 'ID' );
+
+ $fields = array_filter(
+ $fields,
+ function ( $field ) use ( $field_object_ids ) {
+ return in_array( $field['ID'], $field_object_ids );
+ }
+ );
+ return $fields;
+ }
+
+ /**
+ * Prevents ACF to display our private taxonomies.
+ *
+ * @since 2.8
+ *
+ * @param string[] $taxonomies Taxonomy names.
+ * @return string[]
+ */
+ public function get_taxonomies( $taxonomies ) {
+ return array_diff( $taxonomies, get_taxonomies( array( '_pll' => true ) ) );
+ }
+
+ /**
+ * Deactivates the synchronization for ACF field groups.
+ *
+ * @since 2.1
+ *
+ * @return void
+ */
+ public function remove_sync() {
+ foreach ( pll_languages_list() as $lang ) {
+ remove_action( "pll_before_post_translation_{$lang}", array( PLL()->sync_post->buttons[ $lang ], 'add_icon' ) );
+ }
+ }
+
+ /**
+ * Duplicates the field group if content duplication is activated.
+ *
+ * @since 2.3
+ *
+ * @param WP_Post $post Current post object.
+ * @return void
+ */
+ public function duplicate_field_group( $post ) {
+ if ( PLL()->model->is_translated_post_type( 'acf-field-group' ) && 'post-new.php' === $GLOBALS['pagenow'] && isset( $_GET['from_post'], $_GET['new_lang'] ) ) {
+ // Capability check already done in post-new.php.
+ check_admin_referer( 'new-post-translation' );
+
+ $duplicate_options = get_user_meta( get_current_user_id(), 'pll_duplicate_content', true );
+
+ $active = ! empty( $duplicate_options ) && ! empty( $duplicate_options['acf-field-group'] );
+
+ if ( $active ) {
+ acf_duplicate_field_group( (int) $_GET['from_post'], $post->ID );
+ }
+ }
+ }
+
+ /**
+ * Recursively searches a field by its name in an array of fields.
+ *
+ * @since 2.3
+ *
+ * @param string $name Field name.
+ * @param array $fields An array of fields.
+ * @return string Field key, empty string if not found.
+ */
+ protected function search_field_by_name( $name, $fields ) {
+ foreach ( $fields as $field ) {
+ if ( $name === $field['name'] ) {
+ return $field['key'];
+ } elseif ( ! empty( $field['sub_fields'] ) && $key = $this->search_field_by_name( $name, $field['sub_fields'] ) ) {
+ return $key;
+ } elseif ( ! empty( $field['layouts'] ) ) {
+ foreach ( $field['layouts'] as $layout ) {
+ if ( ! empty( $layout['sub_fields'] ) && $key = $this->search_field_by_name( $name, $layout['sub_fields'] ) ) {
+ return $key;
+ }
+ }
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Translates a clone field when creating a new field group translation.
+ *
+ * @since 2.3
+ *
+ * @param array $field ACF Custom field.
+ * @return array
+ */
+ public function duplicate_clone_field( $field ) {
+ if ( PLL()->model->is_translated_post_type( 'acf-field-group' ) && ! empty( $field['clone'] ) && 'post-new.php' === $GLOBALS['pagenow'] && isset( $_GET['from_post'], $_GET['new_lang'] ) ) {
+ check_admin_referer( 'new-post-translation' );
+
+ foreach ( $field['clone'] as $k => $selector ) {
+ if ( acf_is_field_group_key( $selector ) ) {
+ // Can't use acf_get_field_group() as it is filtered by language.
+ $posts = get_posts(
+ array(
+ 'post_type' => 'acf-field-group',
+ 'post_status' => array( 'publish', 'acf-disabled', 'trash' ),
+ 'name' => $selector,
+ 'update_post_meta_cache' => false,
+ 'lang' => '',
+ )
+ );
+
+ if ( ! empty( $posts ) && $tr_id = pll_get_post( $posts[0]->ID, sanitize_key( $_GET['new_lang'] ) ) ) {
+ $tr_group = acf_get_field_group( $tr_id );
+
+ $field['clone'][ $k ] = $tr_group['key'];
+ }
+ } elseif ( acf_is_field_key( $selector ) ) {
+ $_field = acf_get_field( $selector );
+ $ancestors = get_post_ancestors( $_field['ID'] );
+ $group_id = end( $ancestors );
+
+ if ( $tr_id = pll_get_post( $group_id, sanitize_key( $_GET['new_lang'] ) ) ) {
+ $tr_fields = acf_get_fields( $tr_id );
+
+ if ( $key = $this->search_field_by_name( $_field['name'], $tr_fields ) ) {
+ $field['clone'][ $k ] = $key;
+ }
+ }
+ }
+ }
+ }
+ return $field;
+ }
+
+ /**
+ * Allows page on front and page for posts translations to match the corresponding page type.
+ *
+ * @since 2.0
+ *
+ * @param bool $match Whether a location matches the rule.
+ * @param array $rule Field group location rule.
+ * @param array $screen Information on the current location.
+ * @return bool
+ */
+ public function rule_match_page_type( $match, $rule, $screen ) {
+ if ( ! empty( $screen['post_id'] ) ) {
+ $post = get_post( $screen['post_id'] );
+
+ if ( 'front_page' === $rule['value'] && $front_page = (int) get_option( 'page_on_front' ) ) {
+ $translations = pll_get_post_translations( $front_page );
+
+ if ( '==' === $rule['operator'] ) {
+ $match = in_array( $post->ID, $translations );
+ } elseif ( '!=' === $rule['operator'] ) {
+ $match = ! in_array( $post->ID, $translations );
+ }
+ } elseif ( 'posts_page' === $rule['value'] && $posts_page = (int) get_option( 'page_for_posts' ) ) {
+ $translations = pll_get_post_translations( $posts_page );
+
+ if ( '==' === $rule['operator'] ) {
+ $match = in_array( $post->ID, $translations );
+ } elseif ( '!=' === $rule['operator'] ) {
+ $match = ! in_array( $post->ID, $translations );
+ }
+ }
+ }
+
+ return $match;
+ }
+
+ /**
+ * Add the Field Groups post type to the list of translatable post types.
+ *
+ * @since 2.0
+ *
+ * @param string[] $post_types List of post types.
+ * @param bool $is_settings True when displaying the list of custom post types in Polylang settings.
+ * @return string[]
+ */
+ public function get_post_types( $post_types, $is_settings ) {
+ if ( $is_settings ) {
+ $post_types['acf-field-group'] = 'acf-field-group';
+ }
+ return $post_types;
+ }
+
+ /**
+ * Remove the Field Groups post type from the bulk translate action.
+ *
+ * @since 2.8.4
+ *
+ * @param string[] $types List of post type names for which Polylang manages the bulk translate.
+ * @return string[]
+ */
+ public function bulk_translate_post_types( $types ) {
+ return array_diff( $types, array( 'acf-field-group' ) );
+ }
+
+ /**
+ * Enqueues javascript to react to a language change in the post metabox.
+ *
+ * @since 2.0
+ *
+ * @return void
+ */
+ public function admin_enqueue_scripts() {
+ global $pagenow, $typenow;
+
+ if ( in_array( $pagenow, array( 'post.php', 'post-new.php' ) ) && ! in_array( $typenow, array( 'acf-field-group', 'attachment' ) ) && PLL()->model->is_translated_post_type( $typenow ) ) {
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+ wp_enqueue_script( 'pll_acf', plugins_url( '/js/build/acf' . $suffix . '.js', POLYLANG_ROOT_FILE ), array( 'acf-input' ), POLYLANG_VERSION );
+ }
+ }
+
+ /**
+ * Ajax response for changing the language in the post metabox
+ *
+ * @since 2.0
+ *
+ * @return void
+ */
+ public function acf_post_lang_choice() {
+ check_ajax_referer( 'pll_language', '_pll_nonce' );
+
+ if ( isset( $_POST['fields'] ) ) {
+ $x = new WP_Ajax_Response();
+ foreach ( array_map( 'sanitize_key', $_POST['fields'] ) as $field ) {
+ ob_start();
+ acf_render_field_wrap( acf_get_field( $field ), 'div', 'label' );
+ $x->Add( array( 'what' => str_replace( '_', '-', $field ), 'data' => ob_get_contents() ) );
+ ob_end_clean();
+ }
+
+ $x->send();
+ }
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/integrations/acf/js/acf.js b/wp-content/plugins/polylang-pro/integrations/acf/js/acf.js
new file mode 100644
index 000000000..33c6ca44a
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/acf/js/acf.js
@@ -0,0 +1,57 @@
+/**
+ * @package Polylang-Pro
+ */
+
+jQuery(
+ function ( $ ) {
+ /**
+ * Ajax for changing the post's language in the languages metabox.
+ */
+ $( '.post_lang_choice' ).on(
+ 'change',
+ function () {
+
+ // Reloads the relationship fields
+ if ( $( ".acf-field-relationship" ).length ) {
+ acf.doAction( 'ready' );
+ }
+
+ var fields = new Array();
+
+ $( '.acf-field-taxonomy' ).each(
+ function () {
+ var field = $( this ).attr( 'data-key' );
+ fields.push( field );
+ }
+ );
+
+ if ( 0 != fields.length ) {
+ var data = {
+ action: 'acf_post_lang_choice',
+ lang: $( this ).val(),
+ fields: fields,
+ _pll_nonce: $( '#_pll_nonce' ).val()
+ }
+
+ $.post(
+ ajaxurl,
+ data,
+ function (response) {
+ // Target a non existing WP HTML id to avoid a conflict with WP ajax requests.
+ var res = wpAjax.parseAjaxResponse( response, 'pll-ajax-response' );
+ $.each(
+ res.responses,
+ function () {
+ $el = $( '.acf-' + this.what )
+ // Data come from ACF field and server side.
+ $el.html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
+ acf.do_action( 'ready_field/type=' + $el.data( 'type' ), $el );
+ }
+ );
+ }
+ );
+ }
+ }
+ );
+ }
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/acf/load.php b/wp-content/plugins/polylang-pro/integrations/acf/load.php
new file mode 100644
index 000000000..42f2befe2
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/acf/load.php
@@ -0,0 +1,29 @@
+= 5.7.11.
+ return;
+ }
+
+ if ( ! did_action( 'pll_init' ) || ! PLL()->model->has_languages() ) {
+ // Run only if Polylang (and its API) is loaded, and if there is at least one language.
+ return;
+ }
+
+ add_action( 'init', array( PLL_Integrations::instance()->acf = new PLL_ACF(), 'init' ) );
+ }
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/admin-columns/cpac.php b/wp-content/plugins/polylang-pro/integrations/admin-columns/cpac.php
new file mode 100644
index 000000000..a8038987f
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/admin-columns/cpac.php
@@ -0,0 +1,72 @@
+model->get_translated_post_types() as $type ) {
+ if ( isset( $_REQUEST['list_screen'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $filter = 'manage_' . ( 'attachment' === $type ? 'upload' : 'edit-' . $type ) . '_columns';
+ add_filter( $filter, array( $this, 'remove_filter_lang' ), 90 ); // Before Polylang.
+ }
+
+ $filter = 'option_cpac_options_' . ( 'attachment' === $type ? 'wp-media' : $type ) . '__default';
+ add_filter( $filter, array( $this, 'filter_default_columns' ) );
+ }
+ }
+
+ /**
+ * Deactivates the admin language filter on Admin Columns settings page.
+ *
+ * @since 2.4
+ *
+ * @param array $columns List of table columns.
+ * @return array
+ */
+ public function remove_filter_lang( $columns ) {
+ PLL()->filters_columns->filter_lang = '';
+ return $columns;
+ }
+
+ /**
+ * Fixes the Polylang columns in default columns.
+ *
+ * @since 2.4
+ *
+ * @param array $columns List of table columns.
+ * @return array
+ */
+ public function filter_default_columns( $columns ) {
+ $screen = get_current_screen();
+
+ if ( isset( $screen->base ) ) {
+ $is_post_type = 'edit' === $screen->base && has_filter( 'manage_edit-' . $screen->post_type . '_columns', array( PLL()->filters_columns, 'add_post_column' ) );
+ $is_media = 'upload' === $screen->base && has_filter( 'manage_upload_columns', array( PLL()->filters_columns, 'add_post_column' ) );
+
+ if ( $is_post_type || $is_media ) {
+ foreach ( pll_languages_list() as $lang ) {
+ unset( $columns[ 'language_' . $lang ] );
+ }
+
+ $columns = PLL()->filters_columns->add_post_column( $columns );
+ }
+ }
+
+ return $columns;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/integrations/admin-columns/load.php b/wp-content/plugins/polylang-pro/integrations/admin-columns/load.php
new file mode 100644
index 000000000..89b7586b6
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/admin-columns/load.php
@@ -0,0 +1,17 @@
+cpac = new PLL_CPAC(), 'init' ) );
+ }
+ }
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/beaver-builder/flbuilder.php b/wp-content/plugins/polylang-pro/integrations/beaver-builder/flbuilder.php
new file mode 100644
index 000000000..212ec6b04
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/beaver-builder/flbuilder.php
@@ -0,0 +1,41 @@
+flbuilder = new PLL_FLBuilder();
+ }
+ }
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/content-blocks/content-blocks.php b/wp-content/plugins/polylang-pro/integrations/content-blocks/content-blocks.php
new file mode 100644
index 000000000..b34c113ce
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/content-blocks/content-blocks.php
@@ -0,0 +1,40 @@
+content_blocks = new PLL_Content_Blocks(), 'init' ) );
+ }
+ },
+ 0
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/cptui/cptui.php b/wp-content/plugins/polylang-pro/integrations/cptui/cptui.php
new file mode 100644
index 000000000..5d020d281
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/cptui/cptui.php
@@ -0,0 +1,98 @@
+ array(
+ 'label' => 1,
+ 'singular_label' => 1,
+ 'description' => 1,
+ 'labels' => array(
+ '*' => 1,
+ ),
+ ),
+ );
+
+ new PLL_Translate_Option( 'cptui_post_types', $keys, array( 'context' => 'CPT UI' ) );
+ new PLL_Translate_Option( 'cptui_taxonomies', $keys, array( 'context' => 'CPT UI' ) );
+
+ if ( PLL() instanceof PLL_Frontend && ! PLL()->options['force_lang'] ) {
+ // Special case when the language is set from the content as CPT and taxonomies are registered before the language is defined.
+ add_action( 'pll_language_defined', array( $this, 'pll_language_defined' ) );
+ }
+
+
+ // Add CPT UI post types and taxonomies to Polylang settings.
+ add_filter( 'pll_get_post_types', array( $this, 'pll_get_types' ), 10, 2 );
+ add_filter( 'pll_get_taxonomies', array( $this, 'pll_get_types' ), 10, 2 );
+ }
+
+ /**
+ * Translates custom post types and taxonomies labels when the language is set from the content.
+ *
+ * @since 2.1
+ *
+ * @param array $types Array of registered post types or taxonomies.
+ * @param array $cptui_types Array of CPT UI post types or taxonomies.
+ */
+ public function translate_registered_types( $types, $cptui_types ) {
+ foreach ( $types as $name => $type ) {
+ if ( in_array( $name, $cptui_types ) ) {
+ $type->label = pll__( $type->label );
+ $type->description = pll__( $type->description );
+
+ foreach ( array_keys( get_object_vars( $type->labels ) ) as $key ) {
+ $type->labels->$key = pll__( $type->labels->$key );
+ }
+ }
+ }
+ }
+
+ /**
+ * Translates custom post types and taxonomies labels when the language is set from the content.
+ *
+ * @since 2.1
+ */
+ public function pll_language_defined() {
+ $this->translate_registered_types( $GLOBALS['wp_post_types'], array_keys( get_option( 'cptui_post_types', array() ) ) );
+ $this->translate_registered_types( $GLOBALS['wp_taxonomies'], array_keys( get_option( 'cptui_taxonomies', array() ) ) );
+ }
+
+ /**
+ * Add CPT UI post types and taxonomies to Polylang settings.
+ *
+ * @since 2.1
+ *
+ * @param string[] $types List of post type or taxonomy names.
+ * @param bool $is_settings True when displaying the list in Polylang settings.
+ * @return string[]
+ */
+ public function pll_get_types( $types, $is_settings ) {
+ if ( $is_settings ) {
+ $type = substr( current_filter(), 8 );
+ $cptui_types = get_option( "cptui_{$type}" );
+
+ if ( is_array( $cptui_types ) ) {
+ $types = array_merge( $types, array_keys( $cptui_types ) );
+ }
+ }
+ return $types;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/integrations/cptui/load.php b/wp-content/plugins/polylang-pro/integrations/cptui/load.php
new file mode 100644
index 000000000..a7eb0a80b
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/cptui/load.php
@@ -0,0 +1,18 @@
+cptui = new PLL_CPTUI(), 'init' ) );
+ }
+ },
+ 0
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/divi/divi-builder.php b/wp-content/plugins/polylang-pro/integrations/divi/divi-builder.php
new file mode 100644
index 000000000..926308ce1
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/divi/divi-builder.php
@@ -0,0 +1,49 @@
+divi_builder = new PLL_Divi_Builder();
+ }
+ }
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/events-calendar/load.php b/wp-content/plugins/polylang-pro/integrations/events-calendar/load.php
new file mode 100644
index 000000000..30a18bdc1
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/events-calendar/load.php
@@ -0,0 +1,18 @@
+tec = new PLL_TEC(), 'init' ) );
+ }
+ },
+ 0
+);
diff --git a/wp-content/plugins/polylang-pro/integrations/events-calendar/tec.php b/wp-content/plugins/polylang-pro/integrations/events-calendar/tec.php
new file mode 100644
index 000000000..010cfd9b0
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/integrations/events-calendar/tec.php
@@ -0,0 +1,1272 @@
+model->has_languages() ) {
+ return;
+ }
+
+ $this->polylang = $polylang;
+ $this->curlang = null;
+ $this->slugs_model = ! empty( $polylang->translate_slugs ) && ! empty( $polylang->translate_slugs->slugs_model ) ? $polylang->translate_slugs->slugs_model : null;
+ $this->is_tec_rest_request = array();
+ $this->translatable_slug_ids = array();
+
+ add_filter( 'pll_get_taxonomies', array( $this, 'translate_taxonomies' ), 10, 2 );
+ add_filter( 'pll_get_post_types', array( $this, 'translate_types' ), 10, 2 );
+
+ add_action( 'save_post_' . Venue::POSTTYPE, array( $this, 'set_language' ), 10, 3 );
+ add_action( 'save_post_' . Organizer::POSTTYPE, array( $this, 'set_language' ), 10, 3 );
+
+ $tec = TEC::instance();
+
+ if ( empty( $polylang->options['force_lang'] ) ) {
+ add_action( 'pll_language_defined', array( $this, 'fix_date_translations' ) );
+ }
+
+ self::$metas = array_merge( $tec->metaTags, $tec->venueTags, $tec->organizerTags, array( '_VenueShowMap', '_VenueShowMapLink' ) );
+
+ if ( isset( $GLOBALS['pagenow'], $_GET['from_post'], $_GET['new_lang'] ) && 'post-new.php' === $GLOBALS['pagenow'] ) {
+ check_admin_referer( 'new-post-translation' );
+
+ // Defaults values for events
+ foreach ( self::$metas as $meta ) {
+ $filter = str_replace( array( '_Event', '_Organizer', '_Venue' ), array( '', 'Organizer', 'Venue' ), $meta );
+ add_filter( 'tribe_get_meta_default_value_' . $filter, array( $this, 'copy_event_meta' ), 10, 4 ); // Since TEC 4.0.7.
+ }
+
+ add_filter( 'tribe_display_event_linked_post_dropdown_id', array( $this, 'translate_linked_post' ) );
+ }
+
+ add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ), 60 ); // After `Tribe__Events__Query->pre_get_posts()`.
+
+ add_filter( 'pll_copy_post_metas', array( $this, 'copy_post_metas' ) );
+ add_filter( 'pll_translate_post_meta', array( $this, 'translate_meta' ), 10, 3 );
+
+ // Translate links with translated slugs
+ add_action( 'init', array( $this, 'reset_slugs' ), 11 ); // Just after `Tribe__Events__Main->init()`.
+ add_filter( 'register_taxonomy_args', array( $this, 'register_taxonomy_args' ), 10, 2 );
+ add_filter( 'tribe_events_get_link', array( $this, 'get_link' ) );
+ add_filter( 'pll_get_archive_url', array( $this, 'pll_get_archive_url' ), 10, 2 );
+ add_filter( 'pll_term_link', array( $this, 'filter_tec_term_link' ), 5, 3 ); // Before `PLL_Translate_Slugs->pll_term_link()`.
+ add_filter( 'pll_translated_slugs', array( $this, 'pll_translated_slugs' ), 10, 3 );
+ add_filter( 'pll_sanitize_string_translation', array( $this, 'sanitize_string_translation' ), 10, 2 );
+ add_filter( 'tribe_events_rewrite_i18n_slugs_raw', array( $this, 'rewrite_slugs' ) );
+
+ // Options to translate.
+ $keys = array(
+ 'dateWithYearFormat' => 1,
+ 'dateWithoutYearFormat' => 1,
+ 'monthAndYearFormat' => 1,
+ 'dateTimeSeparator' => 1,
+ 'timeRangeSeparator' => 1,
+ 'tribeEventsBeforeHTML' => 1,
+ 'tribeEventsAfterHTML' => 1,
+ );
+
+ $args = array(
+ 'context' => 'The Events Calendar',
+ 'sanitize_callback' => array( $this, 'sanitize_strings' ),
+ );
+
+ new PLL_Translate_Option( 'tribe_events_calendar_options', $keys, $args );
+
+ // TEC views V2.
+ add_filter( 'tribe_events_rewrite_i18n_domains', '__return_empty_array', 10000 ); // No i18n domains, no translations to deal with.
+ add_filter( 'tribe_events_rewrite_i18n_slugs', array( $this, 'fix_escaped_dashes_in_slugs' ), 10, 2 );
+
+ add_filter( 'tribe_events_category_slug', array( $this, 'get_category_slug' ) );
+ add_filter( 'tribe_events_tag_slug', array( $this, 'get_tag_slug' ) );
+
+ add_filter( 'tribe_events_views_v2_endpoint_url', array( $this, 'add_missing_lang_to_rest_url' ) );
+ add_filter( 'locale', array( $this, 'filter_locale_for_rest' ), 5 );
+
+ add_filter( 'tribe_events_views_v2_publicly_visible_views_query_args', array( $this, 'add_language_to_publicly_visible_views_query_args' ), 5 );
+ add_filter( 'tribe_events_views_v2_view_template_vars', array( $this, 'translate_widget_view_more_link' ), 5 );
+ add_filter( 'tribe_rewrite_parse_query_vars', array( $this, 'force_language_on_tec_parse_query_vars' ), 10, 3 );
+ add_filter( 'tribe_events_views_v2_url_query_args', array( $this, 'add_missing_lang_to_query_arg' ) );
+ add_filter( 'tribe_rewrite_pre_canonical_url', array( $this, 'add_missing_lang_to_non_canonical_url' ), 10, 2 );
+ add_filter( 'tribe_rewrite_pre_canonical_url', array( $this, 'remove_name_arg_from_non_canonical_url' ), 10, 2 );
+
+ add_filter( 'tribe_rewrite_canonical_url', array( $this, 'fix_language_in_canonical_url' ), 5, 2 );
+ add_filter( 'tribe_rewrite_canonical_url', array( $this, 'translate_canonical_url' ), 5, 2 );
+ }
+
+ /**
+ * Language and translation management for taxonomies.
+ *
+ * @since 2.2
+ *
+ * @param string[] $taxonomies List of taxonomy names for which Polylang manages language and translations.
+ * @param bool $hide True when displaying the list in Polylang settings.
+ * @return string[] List of taxonomy names for which Polylang manages language and translations.
+ */
+ public function translate_taxonomies( $taxonomies, $hide ) {
+ // Hide from Polylang settings
+ return $hide ? array_diff( $taxonomies, array( TEC::TAXONOMY ) ) : array_merge( $taxonomies, array( TEC::TAXONOMY ) );
+ }
+
+ /**
+ * Language and translation management for custom post types.
+ *
+ * @since 2.2
+ *
+ * @param string[] $types List of post type names for which Polylang manages language and translations.
+ * @param bool $hide True when displaying the list in Polylang settings.
+ * @return string[] List of post type names for which Polylang manages language and translations.
+ */
+ public function translate_types( $types, $hide ) {
+ $tec_types = array( TEC::POSTTYPE, TEC::VENUE_POST_TYPE, TEC::ORGANIZER_POST_TYPE );
+ return $hide ? array_diff( $types, $tec_types ) : array_merge( $types, $tec_types );
+ }
+
+ /**
+ * Save the language of Venues and Organizers.
+ * Needed when they are created from the Event form.
+ *
+ * @since 2.2
+ *
+ * @param int $post_id Post id.
+ * @param WP_Post $post Post object.
+ * @param bool $update Whether it is an update or not.
+ * @return void
+ */
+ public function set_language( $post_id, $post, $update ) {
+ if ( $update || ! isset( $_POST['post_lang_choice'] ) ) {
+ return;
+ }
+
+ $post_type_object = get_post_type_object( $post->post_type );
+
+ if ( ! $post_type_object || ! current_user_can( $post_type_object->cap->create_posts ) ) {
+ return;
+ }
+
+ check_admin_referer( 'pll_language', '_pll_nonce' );
+ $lang = $this->polylang->model->get_language( sanitize_key( $_POST['post_lang_choice'] ) );
+
+ if ( ! $lang ) {
+ return;
+ }
+
+ $this->polylang->model->post->set_language( $post_id, $lang );
+ }
+
+ /**
+ * Once the language is set from content, this resets all the date-related translations in TEC to the current lang.
+ * In `Tribe__Date_Utils`, TEC stores these translations in static private properties before the language is set in
+ * PLL. Then these translations are use later, AFTER the language is set in PLL, leading to views exploding due to
+ * array keys not being set.
+ * The filter 'tribe_events_get_days_of_week' can't be used because it doesn't include the function's arg `$format`.
+ *
+ * @since 3.1
+ * @see tribe_events_get_days_of_week()
+ *
+ * @return void
+ */
+ public function fix_date_translations() {
+ $properties = array(
+ 'localized_months_full',
+ 'localized_months_short',
+ 'localized_weekdays',
+ 'localized_months',
+ );
+
+ foreach ( $properties as $property ) {
+ $property = new ReflectionProperty( Tribe__Date_Utils::class, $property );
+ $property->setAccessible( true );
+ $property->setValue( array() );
+ }
+
+ TEC::instance()->setup_l10n_strings();
+ }
+
+ /**
+ * Populates default event metas for a newly created event translation
+ *
+ * @since 2.2
+ *
+ * @param mixed $value Meta value.
+ * @param int $id Post id.
+ * @param string $meta Meta key.
+ * @param bool $single Whether to return a single value.
+ * @return mixed
+ */
+ public function copy_event_meta( $value, $id, $meta, $single ) {
+ if ( ! empty( $_GET['from_post'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $value = get_post_meta( (int) $_GET['from_post'], $meta, $single ); // phpcs:ignore WordPress.Security.NonceVerification
+ }
+ return $value;
+ }
+
+ /**
+ * Populates default values for venues and organizers for a newly created event translation.
+ *
+ * @since 2.2
+ *
+ * @param array $posts Array of linked posts.
+ * @return array
+ */
+ public function translate_linked_post( $posts ) {
+ if ( empty( $posts ) || ! isset( $_GET['new_lang'] ) ) {
+ return $posts;
+ }
+
+ check_admin_referer( 'new-post-translation' );
+
+ $lang = $this->polylang->model->get_language( sanitize_key( $_GET['new_lang'] ) ); // Make sure this is a valid language.
+
+ if ( empty( $lang ) ) {
+ return $posts;
+ }
+
+ $lang = $lang->slug;
+ $post_metas = ! empty( $this->polylang->sync ) && ! empty( $this->polylang->sync->post_metas ) ? $this->polylang->sync->post_metas : false;
+
+ foreach ( $posts as $key => $post_id ) {
+ $tr_id = pll_get_post( $post_id, $lang );
+
+ if ( ! empty( $tr_id ) ) {
+ $posts[ $key ] = $tr_id;
+ continue;
+ }
+
+ // If the translated venue or organizer doesn't exist, create it.
+ $post = get_post( $post_id, ARRAY_A ); // Output as an array for `wp_insert_post()`.
+
+ if ( empty( $post ) ) {
+ // `null` value.
+ continue;
+ }
+
+ unset( $post['ID'] );
+
+ $tr_id = wp_insert_post( wp_slash( $post ) );
+
+ if ( ! is_int( $tr_id ) ) {
+ // `WP_Error` value.
+ continue;
+ }
+
+ $translations = pll_get_post_translations( $post_id );
+ $translations[ $lang ] = $tr_id;
+
+ pll_set_post_language( $tr_id, $lang );
+ pll_save_post_translations( $translations );
+
+ if ( ! empty( $post_metas ) ) {
+ $post_metas->copy( $post_id, $tr_id, $lang );
+ }
+
+ $posts[ $key ] = $tr_id;
+ }
+
+ return $posts;
+ }
+
+ /**
+ * Removes date filters when searching for untranslated events in the metabox autocomplete field
+ *
+ * @since 2.2.8
+ *
+ * @return void
+ */
+ public function pre_get_posts() {
+ if ( wp_doing_ajax() && isset( $_GET['action'] ) && 'pll_posts_not_translated' === $_GET['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification
+ // See Tribe__Events__Query::pre_get_posts() when should_remove_date_filters() returns true
+ remove_filter( 'posts_where', array( 'Tribe__Events__Query', 'posts_where' ) );
+ remove_filter( 'posts_fields', array( 'Tribe__Events__Query', 'posts_fields' ) );
+ remove_filter( 'posts_orderby', array( 'Tribe__Events__Query', 'posts_orderby' ) );
+ }
+ }
+
+ /**
+ * Synchronize event metas.
+ *
+ * @since 2.2
+ *
+ * @param array $metas Custom fields to copy or synchronize.
+ * @return array
+ */
+ public function copy_post_metas( $metas ) {
+ return array_merge( $metas, self::$metas );
+ }
+
+ /**
+ * Translate venues and organizers before they are copied or synchronized.
+ *
+ * @since 2.3
+ *
+ * @param mixed $value Meta value.
+ * @param string $key Meta key.
+ * @param string $lang Language of target.
+ * @return mixed
+ */
+ public function translate_meta( $value, $key, $lang ) {
+ if ( ( '_EventVenueID' === $key || '_EventOrganizerID' === $key ) && $tr_value = pll_get_post( $value, $lang ) ) {
+ $value = $tr_value;
+ }
+ return $value;
+ }
+
+ /**
+ * Resets all TEC translated slugs to an English value as the TEC slug translation system
+ * does not work in a multilingual context (TEC 4.4.5 + WP 4.7.3).
+ *
+ * @since 2.2
+ *
+ * @return void
+ */
+ public function reset_slugs() {
+ $tec = TEC::instance();
+
+ foreach ( $this->get_slugs_to_reset() as $key => $slug ) {
+ $tec->$key = $slug;
+ }
+
+ // Those are deprecated since TEC 4.0 and should not appear in the list of translatable strings anymore.
+ $tec->taxRewriteSlug = $tec->rewriteSlug . '/category';
+ $tec->tagRewriteSlug = $tec->rewriteSlug . '/tag';
+ }
+
+ /**
+ * Resets the category base rewrite slug in taxonomy.
+ *
+ * @since 2.2
+ *
+ * @param array $args Array of arguments for registering a taxonomy.
+ * @param string $taxonomy Taxonomy key.
+ * @return array
+ */
+ public function register_taxonomy_args( $args, $taxonomy ) {
+ if ( TEC::TAXONOMY === $taxonomy && is_array( $args['rewrite'] ) ) {
+ $args['rewrite']['slug'] = TEC::instance()->rewriteSlug . '/category';
+ }
+
+ return $args;
+ }
+
+ /**
+ * Filters the links to add the language code.
+ *
+ * @since 2.2
+ *
+ * @param string $link Link generated by The Events Calendar.
+ * @return string
+ */
+ public function get_link( $link ) {
+ $curlang = $this->get_curlang();
+
+ if ( empty( $curlang ) || empty( $this->slugs_model ) ) {
+ return $link;
+ }
+
+ $link = $this->polylang->links_model->add_language_to_link( $link, $curlang );
+
+ foreach ( $this->get_translatable_slug_ids() as $slug_id ) {
+ $link = $this->slugs_model->translate_slug( $link, $curlang, $slug_id );
+ }
+
+ return $link;
+ }
+
+ /**
+ * Translates slugs in the language switcher.
+ *
+ * @since 2.2
+ *
+ * @param string $url Url in the language switcher.
+ * @param PLL_Language $language Language object.
+ * @return string Modified url.
+ */
+ public function pll_get_archive_url( $url, $language ) {
+ if ( empty( $this->slugs_model ) || ! is_post_type_archive( TEC::POSTTYPE ) ) {
+ return $url;
+ }
+
+ foreach ( $this->get_translatable_slug_ids() as $slug_id ) {
+ $url = $this->slugs_model->switch_translated_slug( $url, $language, $slug_id );
+ }
+
+ return $url;
+ }
+
+ /**
+ * Modifies term links for the taxonomies used by TEC.
+ * In `PLL_TEC->reset_slugs()` we don't include the full taxonomy slug (`Tribe__Events__Main->taxRewriteSlug`) in
+ * our translated strings, as it is deprecated in TEC 4.0 and also a composite of
+ * `{post type archive slug}/{tax base slug}`. This explains why this method is needed.
+ *
+ * @since 3.1
+ * @see PLL_TEC->reset_slugs()
+ * @see PLL_TEC->pll_translated_slugs()
+ *
+ * @param string $url The term link.
+ * @param PLL_Language $lang The term language.
+ * @param WP_Term $term The term object.
+ * @return string
+ */
+ public function filter_tec_term_link( $url, $lang, $term ) {
+ if ( empty( $this->slugs_model ) || TEC::TAXONOMY !== $term->taxonomy ) {
+ return $url;
+ }
+
+ $url = $this->slugs_model->translate_slug( $url, $lang, 'archive_' . TEC::POSTTYPE );
+ return $this->slugs_model->translate_slug( $url, $lang, 'tribe_category' );
+ }
+
+ /**
+ * Fixes the events slug in translatable slugs.
+ * Translates other TEC slugs.
+ *
+ * @since 2.2
+ *
+ * @param array $slugs Translated slugs.
+ * @param PLL_Language $language Language object.
+ * @param PLL_MO $mo Strings translations object.
+ * @return array
+ */
+ public function pll_translated_slugs( $slugs, $language, &$mo ) {
+ /**
+ * In `PLL_TEC->reset_slugs()` we don't include the full taxonomy slug (`Tribe__Events__Main->taxRewriteSlug`) in
+ * our translated strings, as it is deprecated in TEC 4.0 and also a composite of
+ * `{post type archive slug}/{tax base slug}`. This is why we unset `$slugs[ TEC::TAXONOMY ]` here.
+ */
+ unset( $slugs[ 'archive_' . TEC::POSTTYPE ]['hide'], $slugs[ TEC::TAXONOMY ] );
+
+ $slugs[ 'archive_' . TEC::POSTTYPE ]['slug'] = $slug = TEC::instance()->getRewriteSlug();
+ $tr_slug = $mo->translate( $slug );
+ $slugs[ 'archive_' . TEC::POSTTYPE ]['translations'][ $language->slug ] = empty( $tr_slug ) ? $slug : $tr_slug;
+
+ foreach ( $this->get_slugs_to_reset() as $slug ) {
+ $slugs[ 'tribe_' . $slug ]['slug'] = $slug;
+ $tr_slug = $mo->translate( $slug );
+ $slugs[ 'tribe_' . $slug ]['translations'][ $language->slug ] = empty( $tr_slug ) ? $slug : $tr_slug;
+ }
+
+ return $slugs;
+ }
+
+ /**
+ * Performs the sanitization ( before saving in DB ) of slugs translations
+ * The Events Calendar does not accept accents, but let's accept slashes for the event category slug
+ *
+ * @since 1.9
+ *
+ * @param string $translation Translation to sanitize.
+ * @param string $name Unique name for the string.
+ * @return string
+ */
+ public function sanitize_string_translation( $translation, $name ) {
+ if ( 'slug_archive_tribe_events' === $name || 0 === strpos( $name, 'slug_tribe_' ) ) {
+ $slugs = explode( '/', $translation );
+ $slugs = array_map( 'sanitize_title', $slugs );
+ return implode( '/', $slugs );
+ }
+ return $translation;
+ }
+
+ /**
+ * Add translated slugs to specific TEC rewrite rules.
+ *
+ * @since 2.2
+ *
+ * @param array $bases Array of arrays of rewrite base slugs.
+ * @return array
+ */
+ public function rewrite_slugs( $bases ) {
+ $translatable_slugs = $this->get_translatable_slugs();
+
+ if ( empty( $translatable_slugs ) ) {
+ return $bases;
+ }
+
+ foreach ( $bases as $type => $base ) {
+ $default_slug = reset( $base );
+
+ foreach ( $translatable_slugs as $slugs ) {
+ if ( $slugs['slug'] === $default_slug ) {
+ $bases[ $type ] = array_unique( array_merge( array( $default_slug ), $slugs['translations'] ) );
+ break;
+ }
+ }
+ }
+
+ return $bases;
+ }
+
+ /**
+ * Translated strings must be sanitized the same way The Events Calendar does before they are saved.
+ * All are of validation_type 'html'.
+ *
+ * @since 2.2
+ *
+ * @param string $translation Translated string.
+ * @param string $name String name.
+ * @param string $context String context.
+ * @return string Sanitized translation.
+ */
+ public function sanitize_strings( $translation, $name, $context ) {
+ if ( 'The Events Calendar' === $context ) {
+ $translation = balanceTags( $translation );
+ }
+
+ return $translation;
+ }
+
+ /**
+ * Filters TEC's base slugs to unescape dashes.
+ *
+ * If `$method` is 'regex', `Tribe__Events__Rewrite->get_bases()` will use `preg_quote()` to get
+ * its slugs ready as regex patterns. However, `-` characters are valid in this context and
+ * should not be escaped (reminder: they come from PLL's string translations).
+ *
+ * @since 3.1
+ * @see $this->rewrite_slugs()
+ *
+ * @param string[] $bases An array of rewrite bases that have been generated.
+ * @param string $method The method that's being used to generate the bases; defaults to `regex`.
+ * @return string[]
+ */
+ public function fix_escaped_dashes_in_slugs( $bases, $method ) {
+ if ( 'regex' !== $method ) {
+ return $bases;
+ }
+
+ return array_map(
+ function ( $base ) {
+ return str_replace( '\\-', '-', $base );
+ },
+ $bases
+ );
+ }
+
+ /**
+ * Filters the string to be used as the taxonomy slug.
+ * This replaces TEC's translated category slug by the untranslated one, as it is returned by the public method
+ * `Tribe__Events__Main->get_category_slug()`.
+ *
+ * @since 3.1
+ *
+ * @return string
+ */
+ public function get_category_slug() {
+ return 'category';
+ }
+
+ /**
+ * Filters the string to be used as the tag slug.
+ * This replaces TEC's translated tag slug by the untranslated one, as it is returned by a public method
+ * `Tribe__Events__Main->get_tag_slug()`.
+ *
+ * @since 3.1
+ *
+ * @return string
+ */
+ public function get_tag_slug() {
+ return 'tag';
+ }
+
+ /**
+ * Adds the lang to TEC's REST URL.
+ * This provides a way to identify in whish language PLL should work in the REST request.
+ *
+ * @since 3.1
+ *
+ * @param string $url The View endpoint URL, either a REST API URL or a admin-ajax.php fallback URL if REST API
+ * is not available.
+ * @return string
+ */
+ public function add_missing_lang_to_rest_url( $url ) {
+ $curlang = $this->get_curlang();
+
+ if ( empty( $curlang ) ) {
+ return $url;
+ }
+
+ $lang = $this->get_lang_from_url_query_arg( $url );
+
+ if ( ! empty( $lang ) ) {
+ return $url;
+ }
+
+ return add_query_arg( array( 'lang' => $curlang->slug ), $url );
+ }
+
+ /**
+ * Filters the locale when TEC is performing a REST request.
+ *
+ * @since 3.1
+ *
+ * @param string $locale The locale ID.
+ * @return string
+ */
+ public function filter_locale_for_rest( $locale ) {
+ if ( ! $this->is_tec_rest_request() ) {
+ return $locale;
+ }
+
+ $curlang = $this->get_curlang();
+
+ if ( empty( $curlang->locale ) ) {
+ return $locale;
+ }
+
+ return $curlang->locale;
+ }
+
+ /**
+ * Filters the query arguments that should be applied to the View links to add the missing language.
+ * The added language is the global current language.
+ *
+ * @since 3.1
+ *
+ * @param mixed[] $url_args The current URL query arguments, created from a filtered version of the current
+ * request context.
+ * @return mixed[]
+ */
+ public function add_language_to_publicly_visible_views_query_args( $url_args ) {
+ $curlang = $this->get_curlang();
+
+ if ( ! empty( $curlang ) ) {
+ $url_args['lang'] = $curlang->slug;
+ }
+ return $url_args;
+ }
+
+ /**
+ * Fixes the "upcoming events" widget link.
+ *
+ * @since 3.1
+ *
+ * @param mixed[] $template_vars An associative array of template variables. Variables will be extracted in the
+ * template hence the key will be the name of the variable available in the template.
+ * @return mixed[]
+ */
+ public function translate_widget_view_more_link( $template_vars ) {
+ if ( ! isset( $template_vars['view_more_link'] ) ) {
+ return $template_vars;
+ }
+
+ $curlang = $this->get_curlang();
+
+ if ( empty( $curlang ) || empty( $this->slugs_model ) ) {
+ return $template_vars;
+ }
+
+ $template_vars['view_more_link'] = home_url( '/' . tribe_get_option( 'eventsSlug', 'events' ) );
+ $template_vars['view_more_link'] = $this->polylang->links_model->add_language_to_link( $template_vars['view_more_link'], $curlang );
+ $template_vars['view_more_link'] = $this->slugs_model->translate_slug( $template_vars['view_more_link'], $curlang, 'archive_' . TEC::POSTTYPE );
+ $template_vars['view_more_link'] = user_trailingslashit( $template_vars['view_more_link'] );
+
+ return $template_vars;
+ }
+
+ /**
+ * Filters the array of query variables parsed by TEC to force the use of the right language.
+ * For example, `example.com/events?lang=de` would return the default language instead of using the provided query
+ * arg because TEC tries to use the WP rewrite rules to match the query path, and `events` => default language.
+ * However, this is not needed for `example.com/de/events-de/` and `example.com/?lang=de` because the right
+ * language will be set in these cases.
+ *
+ * @since 3.1
+ * @see Tribe__Rewrite->parse_request()
+ * @see PLL_TEC->add_language_to_publicly_visible_views_query_args()
+ *
+ * @param string[] $query_vars The parsed query vars array.
+ * @param string[] $extra_query_vars An associative array of extra query vars that will be processed before
+ * the WordPress defined ones.
+ * @param string $url The URL to parse.
+ * @return string[]
+ */
+ public function force_language_on_tec_parse_query_vars( $query_vars, $extra_query_vars, $url ) {
+ // Find the lang in the URL...
+ $lang = $this->get_lang_from_url_query_arg( $url );
+
+ if ( ! empty( $lang ) ) {
+ // ... and add it to the query vars.
+ $query_vars['lang'] = $lang->slug;
+ }
+
+ return $query_vars;
+ }
+
+ /**
+ * Adds the lang to TEC's query arguments that will be used to build a View URL.
+ * This insures that a lang arg is available when building the view's URL.
+ *
+ * @since 3.1
+ *
+ * @param mixed[] $query_args An array of query args that will be used to build the URL for the View.
+ * @return mixed[]
+ */
+ public function add_missing_lang_to_query_arg( $query_args ) {
+ if ( isset( $query_args['lang'] ) ) {
+ return $query_args;
+ }
+
+ $curlang = $this->get_curlang();
+
+ $query_args['lang'] = ! empty( $curlang ) ? $curlang->slug : $this->polylang->options['default_lang'];
+
+ return $query_args;
+ }
+
+ /**
+ * Adds the lang to the URL passed to `Tribe__Rewrite->get_canonical_url()`.
+ * This insures that a lang arg is available when building a URL.
+ *
+ * @since 3.1
+ *
+ * @param string|null $canonical_url The canonical URL, defaults to `null`; returning a non `null` value will
+ * make the logic bail and return the value.
+ * @param string $url The input URL to resolve to a canonical one.
+ * @return string|null
+ */
+ public function add_missing_lang_to_non_canonical_url( $canonical_url, $url ) {
+ $lang = $this->get_lang_from_url_query_arg( $url );
+
+ if ( ! empty( $lang ) ) {
+ // All good.
+ return $canonical_url;
+ }
+
+ $curlang = $this->get_curlang();
+
+ if ( empty( $curlang ) ) {
+ // We're screwed.
+ return $canonical_url;
+ }
+
+ // Re-inject the URL with the current lang. `$this->get_lang_from_url_query_arg()` will prevent an infinite loop.
+ return Tribe__Rewrite::instance()->get_canonical_url( add_query_arg( 'lang', $curlang->slug, $url ) );
+ }
+
+ /**
+ * Removes the `name` arg from the URL passed to `Tribe__Rewrite->get_canonical_url()` when there is already a
+ * `post_type` arg: this seems to mess up the process.
+ *
+ * @since 3.1
+ *
+ * @param string|null $canonical_url The canonical URL, defaults to `null`; returning a non `null` value will
+ * make the logic bail and return the value.
+ * @param string $url The input URL to resolve to a canonical one.
+ * @return string|null
+ */
+ public function remove_name_arg_from_non_canonical_url( $canonical_url, $url ) {
+ $url_query = wp_parse_url( $url, PHP_URL_QUERY );
+
+ if ( empty( $url_query ) ) {
+ return $canonical_url;
+ }
+
+ $parsed_query = array();
+ wp_parse_str( $url_query, $parsed_query );
+
+ if ( empty( $parsed_query ) ) {
+ return $canonical_url;
+ }
+
+ if ( empty( $parsed_query['post_type'] ) || empty( $parsed_query['name'] ) || ! empty( $parsed_query['ical'] ) ) {
+ return $canonical_url;
+ }
+
+ if ( TEC::POSTTYPE !== $parsed_query['post_type'] ) {
+ return $canonical_url;
+ }
+
+ if ( ! empty( $parsed_query['lang'] ) && $parsed_query['lang'] === $parsed_query['name'] ) {
+ // ¯\(°_o)/¯.
+ $remove = true;
+ } elseif ( tribe_get_option( 'eventsSlug' ) === $parsed_query['name'] ) {
+ $remove = true;
+ }
+
+ if ( empty( $remove ) ) {
+ return $canonical_url;
+ }
+
+ // Re-inject the URL. Tests against `$parsed_query['name']` will prevent an infinite loop.
+ return Tribe__Rewrite::instance()->get_canonical_url( remove_query_arg( 'name', $url ) );
+ }
+
+ /**
+ * Filters TEC's canonical URL to fix the language slug in it.
+ * Because of TEC's method to build URLs, using the rewrite rules array, the language slug is not replaced and is
+ * outputed like the rewrite rule pattern: `/(en|fr|de)/`. This filter replaces the pattern by the language
+ * contained in the original URL. If not found in the original URL, falls back to the current language or the default
+ * one.
+ *
+ * @since 3.1
+ *
+ * @param string $resolved The resolved, canonical URL.
+ * @param string $url The original URL to resolve.
+ * @return string
+ */
+ public function fix_language_in_canonical_url( $resolved, $url ) {
+ $options = $this->polylang->options;
+
+ // Remove the default language if it must be hidden in the URLs.
+ $languages = $this->polylang->model->get_languages_list(
+ array(
+ 'hide_default' => $options['hide_default'],
+ 'fields' => 'slug',
+ )
+ );
+
+ if ( empty( $languages ) ) {
+ return $resolved;
+ }
+
+ /**
+ * What we want to modify in the URL.
+ * Ex: `/(en|fr|de)`, `/language/(fr|de)`.
+ */
+ $language_path = $options['rewrite'] ? '' : '/language';
+ $to_replace = $language_path . '/(' . implode( '|', $languages ) . ')/';
+
+ if ( strpos( $resolved, $to_replace ) === false ) {
+ return $resolved;
+ }
+
+ // Find the lang in the URL (or fallback).
+ $lang = $this->get_lang_from_url_query_arg( $url );
+
+ if ( empty( $lang ) ) {
+ // We need a lang, whichever it is.
+ $curlang = $this->get_curlang();
+ $lang = ! empty( $curlang ) ? $curlang->slug : $options['default_lang'];
+ } else {
+ $lang = $lang->slug;
+ }
+
+ // Make the final replacement.
+ if ( $options['hide_default'] && $options['default_lang'] === $lang ) {
+ // The default language is hidden in the URL.
+ $replacement = '/';
+ } else {
+ $replacement = "{$language_path}/{$lang}/";
+ }
+
+ return str_replace( $to_replace, $replacement, $resolved );
+ }
+
+ /**
+ * Filters TEC's canonical URL to translate all slugs in it.
+ * This is possible because a `lang` arg is available in the "uggly" URL.
+ *
+ * @since 3.1
+ * @see Tribe__Events__Rewrite->get_dynamic_matchers()
+ *
+ * @param string $resolved The resolved, canonical URL.
+ * @param string $url The original URL to resolve.
+ * @return string
+ */
+ public function translate_canonical_url( $resolved, $url ) {
+ if ( empty( $this->slugs_model ) ) {
+ return $resolved;
+ }
+
+ // Find the lang in the URL (or fallback).
+ $lang = $this->get_lang_from_url_query_arg_or_fallback( $url );
+
+ if ( empty( $lang ) ) {
+ // What?
+ return $resolved;
+ }
+
+ // Make sure the language is well formatted.
+ $resolved = remove_query_arg( 'lang', $resolved );
+ $resolved = $this->polylang->links_model->add_language_to_link( $resolved, $lang );
+
+ foreach ( $this->get_translatable_slugs() as $slug_id => $translations ) {
+ $resolved = $this->slugs_model->switch_translated_slug( $resolved, $lang, $slug_id );
+ }
+
+ return $resolved;
+ }
+
+ /**
+ * Tells if a request is a TEC REST API request.
+ * TEC does a good job for their REST URL by providing a `admin-ajax.php` fallback in case the REST API is not
+ * available. Unfortunately, this choice is late in the process so we have to test the given URL against the 2
+ * possibilities.
+ *
+ * @since 3.1
+ * @see Tribe\Events\Views\V2\Rest_Endpoint->get_url()
+ *
+ * @param string $requested_url The requested URL. Falls back to the current URL.
+ * @return bool|null Whether the request is a TEC REST API request. Null if not ready to answer yet.
+ */
+ protected function is_tec_rest_request( $requested_url = null ) {
+ if ( ! isset( $this->is_tec_rest_request['views_v2_is_enabled'] ) ) {
+ if ( ! function_exists( 'tribe_events_views_v2_is_enabled' ) ) {
+ return null;
+ }
+
+ $this->is_tec_rest_request['views_v2_is_enabled'] = tribe_events_views_v2_is_enabled();
+ }
+
+ if ( ! $this->is_tec_rest_request['views_v2_is_enabled'] ) {
+ // If the views V2 are not enabled, no REST requests.
+ return false;
+ }
+
+ if ( empty( $requested_url ) || ! is_string( $requested_url ) ) {
+ // Fall back to the current URL.
+ if ( ! isset( $this->is_tec_rest_request['pll_requested_url'] ) ) {
+ $this->is_tec_rest_request['pll_requested_url'] = (string) set_url_scheme( pll_get_requested_url() );
+ }
+
+ $requested_url = $this->is_tec_rest_request['pll_requested_url'];
+ } else {
+ $requested_url = (string) set_url_scheme( $requested_url );
+ }
+
+ if ( isset( $this->is_tec_rest_request[ 'is:' . $requested_url ] ) ) {
+ return $this->is_tec_rest_request[ 'is:' . $requested_url ];
+ }
+
+ if ( false === strpos( $requested_url, '/admin-ajax.php' ) ) {
+ // Test against the REST URL.
+ if ( ! isset( $this->is_tec_rest_request['tec_rest_url_pattern'] ) ) {
+ $url = $this->get_tec_rest_url( true );
+
+ if ( empty( $url ) ) {
+ // `$wp_rewrite` is probably not set yet.
+ return null;
+ }
+
+ $this->is_tec_rest_request['tec_rest_url_pattern'] = preg_replace( '@[#?].*$@', '', $url );
+ $this->is_tec_rest_request['tec_rest_url_pattern'] = sprintf( '@^%s[/?#]@i', preg_quote( $this->is_tec_rest_request['tec_rest_url_pattern'], '@' ) );
+ }
+
+ $this->is_tec_rest_request[ 'is:' . $requested_url ] = (bool) preg_match( $this->is_tec_rest_request['tec_rest_url_pattern'], $requested_url );
+
+ return $this->is_tec_rest_request[ 'is:' . $requested_url ];
+ }
+
+ // Test against the admin ajax URL.
+ if ( ! isset( $this->is_tec_rest_request['tec_ajax_url_action'] ) ) {
+ $this->is_tec_rest_request['tec_ajax_url_action'] = $this->get_tec_rest_url( false );
+ $this->is_tec_rest_request['tec_ajax_url_action'] = $this->get_query_arg_from_url( $this->is_tec_rest_request['tec_ajax_url_action'], 'action' );
+ }
+
+ if ( empty( $this->is_tec_rest_request['tec_ajax_url_action'] ) ) {
+ // Uh?
+ $this->is_tec_rest_request[ 'is:' . $requested_url ] = false;
+ return false;
+ }
+
+ $requested_action = $this->get_query_arg_from_url( $requested_url, 'action' );
+
+ $this->is_tec_rest_request[ 'is:' . $requested_url ] = $requested_action === $this->is_tec_rest_request['tec_ajax_url_action'];
+
+ return $this->is_tec_rest_request[ 'is:' . $requested_url ];
+ }
+
+ /**
+ * Returns the current language object.
+ * Can return `null` if not defined yet.
+ *
+ * @since 3.1
+ *
+ * @return PLL_Language|null
+ */
+ protected function get_curlang() {
+ if ( ! empty( $this->curlang ) ) {
+ return $this->curlang;
+ }
+
+ if ( ! empty( $_REQUEST['lang'] ) && is_string( $_REQUEST['lang'] ) && Polylang::is_rest_request() ) { // phpcs:ignore WordPress.Security.NonceVerification
+ // REST request.
+ $curlang = $this->polylang->model->get_language( sanitize_key( $_REQUEST['lang'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
+
+ if ( ! empty( $curlang ) ) {
+ $this->curlang = $curlang;
+ $this->polylang->curlang = $this->curlang;
+ return $this->curlang;
+ }
+ }
+
+ if ( ! empty( $this->polylang->curlang ) ) {
+ // Global context.
+ $this->curlang = &$this->polylang->curlang;
+ return $this->curlang;
+ }
+
+ if ( empty( $this->polylang->options['force_lang'] ) && $this->polylang instanceof PLL_Frontend && ! did_action( 'pll_language_defined' ) ) {
+ // Lang defined by content: too soon.
+ return null;
+ }
+
+ $curlang = $this->polylang->model->get_default_language();
+
+ if ( empty( $curlang ) ) {
+ // We're screwed.
+ return null;
+ }
+
+ // Default lang.
+ $this->curlang = $curlang;
+ return $this->curlang;
+ }
+
+ /**
+ * Returns the list of slugs that need to be reset in TEC, except the deprecated ones.
+ *
+ * @since 3.1
+ * @see PLL_TEC->reset_slugs()
+ *
+ * @return string[] Array keys match `Tribe__Events__Main`'s properties name.
+ */
+ protected function get_slugs_to_reset() {
+ return array(
+ 'category_slug' => 'category',
+ 'tag_slug' => 'tag',
+ 'monthSlug' => 'month',
+ 'listSlug' => 'list',
+ 'upcomingSlug' => 'upcoming',
+ 'pastSlug' => 'past',
+ 'daySlug' => 'day',
+ 'todaySlug' => 'today',
+ 'featured_slug' => 'featured',
+ 'all_slug' => 'all',
+ );
+ }
+
+ /**
+ * Returns the list of IDs of translatable slugs dedicated to TEC.
+ * Ex: `tribe_venue`, `archive_tribe_events`, `paged`, `tribe_today`.
+ *
+ * @since 3.1
+ *
+ * @return string[]
+ */
+ protected function get_translatable_slug_ids() {
+ if ( ! empty( $this->translatable_slug_ids ) ) {
+ return $this->translatable_slug_ids;
+ }
+
+ $slug_ids = array(
+ Venue::POSTTYPE,
+ Organizer::POSTTYPE,
+ TEC::POSTTYPE,
+ 'archive_' . TEC::POSTTYPE,
+ 'post_tag',
+ 'paged',
+ );
+
+ foreach ( $this->get_slugs_to_reset() as $slug ) {
+ $slug_ids[] = 'tribe_' . $slug;
+ }
+
+ $this->translatable_slug_ids = array_combine( $slug_ids, $slug_ids );
+
+ return $this->translatable_slug_ids;
+ }
+
+ /**
+ * Returns the list of translatable slugs dedicated to TEC.
+ *
+ * @since 3.1
+ *
+ * @return mixed[]
+ */
+ protected function get_translatable_slugs() {
+ if ( empty( $this->slugs_model ) ) {
+ return array();
+ }
+
+ return array_intersect_key( $this->slugs_model->get_translatable_slugs(), $this->get_translatable_slug_ids() );
+ }
+
+ /**
+ * Returns the value of the `lang` query arg from the given URL.
+ *
+ * @since 3.1
+ *
+ * @param string $url The URL to retrieve the arg from.
+ * @return PLL_Language|null The lang object. Null if not found or invalid.
+ */
+ protected function get_lang_from_url_query_arg( $url ) {
+ $lang = $this->get_query_arg_from_url( $url, 'lang' );
+
+ if ( empty( $lang ) || ! is_string( $lang ) ) {
+ return null;
+ }
+
+ $lang = $this->polylang->model->get_language( sanitize_key( $lang ) );
+
+ if ( empty( $lang ) ) {
+ return null;
+ }
+
+ return $lang;
+ }
+
+ /**
+ * Returns the value of the `lang` query arg from the given URL.
+ *
+ * @since 3.1
+ *
+ * @param string $url The URL to retrieve the arg from.
+ * @return PLL_Language|null The lang object. Null if not found or invalid.
+ */
+ protected function get_lang_from_url_query_arg_or_fallback( $url ) {
+ $lang = $this->get_lang_from_url_query_arg( $url );
+
+ if ( ! empty( $lang ) ) {
+ return $lang;
+ }
+
+ $lang = $this->get_curlang();
+
+ if ( ! empty( $lang ) ) {
+ return $lang;
+ }
+
+ // Uh?
+ $lang = $this->polylang->model->get_default_language();
+
+ if ( ! empty( $lang ) ) {
+ return $lang;
+ }
+
+ // What?
+ return null;
+ }
+
+ /**
+ * Returns the value of a query arg from the given URL.
+ *
+ * @since 3.1
+ *
+ * @param string $url The URL to retrieve the arg from.
+ * @param string $query_arg_name The name of the query arg to retrieve.
+ * @return string|null The raw value of the query arg. Null if not found.
+ */
+ protected function get_query_arg_from_url( $url, $query_arg_name ) {
+ if ( empty( $url ) || ! is_string( $url ) ) {
+ return null;
+ }
+
+ if ( empty( $query_arg_name ) || ! is_string( $query_arg_name ) ) {
+ return null;
+ }
+
+ $url_query = wp_parse_url( $url, PHP_URL_QUERY );
+
+ if ( empty( $url_query ) ) {
+ return null;
+ }
+
+ $parsed = array();
+ wp_parse_str( $url_query, $parsed );
+
+ if ( empty( $parsed[ $query_arg_name ] ) || ! is_string( $parsed[ $query_arg_name ] ) ) {
+ return null;
+ }
+
+ return sanitize_key( $parsed[ $query_arg_name ] );
+ }
+
+ /**
+ * Returns TEC's REST URL.
+ *
+ * @since 3.1
+ *
+ * @param bool $enable_rest True to get the REST URL. False to get the admin ajax URL.
+ * @return string|null The REST URL. Null if too soon to be determinated: this may happen when requesting the
+ * the real REST URL (`$enable_rest` is true) but `$wp_rewrite` is not ready.
+ */
+ protected function get_tec_rest_url( $enable_rest ) {
+ global $wp_rewrite;
+
+ if ( $enable_rest ) {
+ // In this case, `Rest_Endpoint->get_url()` will use `get_rest_url()`.
+ if ( is_multisite() && get_blog_option( 0, 'permalink_structure' ) || get_option( 'permalink_structure' ) ) { // See the same test done in `get_rest_url()`.
+ // We test `$wp_rewrite` to prevent `get_rest_url()` to explode.
+ if ( ! $wp_rewrite instanceof WP_Rewrite ) {
+ return null;
+ }
+ }
+ }
+
+ // Force `Rest_Endpoint->is_available()`'s behavior with this filter callback.
+ $priority = 100000;
+ $callback = function () use ( $enable_rest ) {
+ return (bool) $enable_rest;
+ };
+
+ add_filter( 'tribe_events_views_v2_rest_endpoint_available', $callback, $priority );
+ $url = ( new Rest_Endpoint() )->get_url();
+ remove_filter( 'tribe_events_views_v2_rest_endpoint_available', $callback, $priority );
+
+ return $url;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/js/build/acf.js b/wp-content/plugins/polylang-pro/js/build/acf.js
new file mode 100644
index 000000000..6a8ddc58d
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/acf.js
@@ -0,0 +1,58 @@
+/**
+ * @package Polylang-Pro
+ */
+
+jQuery(
+ function ( $ ) {
+ /**
+ * Ajax for changing the post's language in the languages metabox.
+ */
+ $( '.post_lang_choice' ).on(
+ 'change',
+ function () {
+
+ // Reloads the relationship fields
+ if ( $( ".acf-field-relationship" ).length ) {
+ acf.doAction( 'ready' );
+ }
+
+ var fields = new Array();
+
+ $( '.acf-field-taxonomy' ).each(
+ function () {
+ var field = $( this ).attr( 'data-key' );
+ fields.push( field );
+ }
+ );
+
+ if ( 0 != fields.length ) {
+ var data = {
+ action: 'acf_post_lang_choice',
+ lang: $( this ).val(),
+ fields: fields,
+ _pll_nonce: $( '#_pll_nonce' ).val()
+ }
+
+ $.post(
+ ajaxurl,
+ data,
+ function (response) {
+ // Target a non existing WP HTML id to avoid a conflict with WP ajax requests.
+ var res = wpAjax.parseAjaxResponse( response, 'pll-ajax-response' );
+ $.each(
+ res.responses,
+ function () {
+ $el = $( '.acf-' + this.what )
+ // Data come from ACF field and server side.
+ $el.html( this.data ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
+ acf.do_action( 'ready_field/type=' + $el.data( 'type' ), $el );
+ }
+ );
+ }
+ );
+ }
+ }
+ );
+ }
+);
+
diff --git a/wp-content/plugins/polylang-pro/js/build/acf.min.js b/wp-content/plugins/polylang-pro/js/build/acf.min.js
new file mode 100644
index 000000000..182b5a575
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/acf.min.js
@@ -0,0 +1 @@
+jQuery((function(a){a(".post_lang_choice").on("change",(function(){a(".acf-field-relationship").length&&acf.doAction("ready");var e=new Array;if(a(".acf-field-taxonomy").each((function(){var n=a(this).attr("data-key");e.push(n)})),0!=e.length){var n={action:"acf_post_lang_choice",lang:a(this).val(),fields:e,_pll_nonce:a("#_pll_nonce").val()};a.post(ajaxurl,n,(function(e){var n=wpAjax.parseAjaxResponse(e,"pll-ajax-response");a.each(n.responses,(function(){$el=a(".acf-"+this.what),$el.html(this.data),acf.do_action("ready_field/type="+$el.data("type"),$el)}))}))}}))}));
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/js/build/admin.js b/wp-content/plugins/polylang-pro/js/build/admin.js
new file mode 100644
index 000000000..091a95e9a
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/admin.js
@@ -0,0 +1,427 @@
+/**
+ * @package Polylang
+ */
+
+jQuery(
+ function( $ ) {
+
+ // languages list table
+ // accessibility to row actions on focus
+ // mainly copy paste of WP code from common.js
+ var transitionTimeout;
+ $( 'table.languages' ).on(
+ { // restricted to languages list table
+ focusin: function() {
+ clearTimeout( transitionTimeout );
+ var focusedRowActions = $( this ).find( '.row-actions' );
+ // transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help.
+ $( '.row-actions' ).not( this ).removeClass( 'visible' );
+ focusedRowActions.addClass( 'visible' );
+ },
+ focusout: function() {
+ // Tabbing between post title and .row-actions links needs a brief pause, otherwise
+ // the .row-actions div gets hidden in transit in some browsers ( ahem, Firefox ).
+ transitionTimeout = setTimeout(
+ function() {
+ focusedRowActions.removeClass( 'visible' );
+ },
+ 30
+ );
+ }
+ },
+ 'tr'
+ ); // acts on the whole tr instead of single td as we have actions links in several columns
+
+ /**
+ * Common functions and variables for overriding languages and flags dropdown list by a jQuery UI selectmenu widget.
+ */
+
+ // Add a boolean variable to be able to check jQuery UI >= 1.12 which is introduced in WP 5.6.
+ // Backward compatibility WP < 5.6
+ var isJqueryUImin112 = $.ui.version >= '1.12.0';
+ // Allow to check if a flag list dropdown is present. Not present in the Wizard steps or other settings page.
+ var flagListExist = $( "#flag_list" ).length;
+ // Allow to check if a language list dropdown is present. Not present in other settings page.
+ var langListExist = $( "#lang_list" ).length;
+ // jQuery UI selectmenu widget width option
+ var defaultSelectmenuWidth = '95%';
+ var wizardSelectmenuWidth = '100%';
+
+ // Inject flag image when jQuery UI selectmenu is created or an item is selected.
+ // jQuery UI 1.12 introduce a wrapper inside de li tag which is necessary to selectmenu widget to work correctly.
+ // Mainly copy from the original jQuery UI 1.12 selectmenu widget _renderItem method.
+ // Note this code works fine with jQuery UI 1.11.4 too.
+ var selectmenuRenderItem = function( ul, item ) {
+ var li = $( '
' );
+ var wrapper = $( '
');
+
+ if ( item.disabled ) {
+ this._addClass( li, null, "ui-state-disabled" );
+ }
+ this._setText( wrapper, item.label );
+
+ // Add the flag from the data attribute in the selected element.
+ wrapper.prepend( $( item.element ).data( 'flag-html' ) );
+ wrapper.children( 'img' ).addClass( 'ui-icon' );
+
+ return li.append( wrapper ).appendTo( ul );
+ };
+ // Override selected item to inject flag for jQuery UI less than 1.12.
+ var selectmenuRefreshButtonText = function( selectElement ) {
+ var buttonText = $( selectElement ).selectmenu( 'instance' ).buttonText;
+ buttonText.prepend( $( selectElement ).children( ':selected' ).data( 'flag-html' ) );
+ buttonText.children( 'img' ).addClass( 'ui-icon' );
+ };
+ // Override selected item since jQuery UI 1.12 which introduces extension point method _renderButtonItem.
+ // @see https://api.jqueryui.com/1.12/selectmenu/#method-_renderButtonItem _renderButtonItem documentation.
+ var selectmenuRenderButtonItem = function ( selectElement ) {
+ var buttonItem = $( '' );
+ this._setText( buttonItem, selectElement.label );
+ this._addClass( buttonItem, "ui-selectmenu-text" );
+
+ // Add the flag from the data attribute in the selected element.
+ buttonItem.prepend( $( selectElement.element ).data( 'flag-html' ) );
+ buttonItem.children( 'img' ).addClass( 'ui-icon' );
+
+ return buttonItem;
+ }
+
+ /**
+ * Initialize a jQuery UI selectmenu widget on a DOM element
+ *
+ * @param {*} element - The jQuery object representing the DOM element to attach the widget with.
+ * @param {*} config - All the parameters - options and callbacks - necessary to configure the jQuery UI selectmenu widget.
+ * @return {Object} - The jQuery UI selectmenu widget object instance.
+ */
+ function initializeSelectmenuWidget( element, config ) {
+ // Create the jQuery UI selectmenu widget for flags list dropdown and return its instance.
+ var selectmenuWidgetInstance = element.selectmenu( config ).selectmenu( 'instance' );
+ // Overrides each item in the jQuery UI selectmenu list by injecting flag image.
+ selectmenuWidgetInstance._renderItem = selectmenuRenderItem;
+ // Override the selected item rendering for jQuery UI 1.12
+ if ( isJqueryUImin112 ) {
+ selectmenuWidgetInstance._renderButtonItem = selectmenuRenderButtonItem;
+ // Need to refresh to take in account the new button item rendering method after the selectmenu widget instanciaion.
+ selectmenuWidgetInstance.refresh();
+ }
+ return selectmenuWidgetInstance
+ }
+ /**
+ * Selectmenu widget common parameters for its configuration: options and callbacks.
+ */
+
+ // Selectmenu widget options
+ var selectmenuOptions = {
+ width: defaultSelectmenuWidth,
+ classes: {
+ 'ui-selectmenu-menu': 'pll-selectmenu-menu',
+ 'ui-selectmenu-button': 'pll-selectmenu-button',
+ }
+ };
+
+ // Selectmenu widget callbacks
+ var selectmenuFlagListCallbacks = {};
+ // Callbacks when Selectmenu widget create or select event is triggered.
+ var createSelectCallback = function( event, ui ) {
+ selectmenuRefreshButtonText( event.target );
+ }
+
+ /**
+ * Overrides the flag dropdown list with our customized jquery ui selectmenu.
+ */
+
+ // Callbacks when Selectmenu widget change or open event is triggered.
+ // Needed to correctly refresh the selected element in the list when editing an existing language or when the value change is triggered by the language choice.
+ // jQuery UI 1.11 callback version.
+ var changeOpenCallback = function( event, ui ){
+ selectmenuRefreshButtonText( $( event.target ).selectmenu( 'refresh' ) );
+ }
+ // jQueryUI 1.12 callback version.
+ var changeOpenCallbackjQueryUI112 = function( event, ui ){
+ // Just a refresh of the menu is needed with jQuery UI 1.12 because _renderButtonItem is triggered and then inject correctly the flag.
+ $( event.target ).selectmenu( 'refresh' );
+ }
+ // There is no need of create and select callbacks with jQuery UI 1.12 because overriding _renderButtonItem method do the job.
+ if ( isJqueryUImin112 ) {
+ selectmenuFlagListCallbacks =
+ {
+ change: changeOpenCallbackjQueryUI112,
+ open: changeOpenCallbackjQueryUI112,
+ };
+ } else {
+ selectmenuFlagListCallbacks = {
+ create: createSelectCallback,
+ select: createSelectCallback,
+ change: changeOpenCallback,
+ open: changeOpenCallback,
+ };
+ }
+
+ // Create the selectmenu widget only if the field is present.
+ if ( flagListExist ) {
+ // Create the jQuery UI selectmenu widget for flags list dropdown and return its instance.
+ var selectmenuFlagList = initializeSelectmenuWidget( $( '#flag_list' ), Object.assign( {}, selectmenuOptions, selectmenuFlagListCallbacks ) );
+ $( '#lang_list' ).on(
+ 'languageChanged',
+ function( event, flag ) {
+ // Refresh the flag field
+ selectmenuFlagList.element.val( flag );
+ selectmenuFlagList._trigger( 'change' );
+ }
+ );
+ }
+
+ /**
+ * Language choice in predefined languages in Polylang Languages settings page and wizard.
+ * Overrides the predefined language dropdown list with our customized jQuery ui selectmenu widget.
+ */
+
+ /**
+ * Fill the other language form fields from the language element selected in the language list dropdown.
+ *
+ * @param {Object} language - language object of the selected element in the language list dropdown.
+ */
+ function fillLanguageFields( language ) {
+ $( '#lang_slug' ).val( language.slug );
+ $( '#lang_locale' ).val( language.locale );
+ $( 'input[name="rtl"]' ).val( language.rtl );
+ $( '#lang_name' ).val( language.name );
+ }
+
+ /**
+ * Parse selected language element in the language list dropdown.
+ *
+ * @param {object} event - jQuery triggered event.
+ * @return {object} The language object with its named properties.
+ */
+ function parseSelectedLanguage( event ) {
+ var selectedElement = $('option:selected', event.target);
+ var values = selectedElement.val().split(':')
+ return {
+ slug: values[0],
+ locale: values[1],
+ rtl: [values[2]],
+ flag: values[3],
+ name: selectedElement.text().split(' - ')[0] // At the moment there is no need of the 2nd part because it corresponds on the locale which is already known by splitting the selected element value
+ };
+ }
+
+ // Callback when selectmenu widget change event is triggered.
+ var changeCallback = function( event, ui ) {
+ var language = parseSelectedLanguage( event );
+
+ fillLanguageFields( language );
+
+ $( event.target ).trigger( 'languageChanged', language.flag );
+ };
+
+ // Create the jQuery UI selectmenu widget languages list dropdown and return its instance.
+ var selectmenuLangListCallbacks = {};
+ // For the wizard we need a 100% width. So we override the previous defined value of selectmenuOptions.
+ if( $( '#lang_list' ).closest( '.pll-wizard-content' ).length > 0 ) {
+ selectmenuOptions = Object.assign( selectmenuOptions, { width: wizardSelectmenuWidth } );
+ }
+
+ // There is no need of create and select callbacks with jQuery UI 1.12 because overrinding _renderButtonItem method do the job.
+ if ( isJqueryUImin112 ) {
+ selectmenuLangListCallbacks = {
+ change: changeCallback,
+ };
+ } else {
+ selectmenuLangListCallbacks = {
+ create: createSelectCallback,
+ select: createSelectCallback,
+ change: changeCallback,
+ };
+ }
+ if ( langListExist ) {
+ initializeSelectmenuWidget( $( '#lang_list' ), Object.assign( {}, selectmenuOptions, selectmenuLangListCallbacks ) );
+ }
+
+ // strings translations
+ // save translations when pressing enter
+ $( '.translation input' ).on(
+ 'keydown',
+ function( event ){
+ if ( 'Enter' === event.key ) {
+ event.preventDefault();
+ $( '#submit' ).trigger( 'click' );
+ }
+ }
+ );
+
+ // settings page
+ // click on configure link
+ $( '#the-list' ).on(
+ 'click',
+ '.configure>a',
+ function(){
+ $( '.pll-configure' ).hide().prev().show();
+ $( this ).closest( 'tr' ).hide().next().show();
+ return false;
+ }
+ );
+
+ // cancel
+ $( '#the-list' ).on(
+ 'click',
+ '.cancel',
+ function(){
+ $( this ).closest( 'tr' ).hide().prev().show();
+ }
+ );
+
+ // save settings
+ $( '#the-list' ).on(
+ 'click',
+ '.save',
+ function(){
+ var tr = $( this ).closest( 'tr' );
+ var parts = tr.attr( 'id' ).split( '-' );
+
+ var data = {
+ action: 'pll_save_options',
+ pll_ajax_settings: true,
+ module: parts[parts.length - 1],
+ _pll_nonce: $( '#_pll_nonce' ).val()
+ };
+
+ data = tr.find( ':input' ).serialize() + '&' + $.param( data );
+
+ $.post(
+ ajaxurl,
+ data,
+ function( response ) {
+ // Target a non existing WP HTML id to avoid a conflict with WP ajax requests.
+ var res = wpAjax.parseAjaxResponse( response, 'pll-ajax-response' );
+ $.each(
+ res.responses,
+ function() {
+ /**
+ * Fires after saving the settings, before applying changes to the DOM.
+ *
+ * @since 3.6.0
+ *
+ * @param {Object} response The response from the AJAX call.
+ * @param {HTMLElement} tr The HTML element containing the fields.
+ */
+ wp.hooks.doAction( 'pll_settings_saved', this, tr.get( 0 ) );
+
+ switch ( this.what ) {
+ case 'license-update':
+ $( '#pll-license-' + this.data ).replaceWith( this.supplemental.html );
+ break;
+ case 'success':
+ tr.hide().prev().show(); // close only if there is no error
+ case 'error':
+ $( '.settings-error' ).remove(); // remove previous messages if any
+ $( 'h1' ).after( this.data );
+
+ // Make notices dismissible
+ // copy paste of common.js from WP 4.2.2
+ $( '.notice.is-dismissible' ).each(
+ function() {
+ var $this = $( this ),
+ $button = $( '' ),
+ btnText = pll_admin.dismiss_notice || '';
+
+ // Ensure plain text
+ $button.find( '.screen-reader-text' ).text( btnText );
+
+ // Whitelist because of how the button is built. See above
+ $this.append( $button ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.append
+
+ $button.on(
+ 'click.wp-dismiss-notice',
+ function( event ) {
+ event.preventDefault();
+ $this.fadeTo(
+ 100,
+ 0,
+ function() {
+ $( this ).slideUp(
+ 100,
+ function() {
+ $( this ).remove();
+ }
+ );
+ }
+ );
+ }
+ );
+ }
+ );
+ break;
+ }
+ }
+ );
+ }
+ );
+ }
+ );
+
+ // act when pressing enter or esc in configurations
+ $( '.pll-configure' ).on(
+ 'keydown',
+ function( event ){
+ if ( 'Enter' === event.key ) {
+ event.preventDefault();
+ $( this ).find( '.save' ).trigger( 'click' );
+ }
+
+ if ( 'Escape' === event.key ) {
+ event.preventDefault();
+ $( this ).find( '.cancel' ).trigger( 'click' );
+ }
+ }
+ );
+
+ // settings URL modifications
+ // manages visibility of fields
+ $( "input[name='force_lang']" ).on(
+ 'change',
+ function() {
+ function pll_toggle( a, test ) {
+ test ? a.show() : a.hide();
+ }
+
+ var value = $( this ).val();
+ pll_toggle( $( '#pll-domains-table' ), 3 == value );
+ pll_toggle( $( "#pll-hide-default" ), 3 > value );
+ pll_toggle( $( "#pll-rewrite" ), 2 > value );
+ pll_toggle( $( "#pll-redirect-lang" ), 2 > value );
+ }
+ );
+
+ // settings license
+ // deactivate button
+ $( '.pll-deactivate-license' ).on(
+ 'click',
+ function() {
+ var data = {
+ action: 'pll_deactivate_license',
+ pll_ajax_settings: true,
+ id: $( this ).attr( 'id' ),
+ _pll_nonce: $( '#_pll_nonce' ).val()
+ };
+ $.post(
+ ajaxurl,
+ data,
+ function( response ){
+ $( '#pll-license-' + response.id ).replaceWith( response.html );
+ }
+ );
+ }
+ );
+
+ // Manage closing the metabox.
+ // close postboxes that should be closed
+ $( '.if-js-closed' ).removeClass( 'if-js-closed' ).addClass( 'closed' );
+ // postboxes setup
+ if ( 'undefined' !== typeof postboxes ) {
+ postboxes.add_postbox_toggles( pagenow );
+ }
+ }
+);
+
+
diff --git a/wp-content/plugins/polylang-pro/js/build/admin.min.js b/wp-content/plugins/polylang-pro/js/build/admin.min.js
new file mode 100644
index 000000000..9919e052b
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/admin.min.js
@@ -0,0 +1 @@
+jQuery((function(e){var t;e("table.languages").on({focusin:function(){clearTimeout(t);var n=e(this).find(".row-actions");e(".row-actions").not(this).removeClass("visible"),n.addClass("visible")},focusout:function(){t=setTimeout((function(){focusedRowActions.removeClass("visible")}),30)}},"tr");var n=e.ui.version>="1.12.0",l=e("#flag_list").length,s=e("#lang_list").length,i=function(t,n){var l=e("
"),s=e("
");return n.disabled&&this._addClass(l,null,"ui-state-disabled"),this._setText(s,n.label),s.prepend(e(n.element).data("flag-html")),s.children("img").addClass("ui-icon"),l.append(s).appendTo(t)},a=function(t){var n=e(t).selectmenu("instance").buttonText;n.prepend(e(t).children(":selected").data("flag-html")),n.children("img").addClass("ui-icon")},c=function(t){var n=e("");return this._setText(n,t.label),this._addClass(n,"ui-selectmenu-text"),n.prepend(e(t.element).data("flag-html")),n.children("img").addClass("ui-icon"),n};function o(e,t){var l=e.selectmenu(t).selectmenu("instance");return l._renderItem=i,n&&(l._renderButtonItem=c,l.refresh()),l}var r={width:"95%",classes:{"ui-selectmenu-menu":"pll-selectmenu-menu","ui-selectmenu-button":"pll-selectmenu-button"}},u={},d=function(e,t){a(e.target)},p=function(t,n){a(e(t.target).selectmenu("refresh"))},g=function(t,n){e(t.target).selectmenu("refresh")};if(u=n?{change:g,open:g}:{create:d,select:d,change:p,open:p},l){var h=o(e("#flag_list"),Object.assign({},r,u));e("#lang_list").on("languageChanged",(function(e,t){h.element.val(t),h._trigger("change")}))}var f=function(t,n){var l=function(t){var n=e("option:selected",t.target),l=n.val().split(":");return{slug:l[0],locale:l[1],rtl:[l[2]],flag:l[3],name:n.text().split(" - ")[0]}}(t);!function(t){e("#lang_slug").val(t.slug),e("#lang_locale").val(t.locale),e('input[name="rtl"]').val(t.rtl),e("#lang_name").val(t.name)}(l),e(t.target).trigger("languageChanged",l.flag)},v={};e("#lang_list").closest(".pll-wizard-content").length>0&&(r=Object.assign(r,{width:"100%"})),v=n?{change:f}:{create:d,select:d,change:f},s&&o(e("#lang_list"),Object.assign({},r,v)),e(".translation input").on("keydown",(function(t){"Enter"===t.key&&(t.preventDefault(),e("#submit").trigger("click"))})),e("#the-list").on("click",".configure>a",(function(){return e(".pll-configure").hide().prev().show(),e(this).closest("tr").hide().next().show(),!1})),e("#the-list").on("click",".cancel",(function(){e(this).closest("tr").hide().prev().show()})),e("#the-list").on("click",".save",(function(){var t=e(this).closest("tr"),n=t.attr("id").split("-"),l={action:"pll_save_options",pll_ajax_settings:!0,module:n[n.length-1],_pll_nonce:e("#_pll_nonce").val()};l=t.find(":input").serialize()+"&"+e.param(l),e.post(ajaxurl,l,(function(n){var l=wpAjax.parseAjaxResponse(n,"pll-ajax-response");e.each(l.responses,(function(){switch(wp.hooks.doAction("pll_settings_saved",this,t.get(0)),this.what){case"license-update":e("#pll-license-"+this.data).replaceWith(this.supplemental.html);break;case"success":t.hide().prev().show();case"error":e(".settings-error").remove(),e("h1").after(this.data),e(".notice.is-dismissible").each((function(){var t=e(this),n=e(''),l=pll_admin.dismiss_notice||"";n.find(".screen-reader-text").text(l),t.append(n),n.on("click.wp-dismiss-notice",(function(n){n.preventDefault(),t.fadeTo(100,0,(function(){e(this).slideUp(100,(function(){e(this).remove()}))}))}))}))}}))}))})),e(".pll-configure").on("keydown",(function(t){"Enter"===t.key&&(t.preventDefault(),e(this).find(".save").trigger("click")),"Escape"===t.key&&(t.preventDefault(),e(this).find(".cancel").trigger("click"))})),e("input[name='force_lang']").on("change",(function(){function t(e,t){t?e.show():e.hide()}var n=e(this).val();t(e("#pll-domains-table"),3==n),t(e("#pll-hide-default"),3>n),t(e("#pll-rewrite"),2>n),t(e("#pll-redirect-lang"),2>n)})),e(".pll-deactivate-license").on("click",(function(){var t={action:"pll_deactivate_license",pll_ajax_settings:!0,id:e(this).attr("id"),_pll_nonce:e("#_pll_nonce").val()};e.post(ajaxurl,t,(function(t){e("#pll-license-"+t.id).replaceWith(t.html)}))})),e(".if-js-closed").removeClass("if-js-closed").addClass("closed"),"undefined"!=typeof postboxes&&postboxes.add_postbox_toggles(pagenow)}));
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/js/build/block-editor-plugin.js b/wp-content/plugins/polylang-pro/js/build/block-editor-plugin.js
new file mode 100644
index 000000000..629901897
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/block-editor-plugin.js
@@ -0,0 +1,924 @@
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ 419:
+/***/ ((module) => {
+
+module.exports = (function() { return this["lodash"]; }());
+
+/***/ }),
+
+/***/ 631:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["apiFetch"]; }());
+
+/***/ }),
+
+/***/ 987:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["data"]; }());
+
+/***/ }),
+
+/***/ 172:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["url"]; }());
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ (() => {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = (module) => {
+/******/ var getter = module && module.__esModule ?
+/******/ () => (module['default']) :
+/******/ () => (module);
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+(() => {
+"use strict";
+
+// EXTERNAL MODULE: external {"this":["wp","apiFetch"]}
+var external_this_wp_apiFetch_ = __webpack_require__(631);
+var external_this_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_this_wp_apiFetch_);
+// EXTERNAL MODULE: external {"this":["wp","data"]}
+var external_this_wp_data_ = __webpack_require__(987);
+// EXTERNAL MODULE: external "lodash"
+var external_lodash_ = __webpack_require__(419);
+// EXTERNAL MODULE: external {"this":["wp","url"]}
+var external_this_wp_url_ = __webpack_require__(172);
+;// ./modules/block-editor/js/sidebar/settings.js
+/**
+ * Module Constants
+ *
+ * @package Polylang-Pro
+ */
+
+const settings_MODULE_KEY = 'pll/metabox';
+const settings_MODULE_CORE_EDITOR_KEY = 'core/editor';
+const settings_MODULE_SITE_EDITOR_KEY = 'core/edit-site';
+const MODULE_POST_EDITOR_KEY = 'core/edit-post';
+const MODULE_CORE_KEY = 'core';
+const DEFAULT_STATE = {
+ languages: [],
+ selectedLanguage: {},
+ translatedPosts: {},
+ fromPost: null,
+ currentTemplatePart: {}
+};
+const UNTRANSLATABLE_POST_TYPE = (/* unused pure expression or super */ null && (['wp_template', 'wp_global_styles']));
+const POST_TYPE_WITH_TRASH = (/* unused pure expression or super */ null && (['page']));
+const settings_TEMPLATE_PART_SLUG_SEPARATOR = '___'; // Its value must be synchronized with its equivalent in PHP @see PLL_FSE_Template_Slug::SEPARATOR
+const settings_TEMPLATE_PART_SLUG_CHECK_LANGUAGE_PATTERN = '[a-z_-]+'; // Its value must be synchronized with it equivalent in PHP @see PLL_FSE_Template_Slug::SEPARATOR
+
+
+;// ./modules/block-editor/js/sidebar/utils.js
+/**
+ * WordPress Dependencies
+ *
+ * @package Polylang-Pro
+ */
+
+
+
+
+
+/**
+ * Internal dependencies
+ */
+
+
+/**
+ * Converts array of object to a map.
+ *
+ * @param {array} array Array to convert.
+ * @param {*} key The key in the object used as key to build the map.
+ * @returns {Map}
+ */
+function convertArrayToMap( array, key ){
+ const map = new Map();
+ array.reduce(
+ function (accumulator, currentValue) {
+ accumulator.set( currentValue[key], currentValue );
+ return accumulator;
+ },
+ map
+ );
+ return map;
+}
+
+/**
+ * Converts map to an associative array.
+ *
+ * @param {Map} map The map to convert.
+ * @returns {Object}
+ */
+function utils_convertMapToObject( map ){
+ const object = {};
+ map.forEach(
+ function ( value, key, map ) {
+ const obj = this;
+ this[key] = isBoolean( value ) ? value.toString() : value;
+ },
+ object
+ );
+ return object;
+}
+
+/**
+ * Checks whether the current screen is block-based post type editor.
+ *
+ * @returns {boolean} True if block editor for post type; false otherwise.
+ */
+function isPostTypeBlockEditor() {
+ return !! document.getElementById( 'editor' );
+}
+
+/**
+ * Checks whether the current screen is the block-based widgets editor.
+ *
+ * @returns {boolean} True if we are in the widgets block editor; false otherwise.
+ */
+function isWidgetsBlockEditor() {
+ return !! document.getElementById( 'widgets-editor' );
+}
+
+/**
+ * Checks whether the current screen is the customizer widgets editor.
+ *
+ * @returns {boolean} True if we are in the customizer widgets editor; false otherwise.
+ */
+function isWidgetsCustomizerEditor() {
+ return !! document.getElementById( 'customize-controls' );
+}
+
+
+/**
+ * Checks whether the current screen is the site editor.
+ * Takes in account if Gutenberg is activated.
+ *
+ * @returns {boolean} True if site editor screen, false otherwise.
+ */
+function isSiteBlockEditor() {
+ return !! ( document.getElementById( 'site-editor' ) || document.getElementById( 'edit-site-editor' ) );
+}
+
+/**
+ * Returns the post type URL for REST API calls or undefined if the user hasn't the rights.
+ *
+ * @param {string} name The post type name.
+ * @returns {string|undefined}
+ */
+function getPostsUrl( name ) {
+ const postTypes = (0,external_this_wp_data_.select)( 'core' ).getEntitiesByKind( 'postType' );
+ const postType = (0,external_lodash_.find)( postTypes, { name } );
+ return postType?.baseURL;
+}
+
+/**
+ * Gets all query string parameters and convert them in a URLSearchParams object.
+ *
+ * @returns {Object}
+ */
+function utils_getSearchParams() {
+ // Variable window.location.search is just read for creating and returning a URLSearchParams object to be able to manipulate it more easily.
+ if ( ! isEmpty( window.location.search ) ) { // phpcs:ignore WordPressVIPMinimum.JS.Window.location
+ return new URLSearchParams( window.location.search ); // phpcs:ignore WordPressVIPMinimum.JS.Window.location
+ } else {
+ return null;
+ }
+}
+
+/**
+ * Gets selected language.
+ *
+ * @param {string} lang The post language code.
+ * @returns {Object} The selected language.
+ */
+function getSelectedLanguage( lang ) {
+ const languages = select( MODULE_KEY ).getLanguages();
+ // Pick up this language as selected in languages list
+ return languages.get( lang );
+}
+
+/**
+ * Gets the default language.
+ *
+ * @returns {Object} The default Language.
+ */
+function getDefaultLanguage() {
+ const languages = (0,external_this_wp_data_.select)( settings_MODULE_KEY ).getLanguages();
+ return Array.from( languages.values() ).find( lang => lang.is_default );
+}
+
+/**
+ * Checks if the given language is the default one.
+ *
+ * @param {string} lang The language code to compare with.
+ * @returns {boolean} True if the given language is the default one.
+ */
+function isDefaultLanguage( lang ) {
+ return lang === getDefaultLanguage().slug;
+}
+
+/**
+ * Gets translated posts.
+ *
+ * @param {Object} translations The translated posts object with language codes as keys and ids as values.
+ * @param {Object.} translations_table The translations table data with language codes as keys and data object as values.
+ * @returns {Map}
+ */
+function utils_getTranslatedPosts( translations, translations_table, lang ) {
+ const translationsTable = getTranslationsTable( translations_table, lang );
+ const fromPost = select( MODULE_KEY ).getFromPost();
+ let translatedPosts = new Map( Object.entries( [] ) );
+ if ( ! isUndefined( translations ) ) {
+ translatedPosts = new Map( Object.entries( translations ) );
+ }
+ // If we come from another post for creating a new one, we have to update translated posts from the original post
+ // to be able to update translations attribute of the post
+ if ( ! isNil( fromPost ) && ! isNil( fromPost.id ) ) {
+ translationsTable.forEach(
+ ( translationData, lang ) => {
+ if ( ! isNil( translationData.translated_post ) && ! isNil( translationData.translated_post.id ) ) {
+ translatedPosts.set( lang, translationData.translated_post.id );
+ }
+ }
+ );
+ }
+ return translatedPosts;
+}
+
+/**
+ * Gets synchronized posts.
+ *
+ * @param {Object.} pll_sync_post The synchronized posts object with language codes as keys and boolean values to say if the post is synchronized or not.
+ * @returns {Map}
+ */
+function getSynchronizedPosts( pll_sync_post ){
+ let synchronizedPosts = new Map( Object.entries( [] ) );
+ if ( ! isUndefined( pll_sync_post ) ) {
+ synchronizedPosts = new Map( Object.entries( pll_sync_post ) );
+ }
+ return synchronizedPosts;
+}
+
+/**
+ * Gets translations table.
+ *
+ * @param {Object.} translationsTableDatas The translations table data object with language codes as keys and data object as values.
+ * @returns {Map}
+ */
+function getTranslationsTable( translationsTableDatas ){
+ let translationsTable = new Map( Object.entries( [] ) );
+ // get translations table datas from post
+ if ( ! isUndefined( translationsTableDatas ) ) {
+ // Build translations table map with language slug as key
+ translationsTable = new Map( Object.entries( translationsTableDatas ) );
+ }
+ return translationsTable;
+}
+
+/**
+ * Checks if the given request is for saving.
+ *
+ * @param {Object} options The initial request.
+ * @returns {Boolean} True if the request is for saving.
+ */
+function isSaveRequest( options ){
+ // If data is defined we are in a PUT or POST request method otherwise a GET request method
+ // Test options.method property isn't efficient because most of REST request which use fetch API doesn't pass this property.
+ // So, test options.data is necessary to know if the REST request is to save datas.
+ // However test if options.data is undefined isn't sufficient because some REST request pass a null value as the ServerSideRender Gutenberg component.
+ if ( ! (0,external_lodash_.isNil)( options.data ) ) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * Checks if the given request concerns the current post type.
+ *
+ * Useful when saving a reusable block contained in another post type.
+ * Indeed a reusable block is also a post, but its saving request doesn't concern the post currently edited.
+ * As we don't know the language of the reusable block when the user triggers the reusable block saving action,
+ * we need to pass the current post language to be sure that the reusable block will have a language.
+ *
+ * @see https://github.com/polylang/polylang/issues/437 - Reusable block has no language when it's saved from another post type editing.
+ *
+ * @param {Object} options the initial request
+ * @returns {boolean} True if the request concerns the current post.
+ */
+function isCurrentPostRequest( options ){
+ // Saving translation data is needed only for all post types.
+ // It's done by verifying options.path matches with one of baseURL of all post types
+ // and compare current post id with this sent in the request.
+
+ // List of post type baseURLs.
+ const postTypeURLs = (0,external_lodash_.map)( (0,external_this_wp_data_.select)( 'core' ).getEntitiesByKind( 'postType' ), (0,external_lodash_.property)( 'baseURL' ) );
+
+ // Id from the post currently edited.
+ const postId = (0,external_this_wp_data_.select)( 'core/editor' ).getCurrentPostId();
+
+ // Id from the REST request.
+ // options.data never isNil here because it's already verified before in isSaveRequest() function.
+ const id = options.data.id;
+
+ // Return true
+ // if REST request baseURL matches with one of the known post type baseURLs
+ // and the id from the post currently edited corresponds on the id passed to the REST request
+ // Return false otherwise
+ return -1 !== postTypeURLs.findIndex(
+ function ( element ) {
+ return new RegExp( `${ (0,external_lodash_.escapeRegExp)( element ) }` ).test( options.path );
+ }
+ ) && postId === id;
+}
+
+/**
+ * Checks if the given REST request is for the creation of a new template part translation.
+ *
+ * @param {Object} options The initial request.
+ * @returns {Boolean} True if the request concerns a template part translation creation.
+ */
+function isTemplatePartTranslationCreationRequest( options ) {
+ return 'POST' === options.method
+ && options.path.match( /^\/wp\/v2\/template-parts(?:\/|\?|$)/ )
+ && ! (0,external_lodash_.isNil)( options.data.from_post )
+ && ! (0,external_lodash_.isNil)( options.data.lang );
+}
+
+/**
+ * Checks if the given REST request is for the creation of a new template part.
+ *
+ * @param {Object} options The initial request.
+ * @returns {Boolean} True if the request concerns a template part creation.
+ */
+function isNewTemplatePartCreationRequest( options ) {
+ return 'POST' === options.method
+ && options.path.match( /^\/wp\/v2\/template-parts(?:\/|\?|$)/ )
+ && (0,external_lodash_.isNil)( options.data.from_post )
+ && (0,external_lodash_.isNil)( options.data.lang );
+}
+
+/**
+ * Adds language as query string parameter to the given request.
+ *
+ * @param {Object} options The initial request.
+ * @param {string} currentLanguage The language code to add to the request.
+ */
+function addLanguageToRequest( options, currentLanguage ){
+ const hasLangArg= (0,external_this_wp_url_.hasQueryArg)( options.path, 'lang' );
+ const filterLang = (0,external_lodash_.isUndefined)( options.filterLang ) || options.filterLang;
+ if ( filterLang && ! hasLangArg ) {
+ options.path = (0,external_this_wp_url_.addQueryArgs)(
+ options.path,
+ {
+ lang: currentLanguage
+ }
+ );
+ }
+}
+
+/**
+ * Adds `include_untranslated` parameter to the request.
+ *
+ * @param {Object} options The initial request.
+ * @returns {void}
+ */
+function addIncludeUntranslatedParam( options ) {
+ options.path = (0,external_this_wp_url_.addQueryArgs)(
+ options.path,
+ {
+ include_untranslated: true
+ }
+ );
+}
+
+/**
+ * Use addIncludeUntranslatedParam if the given page is a template part page.
+ * Or if the template editing mode is enabled inside post editing.
+ *
+ * @param {Object} options The initial request.
+ * @returns {void}
+ */
+function maybeRequireIncludeUntranslatedTemplate( options ) {
+ const params = ( new URL( document.location ) ).searchParams;
+ const postType = params.get( 'postType' );
+ const postId = params.get( 'postId' );
+ const isEditingTemplate = (0,external_this_wp_data_.select)( MODULE_POST_EDITOR_KEY )?.isEditingTemplate();
+ if ( ( "wp_template_part" === postType && ! (0,external_lodash_.isNil)( postId ) ) || isEditingTemplate ) {
+ addIncludeUntranslatedParam( options );
+ }
+}
+
+/**
+ * Returns true if the given post is a template part, false otherwise.
+ *
+ * @param {Object} post A post object.
+ * @returns {boolean} Whether it is a template part or not.
+ */
+function isTemplatePart( post ) {
+ return 'wp_template_part' === post.type;
+}
+
+/**
+ * Returns the current post type considering the Site Editor or Post Editor.
+ *
+ * @returns {string} The current post type.
+ */
+function getCurrentPostType() {
+ if ( isSiteBlockEditor() ) {
+ return (0,external_this_wp_data_.select)( settings_MODULE_SITE_EDITOR_KEY ).getEditedPostType();
+ }
+
+ return (0,external_this_wp_data_.select)( settings_MODULE_CORE_EDITOR_KEY ).getCurrentPostType();
+}
+
+/**
+ * Returns a regular expression ready to use to perform search and replace.
+ *
+ * @returns {RegExp} The regular expression.
+ */
+function getLangSlugRegex() {
+ let languageCheckPattern = TEMPLATE_PART_SLUG_CHECK_LANGUAGE_PATTERN;
+ const languages = select( MODULE_KEY ).getLanguages();
+ const languageSlugs = Array.from( languages.keys() );
+ if ( ! isEmpty( languageSlugs ) ) {
+ languageCheckPattern = languageSlugs.join( '|' );
+ }
+
+ return new RegExp( `${TEMPLATE_PART_SLUG_SEPARATOR}(?:${languageCheckPattern})$` );
+}
+
+;// ./modules/block-editor/js/sidebar/store/utils.js
+/**
+ * WordPress Dependencies
+ *
+ * @package Polylang-Pro
+ */
+
+
+
+
+/**
+ * Internal dependencies
+ */
+
+
+
+/**
+ * Wait for the whole post block editor context has been initialized: current post loaded and languages list initialized.
+ */
+const isBlockPostEditorContextInitialized = () => {
+ if ( isNil( select( MODULE_CORE_EDITOR_KEY ) ) ) {
+ return Promise.reject( "Polylang languages panel can't be initialized because block editor isn't fully initialized." );
+ }
+
+ // save url params espacially when a new translation is creating
+ saveURLParams();
+ // call to getCurrentUser to force call to resolvers and initialize state
+ const currentUser = select( MODULE_KEY ).getCurrentUser();
+
+ /**
+ * Set a promise for waiting for the current post has been fully loaded before making other processes.
+ */
+ const isCurrentPostLoaded = new Promise(
+ function ( resolve ) {
+ let unsubscribe = subscribe(
+ function () {
+ const currentPost = select( MODULE_CORE_EDITOR_KEY ).getCurrentPost();
+ if ( ! isEmpty( currentPost ) ) {
+ unsubscribe();
+ resolve();
+ }
+ }
+ );
+ }
+ );
+
+ // Wait for current post has been loaded and languages list initialized.
+ return Promise.all( [ isCurrentPostLoaded, isLanguagesinitialized() ] ).then(
+ function () {
+ // If we come from another post for creating a new one, we have to update translations from the original post.
+ const fromPost = select( MODULE_KEY ).getFromPost();
+ if ( ! isNil( fromPost ) && ! isNil( fromPost.id ) ) {
+ const lang = select( MODULE_CORE_EDITOR_KEY ).getEditedPostAttribute( 'lang' );
+ const translations = select( MODULE_CORE_EDITOR_KEY ).getEditedPostAttribute( 'translations' );
+ const translations_table = select( MODULE_CORE_EDITOR_KEY ).getEditedPostAttribute( 'translations_table' );
+ const translatedPosts = getTranslatedPosts( translations, translations_table, lang );
+ dispatch( MODULE_CORE_EDITOR_KEY ).editPost( { translations: convertMapToObject( translatedPosts ) } );
+ }
+ }
+ );
+}
+
+/**
+ * Wait for the whole site editor context to be initialized: current template loaded and languages list initialized.
+ */
+const isSiteEditorContextInitialized = () => {
+ // save url params espacially when a new translation is creating
+ saveURLParams();
+ // call to getCurrentUser to force call to resolvers and initialize state
+ const currentUser = select( MODULE_KEY ).getCurrentUser();
+
+ /**
+ * Set a promise to wait for the current template to be fully loaded before making other processes.
+ * It allows to see if both Site Editor and Core stores are available (@see getCurrentPostFromDataStore()).
+ */
+ const isTemplatePartLoaded = new Promise(
+ function ( resolve ) {
+ let unsubscribe = subscribe(
+ function () {
+ const store = select( MODULE_SITE_EDITOR_KEY );
+ if ( store ) {
+ unsubscribe();
+ resolve();
+ }
+ }
+ );
+ }
+ );
+
+ return Promise.all( [ isTemplatePartLoaded, isLanguagesinitialized() ] );
+}
+
+/**
+ * Returns a promise fulfilled when the languages list is correctly initialized before making other processes.
+ */
+const isLanguagesinitialized = () => new Promise(
+ function ( resolve ) {
+ let unsubscribe = subscribe(
+ function () {
+ const languages = select( MODULE_KEY )?.getLanguages();
+ if ( languages?.size > 0 ) {
+ unsubscribe();
+ resolve();
+ }
+ }
+ );
+ }
+);
+
+/**
+ * Save query string parameters from URL. They could be needed after
+ * They could be null if they does not exist
+ */
+function saveURLParams(){
+ // Variable window.location.search isn't use directly
+ // Function getSearchParams return an URLSearchParams object for manipulating each parameter
+ // Each of them are sanitized below
+ const searchParams = getSearchParams();
+ if ( null !== searchParams ) {
+ dispatch( MODULE_KEY ).setFromPost(
+ {
+ id: wp.sanitize.stripTagsAndEncodeText( searchParams.get( 'from_post' ) ),
+ postType: wp.sanitize.stripTagsAndEncodeText( searchParams.get( 'post_type' ) ),
+ newLanguage: wp.sanitize.stripTagsAndEncodeText( searchParams.get( 'new_lang' ) )
+ }
+ );
+ }
+}
+
+const getEditedPostContextWithLegacy = () => {
+ const siteEditorSelector = (0,external_this_wp_data_.select)( settings_MODULE_SITE_EDITOR_KEY );
+
+ /**
+ * Return null when called from our apiFetch middleware without a properly loaded store.
+ */
+ if ( ! siteEditorSelector ) {
+ return null;
+ }
+
+ const _context = {
+ postId: siteEditorSelector.getEditedPostId(),
+ postType: siteEditorSelector.getEditedPostType()
+ }
+
+ if ( siteEditorSelector.hasOwnProperty( 'getEditedPostContext' ) ) {
+ const context = siteEditorSelector.getEditedPostContext();
+
+ return context?.postType && context?.postId
+ ? context
+ : _context;
+ }
+
+ /**
+ * Backward compatibility with WordPress < 6.3 where `getEditedPostContext()` doesn't exist yet.
+ */
+ return _context;
+}
+
+/**
+ * Gets the current post using the Site Editor store and the Core store.
+ *
+ * @returns {object|null} The current post object, `null` if none found.
+ */
+const getCurrentPostFromDataStore = () => {
+ const editedContext = getEditedPostContextWithLegacy();
+
+ return null === editedContext
+ ? null
+ : (0,external_this_wp_data_.select)( MODULE_CORE_KEY ).getEntityRecord(
+ 'postType',
+ editedContext.postType,
+ editedContext.postId
+ );
+}
+
+;// ./modules/block-editor/js/middleware/filter-path-middleware.js
+/**
+ * @package Polylang Pro
+ */
+
+/**
+ * Filters requests for translatable entities.
+ * This logic is shared accross all Polylang plugins.
+ *
+ * @since 3.5
+ *
+ * @param {APIFetchOptions} options
+ * @param {Array} filteredRoutes
+ * @param {CallableFunction} filter
+ * @returns {APIFetchOptions}
+ */
+const filterPathMiddleware = ( options, filteredRoutes, filter ) => {
+ const cleanPath = options.path.split( '?' )[0].replace(/^\/+|\/+$/g, ''); // Get path without query parameters and trim '/'.
+
+ return Object.values( filteredRoutes ).find( ( path ) => cleanPath === path ) ? filter( options ) : options;
+}
+
+/* harmony default export */ const filter_path_middleware = (filterPathMiddleware);
+
+;// ./modules/block-editor/js/block-editor-plugin.js
+/**
+ * WordPress dependencies
+ *
+ * @package Polylang-Pro
+ */
+
+
+
+
+/**
+ * External dependencies
+ */
+
+
+/**
+ * Internal dependencies
+ */
+
+
+
+
+
+/*
+ * Initializes a block editor apiFetch middleware to be able to filter REST API requests.
+ */
+external_this_wp_apiFetch_default().use(
+ ( options, next ) => {
+ /*
+ * If options.url is defined, this is not a REST request but a direct call to post.php for legacy metaboxes.
+ * If `filteredRoutes` is not defined, return early.
+ */
+ if ( 'undefined' !== typeof options.url || 'undefined' === typeof pllFilteredRoutes ) {
+ return next( options );
+ }
+
+ return next( filter_path_middleware( options, pllFilteredRoutes, addParametersToRequest ) );
+ }
+);
+
+/**
+ * Adds parameters according to the context of the request.
+ *
+ * @since 3.5
+ *
+ * @param {APIFetchOptions} options
+ * @returns {APIFetchOptions}
+ */
+const addParametersToRequest = ( options ) => {
+ const currentLangSlug = getCurrentLanguageSlug();
+
+ // `POST` or `PUT` request.
+ if ( isSaveRequest( options ) ) {
+ /**
+ * Use default language for new template part that doesn't exist in any language,
+ * otherwise use the current language.
+ */
+ if ( isNewTemplatePartCreationRequest( options ) ) {
+ addLanguageToRequest( options, getDefaultLanguage()?.slug );
+ }
+
+ if ( ! isCurrentPostRequest( options ) && ! isTemplatePartTranslationCreationRequest( options ) ) {
+ addLanguageToRequest( options, currentLangSlug );
+ }
+
+ maybeAddLangSuffixToTemplatePart( options, currentLangSlug );
+
+ return options;
+ }
+
+ const currentPostType = getCurrentPostType();
+
+ // Current language is set to default when editing templates.
+ if ( 'wp_template' === currentPostType ) {
+ addLanguageToRequest( options, getDefaultLanguage()?.slug );
+ }
+
+ const templatePartListRegex = new RegExp( /^\/wp\/v2\/template-parts\/?(?:\?.*)?$/ );
+
+ // Template part list request.
+ if ( templatePartListRegex.test( options.path ) ) {
+ maybeRequireIncludeUntranslatedTemplate( options );
+ }
+
+ // All kinds of requests.
+ addLanguageToRequest( options, currentLangSlug );
+
+ return options;
+}
+
+/**
+ * Gets language from store or a fallback javascript global variable.
+ *
+ * @returns {string}
+ */
+function getCurrentLanguageSlug(){
+ if ( (0,external_lodash_.isUndefined)( (0,external_this_wp_data_.select)( settings_MODULE_CORE_EDITOR_KEY ) ) ) {
+ // Return ASAP to avoid issues later.
+ return pll_block_editor_plugin_settings.lang.slug;
+ }
+
+ // Post block editor case.
+ const postLanguage = (0,external_this_wp_data_.select)( settings_MODULE_CORE_EDITOR_KEY ).getEditedPostAttribute( 'lang' );
+ if ( ! (0,external_lodash_.isUndefined)( postLanguage ) && postLanguage ) {
+ return postLanguage;
+ }
+
+ // Returns the default lang if the current location is a template part list
+ // and update pll_block_editor_plugin_settings at the same time.
+ const params = ( new URL( document.location ) ).searchParams;
+ const postType = params.get( 'postType' );
+ const postId = params.get( 'postId' );
+ if ( "wp_template_part" === postType && (0,external_lodash_.isNil)( postId ) ) {
+ pll_block_editor_plugin_settings.lang = getDefaultLanguage();
+
+ return pll_block_editor_plugin_settings.lang.slug;
+ }
+
+ // FSE template editor case.
+ const template = getCurrentPostFromDataStore();
+ const templateLanguage = template?.lang;
+ if ( ! (0,external_lodash_.isUndefined)( templateLanguage ) && templateLanguage ) {
+ return templateLanguage;
+ }
+
+ // For the first requests block editor isn't initialized yet.
+ // So language is retrieved from a javascript global variable initialized server-side.
+ return pll_block_editor_plugin_settings.lang.slug;
+}
+
+/**
+ * Adds the language suffix to a template part only during creation.
+ *
+ * @param {object} options Object representing a REST request.
+ * @param {string} langSlug The Language slug to add.
+ * @return {void}
+ */
+function maybeAddLangSuffixToTemplatePart( options, langSlug ){
+ const restBaseUrl = getPostsUrl( 'wp_template_part' );
+ if ( (0,external_lodash_.isUndefined)( restBaseUrl ) ) {
+ // The user hasn't the rights to edit template part.
+ return;
+ }
+ const templatePartURLRegExp = new RegExp( (0,external_lodash_.escapeRegExp)( restBaseUrl ) );
+ if ( 'POST' == options.method && templatePartURLRegExp.test( options.path ) ) {
+ const languages = (0,external_this_wp_data_.select)( settings_MODULE_KEY ).getLanguages();
+ const language = languages.get( langSlug );
+
+ if ( ! language.is_default ) {
+ // No suffix for default language.
+ const langSuffix = settings_TEMPLATE_PART_SLUG_SEPARATOR + langSlug;
+ options.data.slug += langSuffix;
+ }
+ }
+}
+
+// Duplicate code of PLL_Admin_Base::admin_print_footer_scripts() to add lang parameter in admin ajax requests in FSE.
+if ( typeof jQuery != 'undefined' ) {
+ jQuery(
+ function ( $ ) {
+ $.ajaxPrefilter( function ( options, originalOptions, jqXHR ) {
+ if ( -1 != options.url.indexOf( ajaxurl ) || -1 != ajaxurl.indexOf( options.url ) ) {
+
+ const currentLanguage = getCurrentLanguageSlug();
+ const arr = { 'lang' : currentLanguage };
+
+ function addPolylangParametersAsString() {
+ const str = 'lang=' + currentLanguage;
+ if ( 'undefined' === typeof options.data || '' === options.data.trim() ) {
+ // Only Polylang data need to be send. So it could be as a simple query string.
+ options.data = str;
+ } else {
+ /*
+ * In some cases data could be a JSON string like in third party plugins.
+ * So we need not to break their process by adding polylang parameters as valid JSON datas.
+ */
+ try {
+ options.data = JSON.stringify( Object.assign( JSON.parse( options.data ), arr ) );
+ } catch ( exception ) {
+ // Add Polylang data to the existing query string.
+ options.data = options.data + '&' + str;
+ }
+ }
+ }
+
+ /*
+ * options.processData set to true is the default jQuery process where the data is converted in a query string by using jQuery.param().
+ * This step is done before applying filters. Thus here the options.data is already a string in this case.
+ * @See https://github.com/jquery/jquery/blob/3.5.1/src/ajax.js#L563-L569 jQuery ajax function.
+ * It is the most case WordPress send ajax request this way however third party plugins or themes could be send JSON string.
+ * Use JSON format is recommended in jQuery.param() documentation to be able to send complex data structures.
+ * @See https://api.jquery.com/jquery.param/ jQuery param function.
+ */
+ if ( options.processData ) {
+ addPolylangParametersAsString();
+ } else {
+ /*
+ * If options.processData is set to false data could be undefined or pass as a string.
+ * So data as to be processed as if options.processData is set to true.
+ */
+ if ( 'undefined' === typeof options.data || 'string' === typeof options.data ) {
+ addPolylangParametersAsString();
+ } else {
+ // Otherwise options.data is probably an object.
+ options.data = Object.assign( options.data || {} , arr );
+ }
+ }
+ }
+ });
+ }
+ );
+}
+
+})();
+
+this["polylang-pro"] = __webpack_exports__;
+/******/ })()
+;
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/js/build/block-editor-plugin.min.js b/wp-content/plugins/polylang-pro/js/build/block-editor-plugin.min.js
new file mode 100644
index 000000000..e599c732f
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/block-editor-plugin.min.js
@@ -0,0 +1 @@
+(()=>{var t={419:t=>{t.exports=function(){return this.lodash}()},631:t=>{t.exports=function(){return this.wp.apiFetch}()},987:t=>{t.exports=function(){return this.wp.data}()},172:t=>{t.exports=function(){return this.wp.url}()}},e={};function n(s){var r=e[s];if(void 0!==r)return r.exports;var a=e[s]={exports:{}};return t[s](a,a.exports,n),a.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var s in e)n.o(e,s)&&!n.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);(()=>{"use strict";var t=n(631),e=n.n(t),s=n(987),r=n(419),a=n(172);const o="pll/metabox",i="core/editor",p="core/edit-site";function l(){const t=(0,s.select)(o).getLanguages();return Array.from(t.values()).find((t=>t.is_default))}function d(t,e){const n=(0,a.hasQueryArg)(t.path,"lang");((0,r.isUndefined)(t.filterLang)||t.filterLang)&&!n&&(t.path=(0,a.addQueryArgs)(t.path,{lang:e}))}function u(t){const e=new URL(document.location).searchParams,n=e.get("postType"),o=e.get("postId"),i=(0,s.select)("core/edit-post")?.isEditingTemplate();("wp_template_part"===n&&!(0,r.isNil)(o)||i)&&function(t){t.path=(0,a.addQueryArgs)(t.path,{include_untranslated:!0})}(t)}function c(){return document.getElementById("site-editor")||document.getElementById("edit-site-editor")?(0,s.select)(p).getEditedPostType():(0,s.select)(i).getCurrentPostType()}const g=()=>{const t=(()=>{const t=(0,s.select)(p);if(!t)return null;const e={postId:t.getEditedPostId(),postType:t.getEditedPostType()};if(t.hasOwnProperty("getEditedPostContext")){const n=t.getEditedPostContext();return n?.postType&&n?.postId?n:e}return e})();return null===t?null:(0,s.select)("core").getEntityRecord("postType",t.postType,t.postId)},f=(t,e,n)=>{const s=t.path.split("?")[0].replace(/^\/+|\/+$/g,"");return Object.values(e).find((t=>s===t))?n(t):t};e().use(((t,e)=>void 0!==t.url||"undefined"==typeof pllFilteredRoutes?e(t):e(f(t,pllFilteredRoutes,y))));const y=t=>{const e=_();if(function(t){return!(0,r.isNil)(t.data)}(t))return function(t){return"POST"===t.method&&t.path.match(/^\/wp\/v2\/template-parts(?:\/|\?|$)/)&&(0,r.isNil)(t.data.from_post)&&(0,r.isNil)(t.data.lang)}(t)&&d(t,l()?.slug),function(t){const e=(0,r.map)((0,s.select)("core").getEntitiesByKind("postType"),(0,r.property)("baseURL")),n=(0,s.select)("core/editor").getCurrentPostId(),a=t.data.id;return-1!==e.findIndex((function(e){return new RegExp(`${(0,r.escapeRegExp)(e)}`).test(t.path)}))&&n===a}(t)||function(t){return"POST"===t.method&&t.path.match(/^\/wp\/v2\/template-parts(?:\/|\?|$)/)&&!(0,r.isNil)(t.data.from_post)&&!(0,r.isNil)(t.data.lang)}(t)||d(t,e),function(t,e){const n=function(t){const e=(0,s.select)("core").getEntitiesByKind("postType"),n=(0,r.find)(e,{name:t});return n?.baseURL}("wp_template_part");if((0,r.isUndefined)(n))return;const a=new RegExp((0,r.escapeRegExp)(n));if("POST"==t.method&&a.test(t.path)){if(!(0,s.select)(o).getLanguages().get(e).is_default){const n="___"+e;t.data.slug+=n}}}(t,e),t;"wp_template"===c()&&d(t,l()?.slug);return new RegExp(/^\/wp\/v2\/template-parts\/?(?:\?.*)?$/).test(t.path)&&u(t),d(t,e),t};function _(){if((0,r.isUndefined)((0,s.select)(i)))return pll_block_editor_plugin_settings.lang.slug;const t=(0,s.select)(i).getEditedPostAttribute("lang");if(!(0,r.isUndefined)(t)&&t)return t;const e=new URL(document.location).searchParams,n=e.get("postType"),a=e.get("postId");if("wp_template_part"===n&&(0,r.isNil)(a))return pll_block_editor_plugin_settings.lang=l(),pll_block_editor_plugin_settings.lang.slug;const o=g(),p=o?.lang;return!(0,r.isUndefined)(p)&&p?p:pll_block_editor_plugin_settings.lang.slug}"undefined"!=typeof jQuery&&jQuery((function(t){t.ajaxPrefilter((function(t,e,n){if(-1!=t.url.indexOf(ajaxurl)||-1!=ajaxurl.indexOf(t.url)){const s=_(),r={lang:s};function a(){const e="lang="+s;if(void 0===t.data||""===t.data.trim())t.data=e;else try{t.data=JSON.stringify(Object.assign(JSON.parse(t.data),r))}catch(n){t.data=t.data+"&"+e}}t.processData||void 0===t.data||"string"==typeof t.data?a():t.data=Object.assign(t.data||{},r)}}))}))})(),this["polylang-pro"]={}})();
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/js/build/block-editor.js b/wp-content/plugins/polylang-pro/js/build/block-editor.js
new file mode 100644
index 000000000..ffbeb84ec
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/block-editor.js
@@ -0,0 +1,405 @@
+/******/ "use strict";
+
+;// ./vendor/wpsyntex/polylang/js/src/lib/confirmation-modal.js
+/**
+ * @package Polylang
+ */
+
+const languagesList = jQuery( '.post_lang_choice' );
+
+// Dialog box for alerting the user about a risky changing.
+const initializeConfirmationModal = () => {
+ // We can't use underscore or lodash in this common code because it depends of the context classic or block editor.
+ // Classic editor underscore is loaded, Block editor lodash is loaded.
+ const { __ } = wp.i18n;
+
+ // Create dialog container.
+ const dialogContainer = jQuery(
+ '',
+ {
+ id: 'pll-dialog',
+ style: 'display:none;'
+ }
+ ).text( __( 'Are you sure you want to change the language of the current content?', 'polylang' ) );
+
+ // Put it after languages list dropdown.
+ // PHPCS ignore dialogContainer is a new safe HTML code generated above.
+ languagesList.after( dialogContainer ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.after
+
+ const dialogResult = new Promise(
+ ( confirm, cancel ) => {
+ const confirmDialog = ( what ) => { // phpcs:ignore PEAR.Functions.FunctionCallSignature.Indent
+ switch ( what ) { // phpcs:ignore PEAR.Functions.FunctionCallSignature.Indent
+ case 'yes':
+ // Confirm the new language.
+ languagesList.data( 'old-value', languagesList.children( ':selected' ).first().val() );
+ confirm();
+ break;
+ case 'no':
+ // Revert to the old language.
+ languagesList.val( languagesList.data( 'old-value' ) );
+ cancel( 'Cancel' );
+ break;
+ }
+ dialogContainer.dialog( 'close' ); // phpcs:ignore PEAR.Functions.FunctionCallSignature.Indent
+ } // phpcs:ignore PEAR.Functions.FunctionCallSignature.Indent
+
+ // Initialize dialog box in the case a language is selected but not added in the list.
+ const dialogOptions = {
+ autoOpen: false,
+ modal: true,
+ draggable: false,
+ resizable: false,
+ title: __( 'Change language', 'polylang' ),
+ minWidth: 600,
+ maxWidth: '100%',
+ open: function ( event, ui ) {
+ // Change dialog box position for rtl language
+ if ( jQuery( 'body' ).hasClass( 'rtl' ) ) {
+ jQuery( this ).parent().css(
+ {
+ right: jQuery( this ).parent().css( 'left' ),
+ left: 'auto'
+ }
+ );
+ }
+ },
+ close: function ( event, ui ) {
+ // When we're closing the dialog box we need to cancel the language change as we click on Cancel button.
+ confirmDialog( 'no' );
+ },
+ buttons: [
+ {
+ text: __( 'OK', 'polylang' ),
+ click: function ( event ) {
+ confirmDialog( 'yes' );
+ }
+ },
+ {
+ text: __( 'Cancel', 'polylang' ),
+ click: function ( event ) {
+ confirmDialog( 'no' );
+ }
+ }
+ ]
+ };
+
+ if ( jQuery.ui.version >= '1.12.0' ) {
+ Object.assign( dialogOptions, { classes: { 'ui-dialog': 'pll-confirmation-modal' } } );
+ } else {
+ Object.assign( dialogOptions, { dialogClass: 'pll-confirmation-modal' } ); // jQuery UI 1.11.4 - WP < 5.6
+ }
+
+ dialogContainer.dialog( dialogOptions );
+ }
+ );
+ return { dialogContainer, dialogResult };
+}
+
+const initializeLanguageOldValue = () => {
+ // Keep the old language value to be able to compare to the new one and revert to it if necessary.
+ languagesList.attr( 'data-old-value', languagesList.children( ':selected' ).first().val() );
+};
+
+;// ./vendor/wpsyntex/polylang/js/src/lib/metabox-autocomplete.js
+/**
+ * @package Polylang
+ */
+
+// Translations autocomplete input box.
+function initMetaboxAutoComplete() {
+ jQuery('.tr_lang').each(
+ function () {
+ var tr_lang = jQuery(this).attr('id').substring(8);
+ var td = jQuery(this).parent().parent().siblings('.pll-edit-column');
+
+ jQuery(this).autocomplete(
+ {
+ minLength: 0,
+ source: ajaxurl + '?action=pll_posts_not_translated' +
+ '&post_language=' + jQuery('.post_lang_choice').val() +
+ '&translation_language=' + tr_lang +
+ '&post_type=' + jQuery('#post_type').val() +
+ '&_pll_nonce=' + jQuery('#_pll_nonce').val(),
+ select: function (event, ui) {
+ jQuery('#htr_lang_' + tr_lang).val(ui.item.id);
+ // ui.item.link is built and come from server side and is well escaped when necessary
+ td.html(ui.item.link); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
+ },
+ }
+ );
+
+ // when the input box is emptied
+ jQuery(this).on(
+ 'blur',
+ function () {
+ if ( ! jQuery(this).val() ) {
+ jQuery('#htr_lang_' + tr_lang).val(0);
+ // Value is retrieved from HTML already generated server side
+ td.html(td.siblings('.hidden').children().clone()); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
+ }
+ }
+ );
+ }
+ );
+}
+
+;// ./vendor/wpsyntex/polylang/js/src/lib/filter-path-middleware.js
+/**
+ * @package Polylang
+ */
+
+/**
+ * Filters requests for translatable entities.
+ * This logic is shared across all Polylang plugins.
+ *
+ * @since 3.5
+ *
+ * @param {APIFetchOptions} options
+ * @param {Array} filteredRoutes
+ * @param {CallableFunction} filter
+ * @returns {APIFetchOptions}
+ */
+const filterPathMiddleware = ( options, filteredRoutes, filter ) => {
+ const cleanPath = options.path.split( '?' )[0].replace(/^\/+|\/+$/g, ''); // Get path without query parameters and trim '/'.
+
+ return Object.values( filteredRoutes ).find( ( path ) => cleanPath === path ) ? filter( options ) : options;
+}
+
+/* harmony default export */ const filter_path_middleware = (filterPathMiddleware);
+
+;// ./vendor/wpsyntex/polylang/js/src/block-editor.js
+/**
+ * @package Polylang
+ */
+
+
+
+
+
+
+
+/**
+ * Filter REST API requests to add the language in the request
+ *
+ * @since 2.5
+ */
+wp.apiFetch.use(
+ function ( options, next ) {
+ /*
+ * If options.url is defined, this is not a REST request but a direct call to post.php for legacy metaboxes.
+ * If `filteredRoutes` is not defined, return early.
+ */
+ if ( 'undefined' !== typeof options.url || 'undefined' === typeof pllFilteredRoutes ) {
+ return next( options );
+ }
+
+ return next( filter_path_middleware( options, pllFilteredRoutes, addLanguageParameter ) );
+ }
+);
+
+/**
+ * Gets the language of the currently edited post, fallback to default language if none is found.
+ *
+ * @since 2.5
+ *
+ * @return {Element.value}
+ */
+function getCurrentLanguage() {
+ const lang = document.querySelector( '[name=post_lang_choice]' );
+
+ if ( null === lang ) {
+ return pllDefaultLanguage;
+ }
+
+ return lang.value;
+}
+
+/**
+ * Adds language parameter according to the current one (query string for GET, body for PUT and POST).
+ *
+ * @since 3.5
+ *
+ * @param {APIFetchOptions} options
+ * @returns {APIFetchOptions}
+ */
+function addLanguageParameter( options ) {
+ if ( 'undefined' === typeof options.data || null === options.data ) {
+ // GET
+ options.path += ( ( options.path.indexOf( '?' ) >= 0 ) ? '&lang=' : '?lang=' ) + getCurrentLanguage();
+ } else {
+ // PUT, POST
+ options.data.lang = getCurrentLanguage();
+ }
+
+ return options;
+}
+
+/**
+ * Handles internals of the metabox:
+ * Language select, autocomplete input field.
+ *
+ * @since 1.5
+ *
+ * Save post after lang choice is done and redirect to the same page for refreshing all the data.
+ *
+ * @since 2.5
+ *
+ * Link post saving after refreshing the metabox.
+ *
+ * @since 3.0
+ */
+jQuery(
+ function ( $ ) {
+ // Initialize current language to be able to compare if it changes.
+ initializeLanguageOldValue();
+
+
+ // Ajax for changing the post's language in the languages metabox
+ $( '.post_lang_choice' ).on(
+ 'change',
+ function ( event ) {
+ const { select, dispatch, subscribe } = wp.data;
+ const emptyPost = isEmptyPost();
+ const { addQueryArgs } = wp.url;
+
+ // Initialize the confirmation dialog box.
+ const confirmationModal = initializeConfirmationModal();
+ const { dialogContainer : dialog } = confirmationModal;
+ let { dialogResult } = confirmationModal;
+ const selectedOption = event.target; // The selected option in the dropdown list.
+
+ // Specific case for empty posts.
+ // Place at the beginning because window.location change triggers automatically page reloading.
+ if ( location.pathname.match( /post-new.php/gi ) && emptyPost ) {
+ reloadPageForEmptyPost( selectedOption.value );
+ }
+
+ // Otherwise send an ajax request to refresh the legacy metabox and set the post language with the new language.
+ // It needs a confirmation of the user before changing the language.
+ // Need to wait the ajax response before triggering the block editor post save action.
+ if ( $( this ).data( 'old-value' ) !== selectedOption.value && ! emptyPost ) {
+ dialog.dialog( 'open' );
+ } else {
+ // Update the old language with the new one to be able to compare it in the next change.
+ // Because the page isn't reloaded in this case.
+ initializeLanguageOldValue();
+ dialogResult = Promise.resolve();
+ }
+
+ dialogResult.then(
+ () => {
+ let data = { // phpcs:ignore PEAR.Functions.FunctionCallSignature.Indent
+ action: 'post_lang_choice',
+ lang: selectedOption.value,
+ post_type: $( '#post_type' ).val(),
+ post_id: $( '#post_ID' ).val(),
+ _pll_nonce: $( '#_pll_nonce' ).val()
+ }
+
+ // Update post language in database as soon as possible.
+ // Because, in addition of the block editor save process, the legacy metabox uses a post.php process to update the language and is too late compared to the page reload.
+ $.post(
+ ajaxurl,
+ data,
+ function () {
+ blockEditorSavePostAndReloadPage();
+ }
+ );
+ },
+ () => {} // Do nothing when promise is rejected by clicking the Cancel dialog button.
+ );
+
+ function isEmptyPost() {
+ const editor = select( 'core/editor' );
+
+ return ! editor.getEditedPostAttribute( 'title' )?.trim() && ! editor.getEditedPostContent() && ! editor.getEditedPostAttribute( 'excerpt' )?.trim();
+ }
+
+ /**
+ * Reload the block editor page for empty posts.
+ *
+ * @param {string} lang The target language code.
+ */
+ function reloadPageForEmptyPost( lang ) {
+ // Change the new_lang parameter with the new language value for reloading the page
+ // WPCS location.search is never written in the page, just used to reload page with the right value of new_lang
+ // new_lang input is controlled server side in PHP. The value come from the dropdown list of language returned and escaped server side.
+ // Notice that window.location changing triggers automatically page reloading.
+ if ( -1 != location.search.indexOf( 'new_lang' ) ) {
+ // use regexp non capturing group to replace new_lang parameter no matter where it is and capture other parameters which can be behind it
+ window.location.search = window.location.search.replace( /(?:new_lang=[^&]*)(&)?(.*)/, 'new_lang=' + lang + '$1$2' ); // phpcs:ignore WordPressVIPMinimum.JS.Window.location, WordPressVIPMinimum.JS.Window.VarAssignment
+ } else {
+ window.location.search = window.location.search + ( ( -1 != window.location.search.indexOf( '?' ) ) ? '&' : '?' ) + 'new_lang=' + lang; // phpcs:ignore WordPressVIPMinimum.JS.Window.location, WordPressVIPMinimum.JS.Window.VarAssignment
+ }
+ };
+
+ /**
+ * Triggers block editor post save and reload the block editor page when everything is ok.
+ */
+ function blockEditorSavePostAndReloadPage() {
+
+ let unsubscribe = null;
+ const previousPost = select( 'core/editor').getCurrentPost();
+
+ // Listen if the savePost is completely done by subscribing to its events.
+ const savePostIsDone = new Promise(
+ function ( resolve, reject ) {
+ unsubscribe = subscribe(
+ function () {
+ const post = select( 'core/editor').getCurrentPost();
+ const { id, status, type } = post;
+ const error = select( 'core' )
+ .getLastEntitySaveError(
+ 'postType',
+ type,
+ id
+ );
+
+ if ( error ) {
+ reject();
+ }
+
+ if ( previousPost.modified !== post.modified ) {
+
+ if ( location.pathname.match( /post-new.php/gi ) && status !== 'auto-draft' && id ) {
+ window.history.replaceState(
+ { id },
+ 'Post ' + id,
+ addQueryArgs( 'post.php', { post: id, action: 'edit' } )
+ );
+ }
+ resolve();
+ }
+ }
+ );
+ }
+ );
+
+ // Triggers the post save.
+ dispatch( 'core/editor' ).savePost();
+
+ // Process
+ savePostIsDone.then(
+ function () {
+ // If the post is well saved, we can reload the page
+ window.location.reload();
+ },
+ function () {
+ // If the post save failed
+ unsubscribe();
+ }
+ ).catch(
+ function () {
+ // If an exception is thrown
+ unsubscribe();
+ }
+ );
+ };
+ }
+ );
+
+ initMetaboxAutoComplete();
+ }
+);
+
diff --git a/wp-content/plugins/polylang-pro/js/build/block-editor.min.js b/wp-content/plugins/polylang-pro/js/build/block-editor.min.js
new file mode 100644
index 000000000..6c5480a80
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/block-editor.min.js
@@ -0,0 +1 @@
+"use strict";const languagesList=jQuery(".post_lang_choice"),initializeConfirmationModal=()=>{const{__:t}=wp.i18n,e=jQuery("",{id:"pll-dialog",style:"display:none;"}).text(t("Are you sure you want to change the language of the current content?","polylang"));languagesList.after(e);const a=new Promise(((a,n)=>{const i=t=>{switch(t){case"yes":languagesList.data("old-value",languagesList.children(":selected").first().val()),a();break;case"no":languagesList.val(languagesList.data("old-value")),n("Cancel")}e.dialog("close")},l={autoOpen:!1,modal:!0,draggable:!1,resizable:!1,title:t("Change language","polylang"),minWidth:600,maxWidth:"100%",open:function(t,e){jQuery("body").hasClass("rtl")&&jQuery(this).parent().css({right:jQuery(this).parent().css("left"),left:"auto"})},close:function(t,e){i("no")},buttons:[{text:t("OK","polylang"),click:function(t){i("yes")}},{text:t("Cancel","polylang"),click:function(t){i("no")}}]};jQuery.ui.version>="1.12.0"?Object.assign(l,{classes:{"ui-dialog":"pll-confirmation-modal"}}):Object.assign(l,{dialogClass:"pll-confirmation-modal"}),e.dialog(l)}));return{dialogContainer:e,dialogResult:a}},initializeLanguageOldValue=()=>{languagesList.attr("data-old-value",languagesList.children(":selected").first().val())};function initMetaboxAutoComplete(){jQuery(".tr_lang").each((function(){var t=jQuery(this).attr("id").substring(8),e=jQuery(this).parent().parent().siblings(".pll-edit-column");jQuery(this).autocomplete({minLength:0,source:ajaxurl+"?action=pll_posts_not_translated&post_language="+jQuery(".post_lang_choice").val()+"&translation_language="+t+"&post_type="+jQuery("#post_type").val()+"&_pll_nonce="+jQuery("#_pll_nonce").val(),select:function(a,n){jQuery("#htr_lang_"+t).val(n.item.id),e.html(n.item.link)}}),jQuery(this).on("blur",(function(){jQuery(this).val()||(jQuery("#htr_lang_"+t).val(0),e.html(e.siblings(".hidden").children().clone()))}))}))}const filterPathMiddleware=(t,e,a)=>{const n=t.path.split("?")[0].replace(/^\/+|\/+$/g,"");return Object.values(e).find((t=>n===t))?a(t):t},filter_path_middleware=filterPathMiddleware;function getCurrentLanguage(){const t=document.querySelector("[name=post_lang_choice]");return null===t?pllDefaultLanguage:t.value}function addLanguageParameter(t){return void 0===t.data||null===t.data?t.path+=(t.path.indexOf("?")>=0?"&lang=":"?lang=")+getCurrentLanguage():t.data.lang=getCurrentLanguage(),t}wp.apiFetch.use((function(t,e){return void 0!==t.url||"undefined"==typeof pllFilteredRoutes?e(t):e(filter_path_middleware(t,pllFilteredRoutes,addLanguageParameter))})),jQuery((function(t){initializeLanguageOldValue(),t(".post_lang_choice").on("change",(function(e){const{select:a,dispatch:n,subscribe:i}=wp.data,l=function(){const t=a("core/editor");return!t.getEditedPostAttribute("title")?.trim()&&!t.getEditedPostContent()&&!t.getEditedPostAttribute("excerpt")?.trim()}(),{addQueryArgs:o}=wp.url,r=initializeConfirmationModal(),{dialogContainer:s}=r;let{dialogResult:u}=r;const c=e.target;var d;location.pathname.match(/post-new.php/gi)&&l&&(d=c.value,-1!=location.search.indexOf("new_lang")?window.location.search=window.location.search.replace(/(?:new_lang=[^&]*)(&)?(.*)/,"new_lang="+d+"$1$2"):window.location.search=window.location.search+(-1!=window.location.search.indexOf("?")?"&":"?")+"new_lang="+d),t(this).data("old-value")===c.value||l?(initializeLanguageOldValue(),u=Promise.resolve()):s.dialog("open"),u.then((()=>{let e={action:"post_lang_choice",lang:c.value,post_type:t("#post_type").val(),post_id:t("#post_ID").val(),_pll_nonce:t("#_pll_nonce").val()};t.post(ajaxurl,e,(function(){!function(){let t=null;const e=a("core/editor").getCurrentPost(),l=new Promise((function(n,l){t=i((function(){const t=a("core/editor").getCurrentPost(),{id:i,status:r,type:s}=t;a("core").getLastEntitySaveError("postType",s,i)&&l(),e.modified!==t.modified&&(location.pathname.match(/post-new.php/gi)&&"auto-draft"!==r&&i&&window.history.replaceState({id:i},"Post "+i,o("post.php",{post:i,action:"edit"})),n())}))}));n("core/editor").savePost(),l.then((function(){window.location.reload()}),(function(){t()})).catch((function(){t()}))}()}))}),(()=>{}))})),initMetaboxAutoComplete()}));
\ No newline at end of file
diff --git a/wp-content/plugins/polylang-pro/js/build/blocks.js b/wp-content/plugins/polylang-pro/js/build/blocks.js
new file mode 100644
index 000000000..9b4709c1e
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/js/build/blocks.js
@@ -0,0 +1,1517 @@
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ 20:
+/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
+
+"use strict";
+var __webpack_unused_export__;
+/**
+ * @license React
+ * react-jsx-runtime.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+var f=__webpack_require__(677),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};
+function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}__webpack_unused_export__=l;exports.jsx=q;exports.jsxs=q;
+
+
+/***/ }),
+
+/***/ 848:
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+"use strict";
+
+
+if (true) {
+ module.exports = __webpack_require__(20);
+} else {}
+
+
+/***/ }),
+
+/***/ 677:
+/***/ ((module) => {
+
+module.exports = (function() { return this["React"]; }());
+
+/***/ }),
+
+/***/ 419:
+/***/ ((module) => {
+
+module.exports = (function() { return this["lodash"]; }());
+
+/***/ }),
+
+/***/ 89:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["blockEditor"]; }());
+
+/***/ }),
+
+/***/ 545:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["blocks"]; }());
+
+/***/ }),
+
+/***/ 959:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["components"]; }());
+
+/***/ }),
+
+/***/ 897:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["compose"]; }());
+
+/***/ }),
+
+/***/ 987:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["data"]; }());
+
+/***/ }),
+
+/***/ 601:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["element"]; }());
+
+/***/ }),
+
+/***/ 873:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["hooks"]; }());
+
+/***/ }),
+
+/***/ 75:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["i18n"]; }());
+
+/***/ }),
+
+/***/ 933:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["primitives"]; }());
+
+/***/ }),
+
+/***/ 567:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["serverSideRender"]; }());
+
+/***/ }),
+
+/***/ 172:
+/***/ ((module) => {
+
+module.exports = (function() { return this["wp"]["url"]; }());
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ (() => {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = (module) => {
+/******/ var getter = module && module.__esModule ?
+/******/ () => (module['default']) :
+/******/ () => (module);
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+(() => {
+"use strict";
+
+// EXTERNAL MODULE: external {"this":["wp","i18n"]}
+var external_this_wp_i18n_ = __webpack_require__(75);
+// EXTERNAL MODULE: external "lodash"
+var external_lodash_ = __webpack_require__(419);
+// EXTERNAL MODULE: external {"this":["wp","compose"]}
+var external_this_wp_compose_ = __webpack_require__(897);
+// EXTERNAL MODULE: external {"this":["wp","hooks"]}
+var external_this_wp_hooks_ = __webpack_require__(873);
+// EXTERNAL MODULE: external {"this":["wp","data"]}
+var external_this_wp_data_ = __webpack_require__(987);
+// EXTERNAL MODULE: external {"this":["wp","element"]}
+var external_this_wp_element_ = __webpack_require__(601);
+// EXTERNAL MODULE: external {"this":["wp","blockEditor"]}
+var external_this_wp_blockEditor_ = __webpack_require__(89);
+// EXTERNAL MODULE: external {"this":["wp","components"]}
+var external_this_wp_components_ = __webpack_require__(959);
+// EXTERNAL MODULE: external {"this":["wp","primitives"]}
+var external_this_wp_primitives_ = __webpack_require__(933);
+// EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js
+var jsx_runtime = __webpack_require__(848);
+;// ./modules/block-editor/js/icons/library/duplication.js
+/**
+ * Duplication icon - admin-page Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const duplication = isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M6 15v-13h10v13h-10zM5 16h8v2h-10v-13h2v11z"
+ })
+}) : 'admin-page';
+/* harmony default export */ const library_duplication = ((/* unused pure expression or super */ null && (duplication)));
+;// ./modules/block-editor/js/icons/library/pencil.js
+/**
+ * Pencil icon - edit Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const pencil_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const pencil = pencil_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M13.89 3.39l2.71 2.72c0.46 0.46 0.42 1.24 0.030 1.64l-8.010 8.020-5.56 1.16 1.16-5.58s7.6-7.63 7.99-8.030c0.39-0.39 1.22-0.39 1.68 0.070zM11.16 6.18l-5.59 5.61 1.11 1.11 5.54-5.65zM8.19 14.41l5.58-5.6-1.070-1.080-5.59 5.6z"
+ })
+}) : 'edit';
+/* harmony default export */ const library_pencil = ((/* unused pure expression or super */ null && (pencil)));
+;// ./modules/block-editor/js/icons/library/plus.js
+/**
+ * Plus icon - plus Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const plus_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const plus = plus_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M17 7v3h-5v5h-3v-5h-5v-3h5v-5h3v5h5z"
+ })
+}) : 'plus';
+/* harmony default export */ const library_plus = ((/* unused pure expression or super */ null && (plus)));
+;// ./modules/block-editor/js/icons/library/synchronization.js
+/**
+ * Synchronization icon - controls-repeat Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const synchronization_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const synchronization = synchronization_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M5 7v3l-2 1.5v-6.5h11v-2l4 3.010-4 2.99v-2h-9zM15 13v-3l2-1.5v6.5h-11v2l-4-3.010 4-2.99v2h9z"
+ })
+}) : 'controls-repeat';
+/* harmony default export */ const library_synchronization = ((/* unused pure expression or super */ null && (synchronization)));
+;// ./modules/block-editor/js/icons/library/translation.js
+/**
+ * Translation icon - translation Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const translation_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const translation = translation_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M11 7H9.49c-.63 0-1.25.3-1.59.7L7 5H4.13l-2.39 7h1.69l.74-2H7v4H2c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h7c1.1 0 2 .9 2 2v2zM6.51 9H4.49l1-2.93zM10 8h7c1.1 0 2 .9 2 2v7c0 1.1-.9 2-2 2h-7c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2zm7.25 5v-1.08h-3.17V9.75h-1.16v2.17H9.75V13h1.28c.11.85.56 1.85 1.28 2.62-.87.36-1.89.62-2.31.62-.01.02.22.97.2 1.46.84 0 2.21-.5 3.28-1.15 1.09.65 2.48 1.15 3.34 1.15-.02-.49.2-1.44.2-1.46-.43 0-1.49-.27-2.38-.63.7-.77 1.14-1.77 1.25-2.61h1.36zm-3.81 1.93c-.5-.46-.85-1.13-1.01-1.93h2.09c-.17.8-.51 1.47-1 1.93l-.04.03s-.03-.02-.04-.03z"
+ })
+}) : 'translation';
+/* harmony default export */ const library_translation = (translation);
+;// ./modules/block-editor/js/icons/library/trash.js
+/**
+ * Trash icon - trash Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const trash_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const trash = trash_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M12 4h3c.6 0 1 .4 1 1v1H3V5c0-.6.5-1 1-1h3c.2-1.1 1.3-2 2.5-2s2.3.9 2.5 2zM8 4h3c-.2-.6-.9-1-1.5-1S8.2 3.4 8 4zM4 7h11l-.9 10.1c0 .5-.5.9-1 .9H5.9c-.5 0-.9-.4-1-.9L4 7z"
+ })
+}) : 'trash';
+/* harmony default export */ const library_trash = ((/* unused pure expression or super */ null && (trash)));
+;// ./modules/block-editor/js/icons/library/star.js
+/**
+ * Star icon - star-filled Dashicon.
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+const star_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const star = star_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ width: "20",
+ height: "20",
+ xmlns: "http://www.w3.org/2000/svg",
+ viewBox: "0 0 20 20",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "m10 1 3 6 6 .75-4.12 4.62L16 19l-6-3-6 3 1.13-6.63L1 7.75 7 7z"
+ })
+}) : 'star-filled';
+/* harmony default export */ const library_star = ((/* unused pure expression or super */ null && (star)));
+;// ./modules/block-editor/js/icons/library/submenu.js
+/**
+ * Submenu icon
+ *
+ * @package Polylang-Pro
+ */
+
+/**
+ * WordPress dependencies
+ */
+
+/**
+ * External dependencies
+ */
+
+
+const submenu_isPrimitivesComponents = !(0,external_lodash_.isUndefined)(wp.primitives);
+const SubmenuIcon = () => submenu_isPrimitivesComponents ? /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.SVG, {
+ xmlns: "http://www.w3.org/2000/svg",
+ width: "12",
+ height: "12",
+ viewBox: "0 0 12 12",
+ fill: "none",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)(external_this_wp_primitives_.Path, {
+ d: "M1.50002 4L6.00002 8L10.5 4",
+ strokeWidth: "1.5"
+ })
+}) : 'submenu';
+/* harmony default export */ const submenu = (SubmenuIcon);
+;// ./modules/block-editor/js/icons/index.js
+/**
+ * Icons library
+ *
+ * @package Polylang-Pro
+ */
+
+
+
+
+
+
+
+
+
+;// ./modules/block-editor/js/components/language-flag.js
+/**
+ * @package Polylang-Pro
+ */
+
+/**
+ * External dependencies.
+ */
+
+
+/**
+ * Internal dependencies.
+ */
+
+
+/**
+ * Display a flag icon for a given language.
+ *
+ * @since 3.1
+ * @since 3.2 Now its own component.
+ *
+ * @param {Object} A language object.
+ *
+ * @return {Object}
+ */
+
+function LanguageFlag({
+ language
+}) {
+ return !(0,external_lodash_.isNil)(language) ? !(0,external_lodash_.isEmpty)(language.flag_url) ? /*#__PURE__*/(0,jsx_runtime.jsx)("span", {
+ className: "pll-select-flag",
+ children: /*#__PURE__*/(0,jsx_runtime.jsx)("img", {
+ src: language.flag_url,
+ alt: language.name,
+ title: language.name,
+ className: "flag"
+ })
+ }) : /*#__PURE__*/(0,jsx_runtime.jsxs)("abbr", {
+ children: [language.slug, /*#__PURE__*/(0,jsx_runtime.jsx)("span", {
+ className: "screen-reader-text",
+ children: language.name
+ })]
+ }) : /*#__PURE__*/(0,jsx_runtime.jsx)("span", {
+ className: "pll-translation-icon",
+ children: library_translation
+ });
+}
+/* harmony default export */ const language_flag = (LanguageFlag);
+;// ./modules/block-editor/js/components/language-dropdown.js
+/**
+ * @package Polylang-Pro
+ */
+
+// External dependencies
+
+
+/**
+ * Displays a dropdown to select a language.
+ *
+ * @since 3.1
+ *
+ * @param {Function} handleChange Callback to be executed when language changes.
+ * @param {mixed} children Child components to be used as select options.
+ * @param {Object} selectedLanguage An object representing a Polylang Language. Default to null.
+ * @param {string} Default value to be selected if the selected language is not provided. Default to an empty string.
+ *
+ * @return {Object} A dropdown selector for languages.
+ */
+
+function LanguageDropdown({
+ handleChange,
+ children,
+ selectedLanguage = null,
+ defaultValue = ''
+}) {
+ const selectedLanguageSlug = selectedLanguage?.slug ? selectedLanguage.slug : defaultValue;
+ return /*#__PURE__*/(0,jsx_runtime.jsxs)("div", {
+ id: "select-post-language",
+ children: [/*#__PURE__*/(0,jsx_runtime.jsx)(language_flag, {
+ language: selectedLanguage
+ }), children && /*#__PURE__*/(0,jsx_runtime.jsx)("select", {
+ value: selectedLanguageSlug,
+ onChange: event => handleChange(event),
+ id: "pll_post_lang_choice",
+ name: "pll_post_lang_choice",
+ className: "post_lang_choice",
+ children: children
+ })]
+ });
+}
+
+/**
+ * Map languages objects as options for a
+ %s',
+ esc_url( wp_nonce_url( add_query_arg( 'pll-hide-notice', $name ), $name, '_pll_notice_nonce' ) ),
+ /* translators: accessibility text */
+ esc_html__( 'Dismiss this notice.', 'polylang' )
+ );
+ }
+
+ /**
+ * Displays a notice if WooCommerce is activated without Polylang for WooCommerce
+ *
+ * @since 2.3.9
+ *
+ * @return void
+ */
+ private function pllwc_notice() {
+ ?>
+
+ dismiss_button( 'pllwc' ); ?>
+
+ ',
+ ''
+ );
+ ?>
+
+
+
+
+ dismiss_button( 'review' ); ?>
+
+ ',
+ ''
+ );
+ ?>
+
+
+ links = &$polylang->links;
+
+ // Add post state for translations of the front page and posts page
+ add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 );
+
+ // Refreshes the language cache when a static front page or page for for posts has been translated.
+ add_action( 'pll_save_post', array( $this, 'pll_save_post' ), 10, 3 );
+
+ // Prevents WP resetting the option
+ add_filter( 'pre_update_option_show_on_front', array( $this, 'update_show_on_front' ), 10, 2 );
+
+ add_action( 'admin_notices', array( $this, 'notice_must_translate' ) );
+ }
+
+ /**
+ * Adds post state for translations of the front page and posts page.
+ *
+ * @since 1.8
+ *
+ * @param string[] $post_states An array of post display states.
+ * @param WP_Post $post The current post object.
+ * @return string[]
+ */
+ public function display_post_states( $post_states, $post ) {
+ if ( in_array( $post->ID, $this->model->get_languages_list( array( 'fields' => 'page_on_front' ) ) ) ) {
+ $post_states['page_on_front'] = __( 'Front Page', 'polylang' );
+ }
+
+ if ( in_array( $post->ID, $this->model->get_languages_list( array( 'fields' => 'page_for_posts' ) ) ) ) {
+ $post_states['page_for_posts'] = __( 'Posts Page', 'polylang' );
+ }
+
+ return $post_states;
+ }
+
+ /**
+ * Refreshes the language cache when a static front page or page for for posts has been translated.
+ *
+ * @since 1.8
+ *
+ * @param int $post_id Not used.
+ * @param WP_Post $post Not used.
+ * @param int[] $translations Translations of the post being saved.
+ * @return void
+ */
+ public function pll_save_post( $post_id, $post, $translations ) {
+ if ( in_array( $this->page_on_front, $translations ) || in_array( $this->page_for_posts, $translations ) ) {
+ $this->model->clean_languages_cache();
+ }
+ }
+
+ /**
+ * Prevents WP resetting the option if the admin language filter is active for a language with no pages.
+ *
+ * @since 1.9.3
+ *
+ * @param string $value The new, unserialized option value.
+ * @param string $old_value The old option value.
+ * @return string
+ */
+ public function update_show_on_front( $value, $old_value ) {
+ if ( ! empty( $GLOBALS['pagenow'] ) && 'options-reading.php' === $GLOBALS['pagenow'] && 'posts' === $value && ! get_pages() && get_pages( array( 'lang' => '' ) ) ) {
+ $value = $old_value;
+ }
+ return $value;
+ }
+
+ /**
+ * Add a notice to translate the static front page if it is not translated in all languages
+ * This is especially useful after a new language is created.
+ * The notice is not dismissible and displayed on the Languages pages and the list of pages.
+ *
+ * @since 2.6
+ *
+ * @return void
+ */
+ public function notice_must_translate() {
+ $screen = get_current_screen();
+
+ if ( ! empty( $screen ) && ( 'toplevel_page_mlang' === $screen->id || 'edit-page' === $screen->id ) ) {
+ $message = $this->get_must_translate_message();
+
+ if ( ! empty( $message ) ) {
+ printf(
+ '
%s
',
+ $message // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
+ );
+ }
+ }
+ }
+
+ /**
+ * Returns the message asking to translate the static front page in all languages.
+ *
+ * @since 2.8
+ *
+ * @return string
+ */
+ public function get_must_translate_message() {
+ $message = '';
+
+ if ( $this->page_on_front ) {
+ $untranslated = array();
+
+ foreach ( $this->model->get_languages_list() as $language ) {
+ if ( ! $this->model->post->get( $this->page_on_front, $language ) ) {
+ $untranslated[] = sprintf(
+ '%s',
+ esc_url( $this->links->get_new_post_translation_link( $this->page_on_front, $language ) ),
+ esc_html( $language->name )
+ );
+ }
+ }
+
+ if ( ! empty( $untranslated ) ) {
+ $message = sprintf(
+ /* translators: %s is a comma separated list of native language names */
+ esc_html__( 'You must translate your static front page in %s.', 'polylang' ),
+ implode( ', ', $untranslated ) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
+ );
+ }
+ }
+
+ return $message;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/admin-strings.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/admin-strings.php
new file mode 100644
index 000000000..bd0b01458
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/admin-strings.php
@@ -0,0 +1,136 @@
+ __( 'Widget title', 'polylang' ),
+ 'widget_text' => __( 'Widget text', 'polylang' ),
+ );
+
+ // Widgets titles
+ global $wp_registered_widgets;
+ $sidebars = wp_get_sidebars_widgets();
+ foreach ( $sidebars as $sidebar => $widgets ) {
+ if ( 'wp_inactive_widgets' == $sidebar || empty( $widgets ) ) {
+ continue;
+ }
+
+ foreach ( $widgets as $widget ) {
+ // Nothing can be done if the widget is created using pre WP2.8 API :(
+ // There is no object, so we can't access it to get the widget options
+ if ( ! isset( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! is_object( $wp_registered_widgets[ $widget ]['callback'][0] ) || ! method_exists( $wp_registered_widgets[ $widget ]['callback'][0], 'get_settings' ) ) {
+ continue;
+ }
+
+ $widget_settings = $wp_registered_widgets[ $widget ]['callback'][0]->get_settings();
+ $number = $wp_registered_widgets[ $widget ]['params'][0]['number'];
+
+ // Don't enable widget translation if the widget is visible in only one language or if there is no title
+ if ( empty( $widget_settings[ $number ]['pll_lang'] ) ) {
+ if ( isset( $widget_settings[ $number ]['title'] ) && $title = $widget_settings[ $number ]['title'] ) {
+ self::register_string( self::$default_strings['widget_title'], $title, 'Widget' );
+ }
+
+ if ( isset( $widget_settings[ $number ]['text'] ) && $text = $widget_settings[ $number ]['text'] ) {
+ self::register_string( self::$default_strings['widget_text'], $text, 'Widget', true );
+ }
+ }
+ }
+ }
+
+ /**
+ * Filter the list of strings registered for translation
+ * Mainly for use by our PLL_WPML_Compat class
+ *
+ * @since 1.0.2
+ *
+ * @param array $strings list of strings
+ */
+ self::$strings = apply_filters( 'pll_get_strings', self::$strings );
+ return self::$strings;
+ }
+
+ /**
+ * Performs the sanitization ( before saving in DB ) of default strings translations
+ *
+ * @since 1.6
+ *
+ * @param string $translation translation to sanitize
+ * @param string $name unique name for the string
+ * @return string
+ */
+ public static function sanitize_string_translation( $translation, $name ) {
+ if ( $name == self::$default_strings['widget_title'] ) {
+ $translation = sanitize_text_field( $translation );
+ }
+
+ if ( $name == self::$default_strings['widget_text'] && ! current_user_can( 'unfiltered_html' ) ) {
+ $translation = wp_kses_post( $translation );
+ }
+
+ return $translation;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/admin.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/admin.php
new file mode 100644
index 000000000..4b95c18d2
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/admin.php
@@ -0,0 +1,180 @@
+model->has_languages() ) {
+ add_action( 'wp_loaded', array( $this, 'add_filters' ), 5 );
+ }
+ }
+
+ /**
+ * Adds a 'settings' link for our plugin in the plugins list table.
+ *
+ * @since 0.1
+ *
+ * @param string[] $links List of links associated to the plugin.
+ * @return string[] Modified list of links.
+ */
+ public function plugin_action_links( $links ) {
+ array_unshift( $links, '' . __( 'Settings', 'polylang' ) . '' );
+ return $links;
+ }
+
+ /**
+ * Adds the upgrade notice in plugins table
+ *
+ * @since 1.1.6
+ *
+ * @param array $plugin_data Not used
+ * @param object $r Plugin update data
+ * @return void
+ */
+ public function plugin_update_message( $plugin_data, $r ) {
+ if ( ! empty( $r->upgrade_notice ) ) {
+ printf( '
%s
', esc_html( $r->upgrade_notice ) );
+ }
+ }
+
+ /**
+ * Setup filters for admin pages
+ *
+ * @since 1.2
+ * @since 2.7 instantiate a PLL_Bulk_Translate instance.
+ * @return void
+ */
+ public function add_filters() {
+ $this->filters_sanitization = new PLL_Filters_Sanitization( $this->get_locale_for_sanitization() );
+ $this->filters_widgets_options = new PLL_Admin_Filters_Widgets_Options( $this );
+
+ // All these are separated just for convenience and maintainability
+ $classes = array( 'Filters', 'Filters_Columns', 'Filters_Post', 'Filters_Term', 'Nav_Menu', 'Classic_Editor', 'Block_Editor' );
+
+ // Don't load media filters if option is disabled or if user has no right
+ if ( $this->options['media_support'] && ( $obj = get_post_type_object( 'attachment' ) ) && ( current_user_can( $obj->cap->edit_posts ) || current_user_can( $obj->cap->create_posts ) ) ) {
+ $classes[] = 'Filters_Media';
+ }
+
+ foreach ( $classes as $class ) {
+ $obj = strtolower( $class );
+
+ /**
+ * Filter the class to instantiate when loading admin filters
+ *
+ * @since 1.5
+ *
+ * @param string $class class name
+ */
+ $class = apply_filters( 'pll_' . $obj, 'PLL_Admin_' . $class );
+ $this->$obj = new $class( $this );
+ }
+ }
+
+ /**
+ * Retrieve the locale according to the current language instead of the language
+ * of the admin interface.
+ *
+ * @since 2.0
+ *
+ * @return string
+ */
+ public function get_locale_for_sanitization() {
+ $locale = get_locale();
+
+ if ( isset( $_POST['post_lang_choice'] ) && $lang = $this->model->get_language( sanitize_key( $_POST['post_lang_choice'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $locale = $lang->locale;
+ } elseif ( isset( $_POST['term_lang_choice'] ) && $lang = $this->model->get_language( sanitize_key( $_POST['term_lang_choice'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $locale = $lang->locale;
+ } elseif ( isset( $_POST['inline_lang_choice'] ) && $lang = $this->model->get_language( sanitize_key( $_POST['inline_lang_choice'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $locale = $lang->locale;
+ } elseif ( ! empty( $this->curlang ) ) {
+ $locale = $this->curlang->locale;
+ }
+
+ return $locale;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/view-translations-media.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/view-translations-media.php
new file mode 100644
index 000000000..d0a14ba99
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/admin/view-translations-media.php
@@ -0,0 +1,43 @@
+
+
+ 14.0
+
+= 2.9 (2020-12-07) =
+
+* Add compatibility with WordPress 5.6
+* Pro: Add locale fallback used when the theme or plugins translations are not available
+* Pro: Fix SSO and browser preferred language redirect when using multiple domains
+* Pro: Fix post slugs for German and Danish in the REST API
+* Pro: Fix a fatal error in ACF integration when saving url modifications with multiple domains
+* Pro: Fix a deprecated notice fired by ACF since the version 5.9.2
+* Pro: Fix ACF relationship fields not reloaded when changing the language in the classic editor
+* Update plugin updater to version 1.8
+* Add Lower Sorbian to the list of predefined language
+* Options are now translated on backend when using the admin language filter
+* Keep previous translations when modifying an option value
+* Add navigation markup to the language switcher widget
+* Fix canonical redirect for taxonomy terms
+* Fix a fatal error when deleting a post with a translation group corrupted in the database
+* Fix a fatal error when switching to plain permalinks and using multiple domains
+* Fix a conflict with WP Sweep which could corrupt languages
+* Fix title displayed instead of meta description with Yoast SEO > 14.0
+* Fix PHP Notice: Undefined index: wp_the_query in /frontend/choose-lang-content.php on line 92
+
+= 2.8.4 (2020-11-03) =
+
+* Pro: Remove useless bulk translate action for ACF fields groups
+* Pro: Fix the translation of the CPTUI labels when the language is set from the content
+* Fix sitemaps redirected to the default language since WP 5.5.1
+* Fix object cache not flushed for sticky posts #601
+* Fix blog page broken when trashing a page and the blog page is not translated in all languages
+* Fix custom flags ignored in WPML compatibility mode
+* Fix breadcrumb for untranslated post types in Yoast SEO
+
+= 2.8.3 (2020-10-13) =
+
+* Honor install_languages capability to download language packs
+* Pro: Fix integrations not loaded (with The Events Calendar, CPTUI, Content blocks)
+* Pro: Fix fatal error with ACF if a flexible content includes a repeater and a relationship
+* Pro: Fix terms sharing their slug impossible to update without changing the slug
+* When available, use wpcom_vip_get_page_by_path() instead of get_page_by_path()
+* Fix queries filtered when editing a post that was declared untranslatable after it got a language
+* Fix issues with Yoast SEO 14.0+ (breadcrumbs, canonical, title and description)
+
+= 2.8.2 (2020-09-08) =
+
+* Pro: Fix posts sharing the same slug displayed on the same page
+* Fix: Don't use a javascript localized string removed in WP 5.5 #568
+* Fix fatal error in site health when no language is defined #563
+* Fix various issues with Yoast SEO 14.x #65, #503, #505
+* Fix fatal error with MU Domain Mapping when saving domains in Polylang settings #569
+
+= 2.8.1 (2020-08-25) =
+
+* Pro: Fix fatal error with WP 4.9
+* Fix pll_the_languages() with 'raw' option returning html flag instead of flag url #558
+* Fix compatibility with Duplicate Posts not correctly loaded #557
+* Fix custom flag size in admin bar language switcher #559
+* Fix tag clouds mixed in the classic editor #561
+
+= 2.8 (2020-08-17) =
+
+* Pro: Add a language switcher block
+* Pro: Add compatibility with block image edition introduced in WP 5.5
+* Pro: Fix our private taxonomies being displayed in the ACF field group rules.
+* Pro: Fix incorrect flags loaded from the block editor
+* Pro: Fix SSO causing a wrong redirect when using subdomains (introduced in 2.7.4)
+* Pro: Fix a performance issue on the plugins list
+* Pro: Fix option to automatically duplicate media in all languages when uploading a new file not honored in block image
+* Use composer for autoload and Polylang Pro dependency on Polylang
+* Display a flag for each post in the posts list tables (same for terms). #515
+* Add test for the homepage translations to Site Health
+* Add debug information to Site Health
+* Add compatibility with the sitemaps introduced in WP 5.5 #451
+* Always filter WP_Query by the current language
+* Support wildcards in "admin-texts" parent keys in wpml-config.xml
+* Fix sticky posts showed for all languages when the admin language filter is active #469
+* Fix a performance issue on the pages list
+* Fix dependency to jQuery Migrate removed from WP 5.5 #539
+* Fix: output secure cookie when using a cache plugin and ssl #542
+* Fix the possibility to create 2 terms with the same name in the same language, without specifying the second slug.
+* Fix sticky posts appearing 2 times in WP 5.5
+
+= 2.7.4 (2020-06-29) =
+
+* Pro: Allow using our /untranslated-posts REST endpoint for non-public post types
+* Pro: Fix broken display in the block editor sidebar when a language has no flag
+* Pro: Fix SSO breaking the preview on secondary domains
+* Pro: Fix ACF translation option not working for term custom fields
+* Pro: Fix a styling issue in the fields group list table in ACF 5.9
+* Add Spanish from Puerto Rico to the predefined list of languages
+
+= 2.7.3 (2020-05-26) =
+
+* Security: Slash metas
+* Pro: Fix categories not savedafter the language has been switched in the block editor
+* Pro: Fix ACF fields stored as integers instead of strings
+* Pro: Fix ACF untranslated posts or terms being copied when creating a new translation
+* Pro: Fix PHP notice with ACF when a repeater or group is included in a flexible content
+* Pro: Fix "DevTools failed to load SourceMap" warning in browser console
+* Update plugin updater to 1.7.1
+* Honor the filter "pll_the_language_link" when the language switcher displays a dropdown #506
+* Fix "Something went wrong" message when quick editing untranslated post types #508
+* Fix wpseo_opengraph deprecated warning #509
+
+= 2.7.2 (2020-04-27) =
+
+* Pro: Re-allow to modify the capability for strings translations
+* Pro: Fix redirect for posts having the same slug as a media
+* Pro: Fix PHP notice with ACF flexible content
+* Pro: Fix a fatal error with InfiniteWP
+* Update plugin updater to 1.7
+* Fix font in setup wizard
+
+= 2.7.1 (2020-04-09) =
+
+* Pro: Fix untranslated post types filtered by the parameter in the REST API #493
+* Fix fatal error when the function idn_to_ascii is not available
+* Fix PHP warning warning when a 3rd party plugin declares options not stored in DB in wpml-config.xml #492
+* Fix fatal error when a 3rd party plugin declares options stored as objects in wpml-config.xml #494
+
+= 2.7 (2020-04-06) =
+
+* Minimum WordPress version is now 4.9
+* Pro: Strings translations can now be exported and imported (in PO format)
+* Pro: Allow to decide individually which ACF fields to copy or synchronize
+* Pro: Add action pll_inactive_language_requested
+* Pro; Fix fatal error in The Events Calendar compatibility when no language is defined yet
+* Pro: Fix bulk translate when a post has no language
+* Pro: Fix reusable block saved without language
+* Pro: Fix post requested by slug not filtered in REST API, when the slug is shared
+* Add a setup wizard
+* Add Swahili, Upper Sorbian, Sindhi and Spanish from Uruguay to the list of predefined languages
+* Add flags in the predefined list of languages
+* Allow to hide the metaboxes from the screen options
+* The deletion of the plugin's data at uninstall is now controlled by a PHP constant instead of an option #456
+* Add parent in ajax response when selecting a term in autocomplete field #328
+* Add Vary: Accept-Language http header in home page redirect. Props @chesio #452
+* Improve performance to register/unregister WPML strings
+* Add support for the action wpml_switch_language
+* Add post_status to the list of accepted args of pll_count_posts()
+* Apply the filter pll_preferred_language in wp-login.php
+* Use filtered wrappers to create meta when creating media translations #231
+* Allow to translate the Twenty Seventeen header video Youtube url #460
+* Notices are now dismissed per site instead of per user #478
+* Fix terms not visible in the quick edit when only one language is defined and the admin language filter is active
+* Fix post state not displayed for translations of the privacy policy page #395
+* Fix wildcards not correctly interpreted in wpml-config.xml
+* Fix product categories with special characters duplicated when importing WooCommerce products #474
+
+= 2.6.10 (2020-02-19) =
+
+* Pro: Fix sticky posts not filtered in REST API (introduced in 2.6.9)
+* Fix wrong language detected if a child page uses the slug of another language
+* Fix a PHP notice with PHP 7.4. #438
+* Fix lang-item-first class in language switcher when the current language is hidden. #445
+* Fix partially a conflict with Fusion Builder (the other part of the conflict being in Fusion Builder).
+
+= 2.6.9 (2020-01-15) =
+
+* Pro: Use 'parse_query' rather than 'rest_{$type}_query' to filter REST requests.
+* Pro: Filter the comments REST endpoint.
+* Pro: Fix duplication of terms without language.
+* Pro: Fix fatal error when Admin Columns is activated and no language is defined yet.
+* Fix shortlink when using one subdomain or domain per language
+
+= 2.6.8 (2019-12-11) =
+
+* Pro: Fix conflict with JetThemesCore from Crocoblock
+* Fix: better detection of REST requests when using plain permalinks
+* Fix usage of deprecated action wpmu_new_blog in WP 5.1+
+* Fix PHP notices with PHP 7.4
+
+= 2.6.7 (2019-11-14) =
+
+* Require PHP 5.6
+* Fix PHP warning in WP 5.3
+
+= 2.6.6 (2019-11-12) =
+
+* Pro: Fix wrong ajax url when using one domain per language
+* Pro: Fix conflict with user switching plugin when using multiple domains
+* Pro: Fix latest posts block in WP 5.3
+* Fix database error when attempting to sync an untranslated page parent
+* Fix a conflict with the theme Neptune by Osetin
+
+= 2.6.5 (2019-10-09) =
+
+* Pro: Require ACF 5.7.11+ to activate the compatibility to avoid fatal errors with older versions
+* Pro: Avoid translating empty front slug (could cause a wrong redirect to /wp-admin)
+* Pro: Fix filter wp_unique_term_slug not always correctly applied.
+* Pro: Fix a conflict with Divi causing post synchronization buttons to be displayed multiple times
+* Avoid notice in WP CLI context
+
+= 2.6.4 (2019-08-27) =
+
+* Pro: Fix a conflict preventing meta synchronization when ACF is active
+* Pro: Fix post metas not correctly copied when translating a Beaver Builder page
+* Pro: Fix a fatal error when posts made with Elementor are synchronized
+* Pro: Fix Prewiew button not working correctly when using one domain per language
+* Pro: Fix post synchronization not available for WP CRON and WP CLI
+* Fix future posts not available in the autocomplete input field of the languages metabox
+* Fix translations files not loaded on REST requests
+* Fix deleted term parent not synchronized
+
+= 2.6.3 (2019-08-06) =
+
+* Pro: Fix fatal error when updating an ACF field from frontend
+* Pro: Add action 'pll_post_synchronized'
+* Allow to get the current or default language object using the API. Props Jory Hogeveen. #359
+* Fix empty span in languages switcher widget when showing only flags
+* Fix wpml_register_single_string when updating the original string
+
+= 2.6.2 (2019-07-16) =
+
+* Pro: Fix slow admin in case the translations update server can't be reached
+* Pro: Fix value not correctly translated for ACF clone fields in repeater
+* Fix strings translations mixed when registered via the WPML compatibility. #381
+
+= 2.6.1 (2019-07-03) =
+
+* Pro: Fix Yoast SEO sitemap for inactive languages when using subdomains or multiple domains
+* Fix fatal error in combination with Yoast SEO and Social Warfare
+* Fix post type archive url in Yoast SEO sitemap
+
+= 2.6 (2019-06-26) =
+
+* Pro: Remove all languages files. All translations are now maintained on TranslationsPress
+* Pro: Move the languages metabox to a block editor plugin
+* Pro: Better management of user capabilities when synchronizing posts
+* Pro: Separate REST requests from the frontend
+* Pro: Copy the post slug when duplicating a post
+* Pro: Duplicate ACF term metas when terms are automatically duplicated when creating a new post translation
+* Pro: Fix hierarchy lost when duplicating terms
+* Pro: Fix page shared slugs with special characters
+* Pro: Fix synchronized posts sharing their slug when the language is set from the content
+* Pro: Fix PHP warning with ACF Pro 5.8.1
+* Pro: Fix ACF clone fields not translated in repeaters
+* Better management of user capabilities when synchronizing taxonomies terms and custom fields
+* Extend string translations search to translated strings #207
+* Update plugin updater to 1.6.18
+* Honor the filter `pll_flag` when performing the flag validation when creating a new language
+* Modify the title and the label for the language switcher menu items #307
+* Add support for international domain names
+* Add a title to the link icon used to add a translation #325
+* Add a notice when a static front page is not translated in a language
+* Add support for custom term fields in wpml-config.xml
+* Add filter `pll_admin_languages_filter` for the list of items the admin bar language filter
+* Add compatibility with WP Offload Media Lite. Props Daniel Berkman
+* Yoast SEO: Add post type archive url in all languages to the sitemap
+* Fix www. not redirected to not www. for the home page in multiple domains #311
+* Fix cropped images not being synchronized
+* Fix auto added page to menus when the page is created with the block editor
+* Fix embed of translated static front page #318
+* Fix a possible infinite redirect if the static front page is not translated
+* Fix incorrect behavior of action 'wpml_register_single_string' when updating the string source
+* Fix fatal error with Jetpack when no languages has been defined yet #330
+* Fix a conflict with Laravel Valet. Props @chesio. #250
+* Fix a conflict with Thesis.
+* Fix a conflict with Pods in the block editor. Props Jory Hogeveen. #369
+* Fix fatal error with Twenty Fourteen introduced in version 2.5.4. #374
+
+= 2.5.4 (2019-05-28) =
+
+* Add Kannada to the predefined languages list
+* Yoast SEO: Fix primary product cat not copied or synchronized
+* WPMU Domain Mapping: Fix incorrect domain used for the theme
+* Fix style-rtl.css not loaded when the language is set from the content #356
+* Fix Jetpack featured pages not working. Props Anis Ladram. #357
+* Fix Call to undefined function wp_generate_attachment_metadata()
+
+= 2.5.3 (2019-04-16) =
+
+* Add de_AT and pt_AO to the predefined languages list
+* Pro: Add filter pll_translate_blocks
+* Pro: fix PHP notice when the queried post type has been modified to an array
+* Pro: fix PHP warning when combined with The Event Calendar and Page builder by SiteOrigin
+
+= 2.5.2 (2019-02-12) =
+
+* Pro: Fix translated slugs not accepting forward slashes
+* Pro: Fix fatal error with ACF Pro 5.7.11
+* Fix parent categories incorrectly synchronized #327
+
+= 2.5.1 (2019-01-16) =
+
+* Security: Fix categories and media duplication not protected from CSRF
+* Pro: Allow to update the plugin with WP CLI
+* Pro: Fix search in the button block not filtered in the correct language (needs WP 5.1)
+* Add Saraiki to the predefined languages list
+* Fix a conflict causing a blank page with Divi
+
+= 2.5 (2018-12-06) =
+
+* Add compatibility with WP 5.0
+* Fix custom flags when the WP content folder is not in the WP install folder
+* Fix PHP notice if a language has no flag
+
+= 2.4.1 (2018-11-27) =
+
+* Pro: Add compatibility with REST API changes made in WP 5.0
+* Pro: Fix sticky posts in the REST API
+* Pro: Fix overwritten custom post slug when the post is updated with the REST API
+* Pro: Fix bulk translate for media
+* Fix a conflict with Custom sidebars and Content aware sidebars
+* Fix a conflict with the theme Pokemania
+* Fix PHP notices when using the function 'icl_link_to_element' for terms
+* Fix title slugs for posts written in German
+
+= 2.4 (2018-11-12) =
+
+* Minimum WordPress version is now 4.7
+* Pro: Add the possibility to bulk duplicate or bulk synchronize posts.
+* Pro: Add compatibility with Admin Columns
+* Pro: Add synchronized posts to the REST API
+* Pro: Fix variations messed when changing WooCommerce attributes slugs
+* Pro: Fix incorrect language for ajax requests made on front by The Events Calendar
+* Pro: Fix term not duplicated correctly when the language is set from the content
+* Refactor the core to activate on front and for the REST api actions that were previously available only in the backend (language checks, synchronizations...).
+* Add flags to widgets displayed in only one language (Props Jory Hogeveen) #257
+* Honor the filter 'pll_the_language_args' for all options in menus #237
+* Add better filters for default flags and custom flags
+* Custom flags can now be stored in the polylang directory in the theme
+* Custom flags can now use SVG
+* Add compatibility with Jetpack featured content module
+* Fix Twenty Fourteen featured posts possibly not filtered per language
+* Fix home url not working with WordPress MU Domain mapping
+* Fix Assigning a parent category breaking the hierarchy of translated category
+* Fix: Accept 0,1 and 1.0 as q factors in browser preferred language detection (Props Dominic Rubas)
+* Fix performance issue when using hundreds of widgets
+* Fix translations possibly wrong if the post language is changed without saving the post after
+
+= 2.3.11 (2018-10-03) =
+
+* Pro: Add action 'pll_created_sync_post'
+* Pro: Fix language and translations not included for tags in the REST API
+* Fix Assigning a parent category breaking the hierarchy of translated category
+
+= 2.3.10 (2018-08-16) =
+
+* Fix Lingotek notice not dismissable
+* Fix fatal error with the widget calendar
+
+= 2.3.9 (2018-08-14) =
+
+* Add a notice to inform about Polylang for WooCommerce
+* Deprecate PLL_Pointer
+* Fix bulk editing pages with no language breaking hierarchy #281
+* Fix an edge case where rewrite rules could be messed on a multisite
+* MU Domain Mapping: fix secondary domain redirected to primary domain
+
+= 2.3.8 (2018-07-16) =
+
+* Pro: Duplicate term meta when duplicating a post creates new terms
+* Pro: Add compatibility with ACF Pro when it's bundled with the theme
+* Pro: Fix a fatal error when duplicating posts
+* Set cookie during the home redirect
+* Accept a port in the url to detect the site home
+* Add filter 'pll_is_cache_active' to allow to load the cache compatibility #270 #274
+* Fix potential fatal error when a 3rd party misuses the 'wpml_active_languages' filter #268
+* Fix Uncaught TypeError: s.split is not a function. Props Wouter Van Vliet #262
+* Fix text alignment for RTL scripts in Lingotek panel #247
+* Fix html language attribute filter on admin
+* Fix cookie expiration time when set in js. Props Jens Nachtigall #271
+* Fix fatal error when a 3rd party misuses the WP_Query tax_query param. Props JanneAalto #252
+* Fix an edge case which could mess home pages on a multisite
+
+
+= 2.3.7 (2018-06-07) =
+
+* Pro: The Events Calendar: Fix untranslated events shown in all languages
+* Avoid displaying edit links of translations of the privacy policy page to non-admin
+* Fix draft created when creating a new page on multisite
+* Do not prevent using the cache for home when using WP Rocket 3.0.5 or later #236
+* Fix language filter applied to wrong queries on admin side
+
+= 2.3.6 (2018-05-17) =
+
+* Pro: Fix post type archive slug not translated in ACF page link fields
+* WP 4.9.6: Translate the privacy policy page
+* WP 4.9.6: Add the translated user descriptions to exported personal data
+* Update Plugin updater to version 1.6.16
+* Fix conflict with the plugin View Admin As. Props Jory Hogeveen. #253
+
+= 2.3.5 (2018-05-08) =
+
+* Pro: Fix translated CPT slugs when one CPT name is a substring of another one. Props Steve Reimer.
+* Pro: Fix canonical redirection for post types archives when the CPT slug is translated
+* Pro: Fix ACF private key uselessly synchronized when the public custom field is not synchronized
+* Add filter 'pll_filter_query_excluded_query_vars'
+* Redirect www. to non www. when using multiple domains
+* Fix Yoast SEO category sitemap not filtered by language when using multiple domains
+* Fix PLL_COOKIE === false not honored when using a cache plugin. #248
+* Fix empty predefined languages list
+
+= 2.3.4 (2018-03-27) =
+
+* Pro: Fix conflict with Pods related to translated slugs for custom post types
+* Add Friulian to the predefined languages list
+* Fix conflict (javascript error) with Gütenberg #225
+* Fix conflict on ajax requests introduced by WooCoommerce 3.3.4
+* Fix queries by 'category_name' not auto translated #238
+
+= 2.3.3 (2018-03-15) =
+
+* Pro: Fix tax query using a term sharing slugs (fix a conflict with Fusion Builder)
+* Restore Polylang (free) on REST requests, while disabling the language filter as in v2.3
+* Rework auto translated query with taxonomy in different language #223
+* Synchronize Yoast SEO primary category (needs Yoast SEO 7.0+)
+* Fix PHP warning introduced by Yoast SEO 7.0 #229
+* Fix tax query when using the relation 'OR'
+* Fix a conflict with the combination of Barrel + WP Bakery Page Builder
+* Fix broken redirect with MU domain mapping #226
+* Fix site title not translated in password change email
+
+= 2.3.2 (2018-03-05) =
+
+* Pro: Fix REST requests not filtered by the requested language (introduced in 2.3).
+* Pro: Fix error 404 on single posts if posts are untranslatable
+* Deactivate Polylang (free) on REST requests by default.
+* Fix translated terms unassigned from posts when deleting a term
+* Fix auto translated query with taxonomy in different language returning empty results since WP 4.9 #223
+* Fix conflict with a homepage option of the theme Extra
+* Fix warning when filtering get_pages()
+
+= 2.3.1 (2018-02-15) =
+
+* Pro: Fix GET REST request with slug parameter deleting the post slug
+* Fix http request with a custom query var being redirected to the home page #216
+
+= 2.3 (2018-01-30) =
+
+* Pro: Duplicating a post now duplicates untranslated terms and the featured image (if media are translatable)
+* Pro: Add filter 'pll_sync_post_fields'
+* Pro: Translate ACF Pro clone fields when creating a new field group translation
+* Pro: Allow to share slugs when creating a post or term with the REST API
+* Pro: Load asynchronously the script added on front for multiple domains and subdomains
+* Pro: Fix 'lang' parameter not interpreted when the query includes 'name'
+* Refactor the synchronization of metas for better synchronization and performance improvement
+* Refactor the synchronization of taxonomy terms for performance improvement
+* Refactor language and translations saving for performance improvement
+* Refactor the synchronization of sticky posts
+* Remove all languages files. All translations are now maintained on https://translate.wordpress.org/projects/wp-plugins/polylang #199
+* Refactor the list of languages to merge predefined languages, Facebook locales and fixes for W3C locales
+* Automatically deactivate Polylang when activating Polylang Pro
+* Disable programmatically translated post types and taxonomies in settings. Props Ulrich Pogson. #180
+* Set the cookie language in Javascript when a cache plugin is active
+* Automatically remove the home page from cache when requesting the detection of the browser preferred language
+* Use relative urls for the admin language filter in admin bar. #209
+* Disable auto translation of WP_Term_Query if it has a 'lang' parameter
+* Don't filter REST requests by default. #211
+* Fix Yoast SEO statistics in dashboard showing only the default language. #211
+* Fix WP Rocket clearing the cache of the wrong adjacent post
+* Fix random header image
+* Fix home page not correctly loaded when adding a query var
+* Fix: Impossible to change the language code when the language code is also a WordPress locale.
+
+= 2.2.8 (2018-01-09) =
+
+* Pro: Fix: Impossible to link past events by translation in The Events Calendar
+* Disallow to delete translations of the default term for all taxonomies
+* Fix: Auto add pages adds WooCommerce pages in default language to menus in all languages
+* Fix most used tag cloud in Tags metabox in WP4.9+. Props Pär Thernström. #208
+
+= 2.2.7 (2017-11-30) =
+
+* Fix queries by taxonomy broken since WP 4.9
+* Fix PHP notice in icl_object_id()
+
+= 2.2.6 (2017-11-22) =
+
+* Pro: Fix query by post name and alternative language always returning the post in current language (when sharing slugs)
+* Pro: Fix query by taxonomy and alternative language returning empty results
+* Rework how translation files are loaded in ajax on front when the user is logged (in WP 4.7+)
+* Add filter 'get_objects_with_no_lang_limit'
+* Force loading the admin side when using WP CLI (Props chrisschrijver)
+* Fix check for terms with no language not scaling
+* Fix pll_count_posts not working with multiple post types
+* Fix inconsistent spacing between flag and language name in language switcher parent menu item (Props Amit Tal)
+* Fix spacing between flag and language name when displaying an RTL language
+* Fix get_terms not accepting comma separated values for 'lang' parameter (Props Pavlo Zhukov)
+* Fix possible wrong language detected in url when using subdomains (Props Pavlo Zhukov)
+* Fix double escaped query
+
+= 2.2.5 (2017-11-09) =
+
+* Update plugin updater class to 1.6.15
+* Add $link in cache key of links filters
+* Add support for 'nav_menu' post type in wpml_object_id
+* Fix conflict with Timber (introduced in 2.2.4)
+
+= 2.2.4 (2017-10-26) =
+
+* Pro: Fix unknown language not redirected to default when using multiple domains
+* Pro: Fix empty 'lang' query var not deactivating the language query filter
+* Pro: Fix conflict with The Events Calendar and Visual Composer when used together
+* Add new filter `pll_hide_archive_translation_url` #174
+* Add support for undocumented and deprecated WPML functions `wpml_object_id_filter` and `icl_get_current_language`
+* Fix 'orderby' and 'order' in `wpml_active_languages`. Needs WP 4.7+
+* Fix `icl_get_languages` not returning all languages when skip_missing = 0. Props Loïc Blascos
+* Fix `pll_translate_string` not working on admin #178
+* Fix PHP Warning in widget video in WP 4.9
+* Fix query using 'any' post type not filtered per language (introduced in 2.2)
+* Fix untranslatable string in About metabox. Props Farhad Sakhaei
+* Fix error with PHP 7.1 and Duplicate Post. Props Enea Scerba
+* Fix query auto translation not active in ajax requests on frontend
+* Fix query auto translation for 'postname' and 'pagename'
+* Fix terms query auto translation not working for 'include' when no taxonomy is provided (WP 4.5+)
+
+= 2.2.3 (2017-09-24) =
+
+* Fix editor removed on pages (introduced in 2.2.2)
+
+= 2.2.2 (2017-09-22) =
+
+* Pro: Fix Duplicate post button not working when the user meta has been corrupted
+* Fix PHP notice with the plugin Members #175
+* Fix page template select displayed when editing a translated page for posts
+* Fix incompatibility with WP 4.8.2 (placeholder %1$s in prepare)
+
+= 2.2.1 (2017-08-30) =
+
+* Pro: partially refactor REST API classes
+* Pro: Fix duplicate content user meta not removed from DB when uninstalling the plugin
+* Fix strings translations not removed from DB when uninstalling the plugin
+* Fix incorrect translation files loaded in ajax on front when the user is logged in (WP 4.7+)
+* Fix widget language dropdown removed when saving a widget (introduced in 2.2)
+* Fix queries with negative values for the 'cat' parameter (introduced in 2.2 for queries made on frontend)
+* Fix performance issue in combination with some plugins when the language is set from the content (introduced in 2.2)
+
+= 2.2 (2017-08-16) =
+
+* Pro: Add support for the REST API
+* Pro: Add integration with The Events Calendar
+* Pro: Refactor ACF Pro integration for post metas and integrate term metas
+* Pro: Ask confirmation if synchronizing a post overwrites an existing translation
+* Pro: Separate sync post logic from interface
+* Pro: Fix 'Detect browser language' option automatically deactivated
+* Pro: Fix redirect to 404 when the 'page' slug translation includes non alphanumeric characters.
+* Pro: Fix untranslated post type archive slug
+* Pro: Fix ACF taxonomy fields not copied when the taxonomy is not translated #156
+* Pro: Fix fatal error with ACF4
+* Support a different content text direction in admin #45
+* Add support for wildcards and 'copy-once' attribute in wpml-config.xml
+* Add minimal support for the filters 'wpml_display_language_names' and 'icl_ls_languages'
+* Improve compatibility with the plugin WordPress MU Domain Mapping #116
+* Improve speed of the sticky posts filter #41
+* Remove redirect_lang option for multiple domains and subdomains
+* Use secure cookie when using SSL
+* Allow to copy/sync term metas with the filter 'pll_copy_term_metas'
+* Filter ajax requests in term.php according to the term language
+* Add error message in customizer when setting an untranslated static front page #47
+* Load static page class only if we are using a static front page
+* Refactor parse_query filters to use the same code on frontend and admin
+* Don't use add_language_to_link in filters
+* Move ajaxPrefilter footer script on top
+* Use wp_doing_ajax() instead of DOING_AJAX constant
+* Fix queries custom tax not excluded from language filter on admin
+* Fix WP translation not loaded when the language is set from the content on multisite.
+* Fix the list of core post types in PLL_OLT_Manager for WP 4.7+
+* Fix post name and tag slug incorrectly sanitized for German and Danish
+* Fix lang attribute in dropdowns
+* Fix wpml_permalink filter #139
+* Fix WPML constants undefined on backend #151
+* Fix a conflict with the plugin Custom Permalinks #143
+* Fix menu location unexpectedly unset
+
+= 2.1.6 (2017-07-17) =
+
+* Pro: fix duplicate post button not working in PHP 7.1
+* Pro: fix CPTUI untranslated labels on admin
+* Adapt related posts filter to use slug instead of name to follow changes made on Jetpack server ( Props Steve Kaeser )
+* Fix PHP notices when translating CPT and custom tax titles in Yoast SEO
+* Fix PHP warning when all plugins are networked activated
+
+= 2.1.5 (2017-05-31) =
+
+* Add compatibility with new media widgets introduced in WP 4.8
+* Removing the language information in URL for the default language is now default
+* Update plugin updater class to 1.6.12
+* Pro: fix PHP notices when duplicating the content
+* Fix: test existence of `twentyseventeen_panel_count` instead of relying only on the active template
+* Fix: set current property to false when removing the current-menu-item class #134 props @mowar
+* Fix PHP notice when editing a term without language
+* Fix possible PHP notice when deleting a category
+* Fix fatal error with Gantry 5
+
+= 2.1.4 (2017-05-16) =
+
+* Pro: fix user not logged in on secondary domain when previewing changes
+* Pro: fix archive links without language code in ACF link field (ACF 5.4.0+)
+* Fix redirection from www subdomain to wrong language domain.
+* Fix: selecting "Front page displays latest posts" in the customizer not cleaning the languages cache
+* Fix accessibility of the admin language switcher
+
+= 2.1.3 (2017-04-11) =
+
+* Pro: Fix translated slug of 'page' if it is translated to an empty string
+* Update plugin updater class to 1.6.11
+* Strings registered with a wpml-config.xml file or WPML functions are now multiline by default
+* Translate the site title in emails sent to the user
+* Fix sanitize_user for specific locales
+* Fix deprecation notice in Yoast SEO integration
+* Fix: Clean term cache after the language has been set in mass #119
+
+= 2.1.2 (2017-03-09) =
+
+* Pro: Add filter 'pll_xdata_nonce_life'
+* Pro: Fix translation of WooCommerce product attribute slug
+* Pro: Fix product synchronization in WooCommerce 2.7
+* Pro: Fix error message when bulk trashing synchronized posts
+* Add option to discard item spacing in the output of pll_the_languages() ( Props Ceslav Przywara ) #93 #95
+* Add as, dzo, kab, km, ml_IN, nl_BE, pa_IN, rhg, sah, ta_IN, tah, te, tt_RU to the predefined list of languages
+* Update plugin updater class to 1.6.10
+* Fix: Remove the dependency to is_ssl() to detect the language in the url ( language set from the directory name )
+* Fix issue with secondary level domains
+* Fix strings not translated in emails
+* Fix incorrect usage of add_action() ( Props Peter J. Herrel ) #103
+* Fix wrong redirect in customizer in WP 4.7
+
+= 2.1.1 (2017-02-15) =
+
+* Pro: Add filter 'pll_enable_duplicate_media' for a fine control of automatic media duplication
+* Add filter 'pll_links_model' for the links model class name
+* Trim any starting ^ from modified rewrite rules
+* Pro: Fix wrong count of plugins to update
+* Fix slashed strings translations not saved #94
+
+= 2.1 (2017-01-25) =
+
+* Minimum WordPress version is now 4.4
+* Pro: Add support for synchronized posts (same post in multiple languages)
+* Pro: Add support for custom post type UI and the Divi Builder
+* Improve support of Yoast SEO (no category base and post type archive breadcrumb title)
+* Move Languages menu at top level instead of submenu of the WordPress settings
+* Copy the original post date when creating a translation and when the date is synchronized (Props Jory Hogeveen) #32
+* Remove hreflang attributes on paged pages and paged posts
+* Add label to widget language dropdown for better accessibility (Props Lawrence Francell) #53 #56
+* Remove constants POLYLANG_URL and PLL_LOCAL_URL
+* wp_get_sidebars_widgets() and is_active_sidebar() are now filtered according to widgets languages #54
+* Add functions pll_esc_html__(), pll_esc_html_e(), pll_esc_attr__() and pll_esc_attr_e() to the API (Props jegbagus) #83
+* Pro: Fix conflict between WooCommerce shop on front and translated shop base slug
+* Pro: Fix $wp_rewrite search base and author_base not translated #68
+* Pro: Fix page preview does not log in the user when using subdomains
+* Fix: avoid setting the language cookie on 404 pages
+* Fix: rewrite rules order modified for custom post types archives
+* Fix: conflict with WP All Import causing our filters to fail in "Add Media" modal when editing a post
+* Fix: auto add pages not working for nav menus assigned to several locations
+* Fix: Jetpack infinite scroll for multiple domains #58 #74
+* Fix: serialize error in Strings translations when balanceTags option is active #63
+* Fix: static front page preview when redirected from the languages page #49
+* Fix: Auto add pages not working for nav menus assigned to several locations
+* Fix: Conflict with Woocommerce Show Single Variation
+* Fix: Parent page not synchronized in Quick edit (introduced in 2.0.8)
+* Fix: WPML API wpml_element_has_translations and wpml_post_language_details
+* Fix: unattached media translations not in language switcher
+* Fix: Conflict with WP Residence advanced search
+
+= 2.0.12 (2016-12-19) =
+
+* Fix plugin not loaded first (introduced in 2.0.11)
+* Fix wrong translations files loaded when the language is set from the content in WP 4.7 #76
+* Fix notice when a tax query has no terms (using EXISTS or NOT EXISTS)
+
+= 2.0.11 (2016-12-12) =
+
+* Pro: Fix shared term slugs broken by a late change in WP 4.7 #73
+* Pro: Fix media taxonomies lost when creating a media translation when taxonomies sync is activated #72
+* Fix fatal error in customizer when Twenty Seventeen is activated and another theme is previewed #71
+* Fix wrong plugin language on admin if user locale is different from site locale in WP 4.7
+
+= 2.0.10 (2016-12-05) =
+
+* Add support for front page panels of Twenty Seventeen
+* Remove draft posts from the language switcher even when the user is logged in
+* Fix: Make argument 2 of icl_object_id optional
+* Fix a conflict with the Divi theme (#67)
+
+= 2.0.9 (2016-11-15) =
+
+* Fix javascript error in some ajax requests
+
+= 2.0.8 (2016-11-14) =
+
+* Disable admin language feature in WP 4.7+
+* Pro: fix case where a media could lose its parent post when translated on the fly by the content duplication
+* Pro: fix on the fly media created at content duplication attached to parent page instead of child page
+* Fix translations input fields not populated in languages metabox when creating a new translation in WP 4.7
+* Fix possibility to delete the translations of the default category in WP 4.7
+* Fix tag search not filtered per language in Quick edit in WP 4.7
+* Fix dropdown language switcher not working for untranslated pages
+
+= 2.0.7 (2016-10-18) =
+
+* Fix issues with static front pages introduced in version 2.0.6
+
+= 2.0.6 (2016-10-17) =
+
+* Pro: Fix translated paged slug not working on paged static front page
+* Add support for WPML filter 'wpml_language_form_input_field'
+* Fix PHP notice when using the WPML filter 'wpml_current_language'
+* Fix cases where the admin language filter is not correctly taken into account
+* Fix paged static front pages in plain permalinks
+* Fix paged static front pages for multiple domains (#43)
+* Fix warning occurring when a 3rd party plugin attempts to register anything but a string in the strings translations panel
+* Fix cross domain http request for media when using multiple domains or subdomains
+* Fix error 404 on pages when no language has been created yet
+
+= 2.0.5 (2016-09-22) Five years after! =
+
+* Pro: Fix conflict with WPBakery Visual Composer
+* Pro: Fix conflict between multiple domains SSO and FORCE_SSL_ADMIN
+* Pro: Fix duplicated fields not displayed in new translation in ACF Pro 5.4+
+* Add Tibetan and Silesian to the predefined languages list
+* Remove duplicated strings from the strings translations (even when they have a different name or group)
+* The languages and translations of custom post types and taxonomies are no more activated by default at activation
+* Allow to deactivate auto translation in secondary by setting 'lang' to an empty value
+* Fix: invalidate the cache of PLL_MO ids when adding a new language
+* Fix: don't filter secondary queries when editing a post in an untranslated post type
+
+= 2.0.4 (2016-09-06) =
+
+* Add Gujarati to the predefined languages list
+* Fix conflict with Page Builder. Other parts of the conflict are fixed in Page Builder 2.4.14
+* Fix plugins translations incorrectly loaded in WP 4.6
+* Fix error 404 on paged urls when using a non standard port
+
+= 2.0.3 (2016-08-16) =
+
+* Pro: Fix PHP notice when hiding the language code in url and the language is set from subdomains
+* Pro: Fix one more media being created when the duplicate media in all languages is activated (introduced in 2.0)
+* Pro: Fix shared term slugs not working on PHP 7
+* Pro: Fix Polylang storing integers in some ACF Pro fields where ACF Pro stores strings
+* Pro: Fix ACF Pro custom fields synchronized even when the custom fields synchronization option is deactivated (#40)
+* Fix PHP notice: Undefined variable: original_value in /modules/wpml/wpml-api.php on line 168
+* Fix translations loaded too soon by plugins not correctly reloaded since WP 4.6 (#39)
+* Fix: Remove the delete link for translations of the default category on PHP 7
+* Fix unescaped i18n strings in Lingotek presentation
+
+= 2.0.2 (2016-08-03) =
+
+* Avoid fatal error when a 3rd party theme or plugin has a malformed wpml-config.xml file: the malformed wpml-config.xml file is simply ignored
+
+= 2.0.1 (2016-08-02) =
+
+* Fix fatal error on PHP < 5.4 (introduced in 2.0)
+* Fix custom flags not being loaded (introduced in 2.0)
+
+= 2.0 (2016-08-02) =
+
+* Pro: Improve integration with ACF Pro
+* Pro: Add support for single sign on across multiple domains or subdomains
+* Pro: Add support for browser language detection when using multiple domains
+* Pro: Add support for translation of the static portion of the post permalink structure
+* Pro: Fix deactivated languages appearing in Yoast SEO sitemaps
+* Pro: Fix impossibility to visit a deactivated language when using subdomains or multiple domains (#10)
+* Pro: Fix when sharing slug on the page for posts, only one of them is accessible (#33)
+* Add the possibility to use the language switcher as dropdown in menu
+* Add support for custom logo introduced in WP 4.5 (#6)
+* The backend current language ( PLL()->curlang ) is now equal to the language of current post or term being edited (#19)
+* The sample permalink is now updated when changing the language in the Languages metabox
+* Revamp the wpml-config.xml reader to use simplexml instead of our custom xml parser
+* Improve support for the WPML API (including Hook API introduced in WPML 3.2)
+* Add support for translation of meta titles and descriptions of custom post types and custom taxonomies in Yoast SEO
+* Replace uncached functions by WPCOM VIP functions when available
+* Improve compatibility with WP 4.6
+* Fix parent category wrongly assigned to post when synchronizing children categories (#21)
+* Fix custom fonts not loaded when using multiple domains or subdomains
+* Fix remove_accents() not working for German and Danish (#24)
+* Fix incorrect static front pages urls on backend
+* Fix impossible to directly enter the page number in strings translation table (introduced in 1.9.3)
+* Fix conflict with WP Sweep (needs WP Sweep 1.0.8+)
+* Fix potential performance issue by querying only taxonomies to show in quick edit to filter the category checklist
+* Fix conflict (database error) with ReOrder-posts-within-categories plugin
+* Fix languages per page option not saved
+
+= 1.9.3 (2016-06-28) =
+
+* Pro: Allow to add slashes in url slugs translations
+* Pro: Fix archive links not using translated slugs
+* Pro: Fix visitor being redirected to 404 if his browser preference is set to an inactive language
+* Fix strings translations table always back to page 1 when submitting the form (#14)
+* Fix get_pages( array( 'lang' => '' ) ) not querying all the languages
+* Fix switching the admin language filter can override the static front page settings (#16)
+
+= 1.9.2 (2016-06-06) =
+
+* Pro: fix unreachable hierarchical custom post type posts when they are sharing slugs across languages
+* Fix missing argument 3 in icl_t
+* Fix conflict with WooCommerce product variations
+
+= 1.9.1 (2016-05-23) =
+
+* Pro: add compatibility with Beaver Builder
+* Pro: fix media wrongly created when adding a new media translation
+* Add azb, ceb, de_CH_informal, es_GT, mr, nl_NL_formal to the predefined list of languages
+* Fix the language switcher not linking to media translations for anonymous visitors
+
+= 1.9 (2016-04-27) =
+
+* Pro: add the possibility to translate custom post types slugs, taxonomies slugs and more
+* Pro: add the possibility to share the same post or term slug across languages
+* Pro: add the possibility to duplicate the content when creating a new translation
+* Pro: add the possibility to create all translations at once when uploading a media
+* Pro: add the possibility to disable a language
+* Add license and update management
+* Add inline docs for all filters and actions
+* When possible, the rel alternate hreflang now display only the language code (without the country code)
+* When combined with flags in the language switcher, wrap the language name inside tags
+* Add customizer selective refresh support for the language switcher widget ( needs WP 4.5+ )
+* Fix dynamic options of the language switcher widget not working in the customizer
+* Fix possible error 404 on page shortlink when using subdomains or multiple domains
+* Fix get_adjacent_post() and wp_get_archives() for untranslated post types ( needs WP 4.4+ )
+* Fix language homepage urls not present in Yoast SEO sitemap (when the homepages display posts)
+
+= 1.8.5 (2016-04-03) =
+
+* Revert from $_SERVER['PHP_SELF'] to $_SERVER['SCRIPT_FILENAME'] to detect if the user is on login/register/signup page
+* Fix incompatibility introduced by WP 4.5 in Edit single taxonomy term screen
+* Fix existing post overridden when creating a language and a conflicting plugin sets the global $post on languages pages
+
+= 1.8.4 (2016-03-06) =
+
+* Revert canonical redirection of static front page when combining plain permalinks + default language hidden in url (introduced in 1.8.2)
+
+= 1.8.3 (2016-03-04) =
+
+* fix: All pages are redirected to the home page on some installations (introduced in 1.8.2)
+
+= 1.8.2 (2016-03-02) =
+
+* Add support for the 'wpml_get_default_language()' function from the WPML API
+* Stop blocking saving settings when errors are detected (invalid domains)
+* Use publicly_queryable => true instead of public => true for the language taxonomy (WP 4.5+)
+* fix: PHP notice when pll_default_language() is called before a language is created
+* fix: PHP notice undefined property PLL_Language::$page_on_front
+* fix: canonical redirection of static front page when combining plain permalinks + default language hidden in url
+* fix: YARPP compatibility broken in v1.8
+* fix: Remove the delete link for translations of the default category (introduced back by WP 4.3)
+* fix: settings not displayed with WP 4.1 or older
+
+= 1.8.1 (2016-01-31) =
+
+* Update the list of Facebook locales used for Opengraph support with Yoast SEO and Jetpack
+* fix: secondary query with translated post type and untranslated taxonomy mixes languages (introduced in 1.8)
+* fix: issue with paged static front page when hiding the default language in url
+* fix: potential issue with cache after synchronizations
+* fix: trailing slash added to canonical home url outputted by Yoast SEO when using default permalinks
+
+= 1.8 (2016-01-19) =
+
+* Minimum WordPress version is now 4.0
+* Add ary, bn_BD, en_ZA, es_AR, fr_CA and fr_BE to the predefined languages list
+* Adopt WordPress coding standards
+* New structure for translated posts and terms (=> several methods of PLL_Model are deprecated).
+* Revamp the management of the static front page and page for posts
+* Improve performance for navigation menus with a lot of pages
+* The Polylang and WPML API are now loaded when 'plugins_loaded' is fired (on frontend only if at least one language has been defined)
+* Add 'pll_get_post_translations()' and 'pll_get_term_translations()' to the API
+* Add filter 'pll_cookie_expiration' to change the cookie expiration time
+* Add support for 'wpml_get_language_information()' function from the WPML API
+* The default language is now managed directly from the languages list table
+* Various accessibility improvements
+* It is now possible to choose the languages flags from the available list (custom flags on frontend still work as previously)
+* Revamp the settings page (now a list table with inline configuration)
+* Add an option to remove all data when uninstalling the plugin
+* Add test of subdomains and domains accessibility
+* Add post state for translations of the front page and posts page
+* Add better support of the customizer menus introduced in WP 4.3
+* Media taxonomies (created by 3rd party plugins) are now filtered by language when editing a media
+* Synchronization of taxonomies (created by 3rd party plugins) and meta are now enabled for media
+* The 'hreflang' tag now refers to the locale instead of the 2-letters language code
+* Workaround for WordPress locales not being W3C valid (see #33511)
+* Workaround a bug in Nextgen Gallery causing redirect on album
+* Add compatibility with Duplicate Post plugin to avoid duplicated post keeping the link to translations
+* Add compatibility with Jetpack Related Posts
+* fix: incorrect rewrite rules after changing how the language is set (need to flush rewrite rules after this)
+* fix: password protected pages don't work on multiple domains
+* fix: ensure that the page parent is in the correct language when using bulk edit
+* fix: is_tax set on category and post tags archives when it should not
+* fix: automatically added new top-level pages to menus are not filtered by language
+* fix: nav menus locations are messed when changing the default language
+* fix: error 404 for untranslated taxonomies pages
+* fix: single posts and pages links do not include the language code when using the default permalinks and forcing the language code in url
+* fix: missing trailing slash on home url when using default permalinks or a static front page
+* fix: sticky visibility is copied to new translation only if the synchronization is activated
+* fix: remove "» Languages » [language name]" from the feed title
+* fix: spaces are not honored when searching strings translations
+* fix: default language not set and terms translations not correctly imported when using WordPress Importer
+* fix: the browser language detection does not differentiate 'en_US' and 'en_GB'
+* fix: non alphanumeric characters query vars values lead to an infinite redirection loop on static front pages
+* fix: user profile not saved for a language when the language code contains a "-"
+* fix: non translated posts page always link to the static front page even when they should not
+* fix: remove hreflang="x-default" when using one domain per language
+* fix: deprecated function notice in WP 4.5 alpha
+* fix: wrong url for attachments when media are translated and using subdomains
+* fix: wrong url for unattached attachments when using subdirectories (since WP 4.4)
+* fix: wrong url scheme for custom flags
+
+= 1.7.12 (2015-11-13) =
+
+* The language taxonomy is now public for compatibility with WP 4.4
+* fix: nav menus locations are not correctly populated in customizer in WP 4.4
+* fix: the termmeta table was still deleted at upgrade
+* fix: fatal error when using the argument 'post_id' in 'pll_the_languages()' (introduced in 1.7.11) [props EKesty](https://wordpress.org/support/topic/bug-on)
+* fix: potential notice in 'pll_the_languages()' [props mattkeys](https://wordpress.org/support/topic/bug-on)
+
+= 1.7.11 (2015-10-15) =
+
+* fix: conflict with GET ajax requests sent by the jquery method load
+* fix: notice in frontend-nav-menu.php at line 211 (introduced in 1.7.10) [props Jesse Graupmann](https://wordpress.org/support/topic/warning-and-notice-on-upgrade)
+* fix: the parent list in page attributes metabox is not in the correct language (introduced in 1.7.10)
+* fix: error 404 for attachments
+* fix: the language switcher is not displayed when combining "Forces link to front page" and "Hides languages with no translation"
+
+= 1.7.10 (2015-09-28) =
+
+* Add Occitan translation contributed by [Cédric Valmary](http://www.totenoc.eu/)
+* Add de_DE_formal, en_NZ, es_CO, hy, oci, ps and tl to the predefined languages list
+* Add the filter 'pll_predefined_languages' and the actions 'pll_language_edit_form_fields' and 'pll_language_add_form_fields'
+* the termmeta table (used in Polylang < 1.2) is no more deleted when uninstalling the plugin (as it will soon be included in WP)
+* fix: prevent creating a media translation if one already exists
+* fix: Attempt to translate the nav menus for themes registering a theme location but not using it in wp_nav_menu()
+* fix: Jetpack infinite scroll
+* fix: issue with terms languages when two languages have the same name
+* fix: notices when deleting a tag and Lingotek is active
+* fix: the languages cache is not cleaned when updating the site home url
+* fix: conflict with the theme Ambition
+* fix: front page canonical url displayed by Yoast SEO
+* fix: typo in options definition at install [props null.bit](https://wordpress.org/support/topic/suggestions-for-two-new-filters?replies=5#post-7466159)
+* fix: error when adding a term in a non-translated taxonomy
+
+= 1.7.9 (2015-08-17) =
+
+* Minimum WordPress version is now v3.9
+* Add: hreflang="x-default" on front page when the default language code is not hidden in urls
+* fix: remove hreflang links in html head section of paged archives to please Google
+* fix: conflict with WPSEO sitemap caching when using multiple domains. [props Junaid Bhura](https://wordpress.org/support/topic/wp-seo-sitemap-and-translation-subdomain-issue?replies=8#post-7113817)
+* fix: change the order of strings translations columns for better display on mobile devices in WP 4.3
+* fix: various issues with nav menus and customizer in WP 4.3
+* fix: correctly disallow unchecking both show names and show flags in the language switcher form
+
+= 1.7.8 (2015-07-21) =
+
+* fix: conflict with PHP < 5.4 introduced in 1.7.7
+
+= 1.7.7 (2015-07-20) =
+
+* Add Romanian translation contributed by uskro
+* Add Japanese translation contributed by [Eiko Toda](http://www.eikotoda.com)
+* Update French translation contributed by [fxbenard](http://fxbenard.com/)
+* The language locale is now validated with the same pattern as in WP 4.3. See #28303
+* fix: make sure that the language switcher never finds translations for untranslated post types (could occur when the post type was previously translated)
+* fix: display the default category according to the admin language filter in settings->writing
+* fix: flushing rewrite rules at network activation and de-activation is back. [props RavanH](https://polylang.wordpress.com/2015/06/10/polylang-1-7-6-and-multisite/comment-page-1/#comment-1138)
+* fix: avoid a conflict with WP Super Cache preloading (loading 'polylang_mo' posts which are 404). [props ecdltf](https://wordpress.org/support/topic/polylang_mo-and-404s-take-2)
+* fix: customizer menus issues introduced by changes in WP 4.1
+* fix: strings translations are not saved when pressing enter
+* fix: it is not possible to de-activate the translation for custom post types and taxonomies from wpml-config.xml
+* fix: conflict with plugins using stringified json in ajax requests
+
+= 1.7.6 (2015-06-10) =
+
+* Add Galician translation contributed by [Toño Calo](http://fedellar.wordpress.com/)
+* fix: incorrect post type archive link for untranslated post types
+* fix: notices in wp-import.php
+* fix: avoid flushing rewrite rules at network activation and de-activation
+* fix: the note below the category list table displays the default category according to the admin language filter
+* fix: wrong future posts permalinks
+* fix: deleting a media translation deletes the file too
+* fix: when using persistent object cache, get_terms is not always filtered by the correct language on admin side
+* fix: it is possible to create two categories having the same translation
+* fix: fatal error when using the dropdown language switcher in WP < 4.1
+
+= 1.7.5 (2015-05-11) =
+
+* Add 'pll_languages_list' filter
+* fix: warning when a plugin calls 'icl_object_id' with an untranslated post type (seen in ACF 4.4.1)
+* fix: the language is not correctly set from the url when using PATHINFO permalinks (introduced in 1.6!)
+* fix: notice when a search is filtered by a taxonomy term in a different language
+
+= 1.7.4 (2015-05-03) =
+
+* fix: translated taxonomies and post types from wpml-config.xml are not filtered on frontend (introduced in 1.7.2)
+* fix: WPML strings translations not always loaded (introduced in 1.7)
+* fix: $.ajaxPrefilter() may not work as expected [props ScreenfeedFr](https://wordpress.org/support/topic/ajaxprefilter-may-not-work-as-expected)
+* fix: can't hide the language code for the default language when using subdomains
+* fix: incorrect static front page url when hiding the default language information
+* fix: an untranslated posts page may display posts in all languages
+* fix: javascript error when changing the language of a hierarchical post type from the languages metabox in WP 4.2
+* fix: subdomains urls are malformed when the main site uses www.
+* fix: suggest tags are not filtered in quick edit
+* fix: parent page dropdown list not filtered in quick edit
+
+= 1.7.3 (2015-04-11) =
+
+* the transient 'pll_languages_list' now stores an array of arrays instead of an array of PLL_Language objects
+* fix: fatal error for users hosted at GoDaddy (due to PLL_Language objects stored in a transient)
+* fix: additional query vars are removed from home page
+* fix: categories are not filtered by the admin language switcher in posts list table (introduced in 1.7)
+* fix: when using multiple domains, the domain url is lost when modifying the language slug
+* fix: the queried object is incorrectly set for author archives (introduced in 1.6.5)
+* fix: notice when a nav menu assigned to a translated nav menu location has been deleted
+* fix: no canonical redirection when using pretty permalinks and querying default permalinks
+
+= 1.7.2 (2015-03-23) =
+
+* fix: comments are filtered for posts in a post type not managed by Polylang
+* fix: translated static front page don't work when setting PLL_CACHE_HOME_URL to false (introduced in 1.7)
+* fix: the query for taxonomies on custom post types is broken (when adding the language code to the url)
+
+= 1.7.1 (2015-03-20) =
+
+* fix: wrong redirection when using a static front page and replacing the page name by the language code (introduced in 1.7)
+
+= 1.7 (2015-03-19) =
+
+* Minimum WordPress version is now v3.8
+* Add new languages to the predefined languages list: Swiss German, Hazaragi
+* Add compatibility with nested tax queries introduced in WP 4.1
+* Add compatibility with splitting shared terms to be introduced in WP 4.2
+* Add the possibility to change the domain in the default language when using multiple domains (avoids a conflict with the domain mapping plugin)
+* Add the possibility to set the language from the code in url when using default permalinks
+* Adding the language code in url is now default at first activation (should improve the out of the box compatibility with other plugins and themes)
+* Add new language switcher option to hide a language with no translation
+* pll_the_languages() now outputs the js code to handle language change in dropdown list (as done by the widget)
+* Improve performance by using base64 encoded flags + various slight optimizations
+* Improve protection against chained redirects
+* The find posts list is now filtered per media language when clicking on attach link in Media library
+* Copy alternative text when creating a media translation
+* The category checklist in quick edit is now filtered per post language instead of admin language filter
+* Quick and bulk language edit don't break translations anymore if the new language is free
+* Make it impossible to change the language of the default categories
+* Make sure that a default category defined in settings->writing is translated in all languages
+* Tweak css for mobiles in add and edit term form
+* Tweak the query getting the list of available posts in the autocomplete input field in the post languages metabox
+* fix: after adding a term translation, need to refresh the page before adding a new term
+* fix: term translations rows are not modified in list table when a term is added / deleted or inline edited
+* fix: post translations rows are not modified in list table when a post is inline edited
+* fix: using brackets in language name breaks strings translations
+* fix: quick edit may conflict with other plugins
+* fix: impossible to use several dropdown languages widgets
+* fix: pll_the_languages() may display a dropdown with empty options
+* fix: the categories widget does not work correctly with dropdown
+* fix: autosave post always created after manual save
+* fix: tax query not filtered by language when using 'NOT IN' operator on a translated taxonomy
+* fix: incorrect translation url for searches filtered by taxonomy
+* fix: backward incompatibility for edited_term_taxonomy action introduced in WP 4.2
+* fix: the home link may be incorrect on MS Windows
+* fix: tags in wrong language may be assigned when bulk editing posts in several languages
+* fix: tags created when bulk editing posts are not assigned any language
+* fix: Illegal string offset 'taxonomy' introduced in v1.6.5
+* fix: Undefined property: WP_Query::$queried_object_id when calling pll_the_languages(array('raw' => 1)) in a function hooked to 'wp'. props [KLicheR](https://wordpress.org/support/profile/klicher)
+* fix: Notice in admin.php when used with MailPoet plugin
+
+= 1.6.5 (2015-02-18) =
+
+* Add new correspondences between WordPress locales and Facebook locales (for WPSEO and Jetpack users)
+* fix: quick draft posts are always assigned the default category in the default language
+* fix: Notice: Undefined offset: 0 in wp-includes/query.php introduced in WP 4.1
+* fix: is_tax and is_archive are not correctly set when a custom taxonomy term is queried
+* fix: conflict introduced by WPSEO 1.7.2+
+
+= 1.6.4 (2015-02-01) =
+
+* Add es_MX to predefined languages list
+* Add compatibility with WordPress SEO sitemaps for multiple domains and subdomains
+* fix: a new post is assigned the wrong (untranslated) default category if no category is assigned by the user
+* fix: the home links now have the right scheme even if PLL_CACHE_HOME_URL is not set to false
+* fix: fatal error when using old versions of WPSEO (I should do what I tell other to do!)
+* fix: strings translations are not switched when using switch_to_blog
+
+= 1.6.3 (2015-01-09) =
+
+* Add Georgian translation contributed by [Tours in Georgia](http://www.georgia-tours.eu/)
+* fix: WXR export does not include the language of untranslated terms (will now work only for newly saved terms)
+* fix: better cleaning of DB when translated objects are deleted
+* fix: incorrect (ajax) translations links when modifying a term language
+* fix: warning: Illegal string offset 'taxonomy' introduced by the combination of WP 4.1 and some plugins.
+
+= 1.6.2 (2014-12-14) =
+
+* fix: bugs and inconsistencies compared to WPML in 'icl_get_languages' (should fix a conflict with Avada)
+* fix: https issue
+* fix: stop displaying an error when adding en_US as new language (translation not downloaded)
+* fix: infinite redirect loop on (unattached) attachment links
+* fix: impossible to add tags in post quick edit (introduced in 1.5)
+* fix: the customizer does not land to the right page when cumulating: static front page + page name in url + default language code not hidden
+* fix: read parent theme wpml-config.xml before child theme
+* fix: add protection to avoid empty language
+* fix: page preview link again
+
+= 1.6.1 (2014-11-19) =
+
+* Add Brazilian Portuguese translation contributed by [Henrique Vianna](http://henriquevianna.com/)
+* Improve compatibility with Types: allow custom fields to be populated when creating a new translation
+* Make it impossible to remove the translations of the default category
+* Fix: possibility to add a path when using multiple domains (same path for all languages) broken since v1.5.6
+* Fix: preview link for non default language when using multiple domains
+* Fix: error displayed when setting the static front page and only one language has been defined
+* Fix: revert changes on rewrite rules with front introduced in 1.6
+* Fix: conflict with WordPress SEO when no language has been created
+
+= 1.6 (2014-10-27) =
+
+* Add Croatian translation contributed by Bajro
+* Add new languages to predefined languages list: Azerbaijani, English (Australia), English (UK), Basque
+* Add flag in front of the language select dropdown for posts and terms
+* Add widget text translation
+* Add opengraph support for locale and translations when WordPress SEO or Jetpack are activated
+* Add error message if attempting to assign an untranslated page as static front page
+* Add 'pll_sanitize_string_translation' filter to sanitize registered strings translations when saved
+* Fix: change the en_US flag to US flag. The UK flag is now associated to en_GB
+* Fix: change Belarusian locale from be_BY to bel to in agreement with translate.wordpress.org
+* Fix home pages duplicate urls when using domains or subdomains
+* Fix rewrite rules with front
+* Fix: terms are always in default language when created from post bulk edit
+
+= 1.5.6 (2014-10-11) =
+
+* Fix: the admin language filter is not active for paginated taxonomy in nav menu admin panel
+* Fix: wrong redirection if a domain is a substring of another domain (ex: mysite.com and mysite.co)
+* Fix: impossible to translate numeric values in options defined in wpml-config.xml
+* Fix: call to undefined method PLL_Links::get_translation_url() with Avada theme
+* Fix: manage_{$this->screen->taxonomy}_custom_icolumn is a filter and not an action
+
+= 1.5.5 (2014-09-10) =
+
+* Fix: missing argument 4 in icl_translate
+* Fix: conflict with Vantage theme
+* Fix: possible issue with cookie domain on 'localhost'
+* Fix: filtering string translations does not work when the group name contains a space
+* Fix: Possible 404 error for attachments
+* Fix: PHP notice when a shared term is not translated in all taxonomies
+
+= 1.5.4 (2014-08-13) =
+
+* Add new API functions: pll_get_post_language, pll_get_term_language, pll_translate_string
+* Add better compatibility with Jetpack 3
+* Fix: attachments don't get any language when uploaded from frontend
+* Fix: authors cannot create tags
+* Fix: too restrictive capability checks for some edge cases
+* Fix: conflict with WPSEO: taxonomy metas cannot be saved
+
+= 1.5.3 (2014-07-12) =
+
+* Add: Capability check before creating links in post list table
+* Add: Possibility not to cache languages objects with option PLL_CACHE_LANGUAGES (for GoDaddy users)
+* Fix: Saving a header or a background in menu Appearance resets nav menus locations (introduced in 1.5)
+* Fix: sub-sub-options and deeper levels defined in wpml-config.xml are not translated
+* Fix: Fatal error when creating a new site when Polylang is network activated (introduced in v1.5.1)
+* Fix: Admin language forced to English when activating Polylang (before creating any new language)
+* Fix: 'pll_count_posts' second parameter not taken into account
+* Fix: 'edit-post' and 'create-posts' capabilities are not differentiated when saving a post
+
+= 1.5.2 (2014-06-24) =
+
+* Fix: Revert post translations terms cleaning introduced in 1.5 as it seems to cause problems
+* Fix: Impossible to delete a biographical info (introduced in 1.5)
+* Fix: Security issue reported by [Gregory Viguier](http://www.screenfeed.fr/)
+
+= 1.5.1 (2014-06-19) =
+
+* Add: filter 'pll_settings_tabs' and action 'pll_settings_active_tab_{$tab}'
+* Add: possibility to add a path when using multiple domains (same path for all languages)
+* Fix: Bad redirection if /language/ is added to urls (introduced in 1.5)
+* Fix: Nav menu locations are not saved in customizer (introduced in 1.4)
+* Fix: Unable to unset nav menu locations
+* Fix: Incorrect link for date archives in language switcher (introduced in 1.5)
+* Fix: Fatal error when using featured content in Twenty Fourteen
+* Fix: Posts bulk edit broken (introduced in 1.5)
+* Fix: Polylang does not play nice with switch_to_blog
+* Fix: Warning: reset() expects parameter 1 to be array, null given in admin-filters-columns.php on line 81
+
+= 1.5 (2014-05-29) =
+
+* Add Ukrainian translation contributed by [http://getvoip.com/](http://getvoip.com/)
+* Refresh translation metaboxes (again): now translated posts are chosen from an autocomplete input field
+* Categories and post tags translations are also chosen in an autocomplete input field
+* Better error management on languages pages
+* Use Dashicons instead of Icomoon icons for WP 3.8+
+* Check if translated post is readable by the current user before displaying the language switcher
+* Minimum Twenty Fourteen version is now 1.1
+* Code cleaning
+* Add support for Quick draft introduced in WP 3.8
+* Add support for object cache plugins for recent posts and recent comments widgets
+* Add support for pages with modified query in the language switcher (ex: when multiple post types queried on the same page)
+* Add new API functions: pll_languages_list, pll_set_post_language, pll_set_term_language, pll_save_post_translations, pll_save_term_translations, pll_count_posts
+* Add new filter pll_the_languages_args
+* Add support for ICL_LANGUAGE_CODE == 'all' on admin side
+* Fix: Galician flag
+* Fix: static page on front pagination is broken
+* Fix: search url may be broken
+* Fix: PHP notice in icl_get_languages
+* Fix: more robust way of detecting language in url when using directory
+* Fix: delete translations terms orphans in database
+* Fix: inconsistent behavior when setting page on front from customizer
+* Fix: deleting a category assigns posts to wrong default category
+* Fix: quick edit breaks synchronization
+* Fix: some security issues
+
+= 1.4.5 (2014-04-19) =
+
+* Fix: Notice when combined with WPSEO 1.5+
+* Fix: Impossible to disable a widget language filter once set (introduced in 1.4.4)
+* Fix: Unexpected redirection of the homepage with language code when permalink structure has no trailing slash (introduced in 1.4.4)
+* Fix: Some installs lead to wrong redirection when using domains (introduced in 1.4.4)
+* Fix: Possible infinite redirection while previewing posts (introduced in 1.4.4)
+* Fix: Uploaded medias don't get a language since WP 3.9
+* Fix: Compatibility with Twenty Fourteen Ephemera widget in the version shipped with WP 3.9
+
+= 1.4.4 (2014-04-09) =
+
+* Add: Compatibility with widgets customizer introduced in WP 3.9
+* Fix: No post in translation dropdown after switching the language in edit post (introduced in 1.4.3)
+* Fix: No canonical redirection when there is no language code in url and the language code is not hidden for the default language
+* Fix: Suppress language cookie when using multiple domains
+
+= 1.4.3 (2014-03-22) =
+
+* Add: Serbian translation contributed by Sinisa
+* Add: Myanmar translation contributed by Sithu Thwin
+* Fix: comment form redirects to wp-admin when using multiple domains or subdomains.
+* Fix: fatal error with old versions of PHP (tested on PHP 5.2.4)
+* Fix: Bad gateway experienced by users hosted by wpengine.com
+* Fix: links got from tiny MCE link button are filtered with admin language filter instead of current post language
+* Fix: possibly wrong redirection in check_language_code_in_url when using multiple domains or subdomains
+
+= 1.4.2 (2014-02-24) =
+
+* Add: check multiple post types in PLL_Model::count_posts
+* Fix: error 404 on category links when setting the language by content (introduced in 1.4.1)
+* Fix: PHP notices in frontend-nav-menu.php with Artisteer themes
+* Fix: decrease the memory usage of untranslated posts list
+* Fix: home page not correctly redirected to canonical when using page on front and page name is kept in url
+
+= 1.4.1 (2014-02-16) =
+
+* Add: Czech translation contributed by [Přemysl Karbula](http://www.premyslkarbula.cz)
+* Fix: the displayed language is not correct in quick edit for categories and post tags
+* Fix: the language switcher does not display the correct link for translated parent categories if only children have posts
+* Fix: 3rd parameter of icl_object_id is not optional
+* Fix: issue when combining multiple domains and browser detection -> the combination is now forbidden
+* Fix: conflict Shiba Media Library: link between media translations is lost when using media quick edit
+* Fix: notice when using taxonomies in wpml-config.xml
+* Fix: incorrect post format link
+* Fix: Twenty Fourteen Ephemera widget strings are not translated
+
+= 1.4 (2014-01-22) =
+
+* Add Traditional Chinese translation contributed by [香腸](http://sofree.cc/)
+* Minimum WordPress version is now v3.5
+* Refresh translations metaboxes: now translated posts are chosen in a dropdown list
+* Check if translated archives for category, tag and post format are empty before displaying the language switcher
+* Add specific management of translated featured tag in Twenty Fourteen
+* Add the possibility not to cache homepage urls with option PLL_CACHE_HOME_URL (for users having several domains).
+* The function get_pages is now filtered by language
+* Ajax requests on frontend are now automatically detected. It is no more necessary to set 'pll_load_front' :)
+* Various performance improvements
+* 'pll_get_post_types' and 'pll_get_taxonomies' filters must be added *before* 'after_setup_theme' is fired
+* Pre 1.2 data will be removed from DB at first upgrade at least 60 days after upgrade to 1.4
+* Removed some duplicate code between admin and frontend
+* Bug correction: incorrect pagination when using domains or subdomains
+* Bug correction: post format link not translated
+* Bug correction: impossible to use child terms with same name in hierarchical taxonomies
+* Bug correction: the terms list table is filtered according to new translation language instead of admin language filter
+
+= 1.3.1 (2013-12-13) =
+
+* Bug correction: fatal error on settings page if a static front page without language is set
+* Bug correction: wrong home url when using different domains per language
+
+= 1.3 (2013-12-11) =
+
+* Refresh admin UI for better look in WP 3.8 and more dynamic comportment
+* The "Detect browser language" option does now also controls returning visits (based on cookie).
+* Improved performance by optimizing some queries for WP 3.5+
+* The user biography in default language is now stored in default WordPress usermeta
+* Add language parameter in API function pll_home_url and allow to call it on admin side
+* Calling 'get_terms' with the 'lang' parameter now uses a cache object per language
+* Bug correction: conflict with unstranslated taxonomies
+* Bug correction: possible malformed translation archive url in language switcher
+* Bug correction: a wrong language may be displayed in quick edit dropdown
+* Bug correction: it is possible to add multiple translations (in the same language) for a single taxonomy term
+* Bug correction: non public post types and taxonomies are visible in Polylang settings
+* Bug correction: the language is always chosen from cookie (or browser preferences) in some installations
+* Bug correction: Firefox language preference is not recognized when comparison is made on locale (instead of ISO 639-1 language code)
+* Bug correction: incorrect tax_query in PLL_Auto_Translate
+
+= 1.2.4 (2013-11-28) =
+
+* Better support for theme customizer
+* Bug correction: admin bar search does not filter by language
+* Bug correction: possible conflict on secondary query when querying taxonomies or single page
+* Bug correction: post type is not included in url when editing or adding a term translation
+* Bug correction: various warnings and PHP notices
+
+= 1.2.3 (2013-11-17) =
+
+* Avoid fatal error when upgrading with Nextgen Gallery active
+* Bug correction: menus locations of non default language are lost at theme deactivation
+* Bug correction: impossible to set menus locations of non default language in some specific cases
+* Bug correction: bbpress admin is broken
+
+= 1.2.2 (2013-11-14) =
+
+* Updated Polish translation thanks to [Bartosz](http://www.dfactory.eu/)
+* Delay strings translations upgrade from 'wp_loaded' to 'admin_init' to avoid fatal error when wp-ecommerce is active
+* Remove Jetpack infinite scroll compatibility code as it seems useless with new Polylang 1.2 code structure
+* Bug correction: fatal error when doing ajax on frontend
+* Bug correction: ICL_LANGUAGE_CODE incorrectly defined when doing ajax on frontend
+* Bug correction: ['current_lang'] and ['no-translation'] indexes disappeared from pll_the_languages raw output
+* Bug correction: invalid argument supplied for foreach() in /polylang/include/mo.php on line 57
+* Bug correction: cookie may not be correctly set
+* Bug correction: languages columns may not be displayed in custom post types and custom taxonomies tables
+
+= 1.2.1 (2013-11-11) =
+
+* Update badly encoded Latvian translation
+* Suppress one query in PLL_WPML_Config when not in multisite
+* Bug correction: strings translations are not correctly upgraded
+* Bug correction: nav menus locations are not correctly upgraded for non default language
+
+= 1.2 (2013-11-10) =
+
+This version does include important changes in database. More than ever, make a database backup before upgrading
+
+* Add Arabic translation contributed by [Anas Sulaiman](http://ahs.pw/)
+* Major rewrite with new structure
+* Change the language and translations model from meta to taxonomy (no extra termmeta table created anymore)
+* Move the strings translations from option to a custom post type
+* Add support for language code in subdomain and for one different domain per language (experimental)
+* Add support of WordPress Importer plugin. Export must have been done with Polylang 1.2+ (experimental)
+* Add support for theme navigation customizer (was de-activated by Polylang since WP 3.4)
+* Request confirmation for deleting a language
+* Better management of default category for each language
+* Now check if date and post type archives are translated before displaying the language switcher
+* Update management of the 'copy' action of the custom fields section in wpml-config.xml
+* Add support for ICL_LANGUAGE_CODE and ICL_LANGUAGE_NAME of the WPML API on admin side
+* Add support of WPSEO custom strings translations when the language is set from content
+* Modify admin language filter for valid html and better visibility
+* Synchronization is now disabled by default (due to too much conflicts / questions on the forum)
+* Include rel="alternate" hreflang="x" selflink per google recommendation
+* Improve inline documentation
+* Bug correction: wrong datatype for second argument in polylang/include/auto-translate.php (introduced in 1.1.6)
+* Bug correction: same id is used for all language items in menu
+* Bug correction: wpml-config.xml file not loaded for sitewide active plugins on network installations
+* Bug correction: page parent dropdown list (in page attributes metabox) not correctly displayed when switching from a language with empty list
+
+= 1.1.6 (2013-10-13) =
+
+* Add the possibility to display the upgrade notice on plugins page
+* Bug correction: Illegal string offset 'taxonomy' in polylang/include/auto-translate.php
+* Bug correction: user defined strings translations are not loaded on admin side
+* Bug correction: untranslated post types are auto translated
+* Bug correction: tags are not added to post when the name exists in several languages and they are not translations of each other
+
+= 1.1.5 (2013-09-15) =
+
+* Add compatibility with Aqua Resizer (often used in porfolio themes)
+* Add support of 'icl_get_default_language' function from the WPML API
+* Remove the 3 characters limitation for the language code
+* Change default names for zh_CN, zh_HK, zh_TW
+* Bug correction: urls are modified in search forms
+
+= 1.1.4 (2013-08-16) =
+
+* Add simplified Chinese language contributed by [Changmeng Hu](http://www.wpdaxue.com)
+* Add Indonesian language contributed by [ajoull](http://www.ajoull.com/)
+* Bug correction: nav menu locations are lost when using the admin language filter
+* Bug correction: the cookie is not set when adding the language code to all urls (introduced in 1.1.3)
+
+= 1.1.3 (2013-07-21) =
+
+* Add Venetian language contributed by Michele Brunelli
+* Bug correction: wrong rewrite rules for non translated custom post type archives
+* Bug correction: 'post_id' parameter of pll_the_languages does not work
+* Bug correction: warning in wp_nav_menu_objects with Artisteer generated themes
+* Bug correction: warning when used together with theme my login plugin
+* Bug correction: language slug is modified and translations are lost when creating a nav menu with the same name as a language
+
+= 1.1.2 (2013-06-18) =
+
+* Posts and terms now inherit parent's language if created outside the standard WordPress ui
+* Improve the compatibility with the plugins Types and The Events Calendar, and again with WordPress SEO
+* Improve performance
+* Improve html validation
+* Add 'raw' argument to 'pll_the_languages'
+* Add the filter 'pll_translation_url'
+* Bug correction: no language is set for a (translated custom taxonomy) term when added from a (non translated) custom post type edit page
+* Bug correction: warning if 'get_terms' is called with a non-array 'include' argument (introduced in 1.1.1)
+* Bug correction: warning if the menu language switcher has nothing to display
+
+= 1.1.1 (2013-05-20) =
+
+* Move nav menu language switcher split from 'wp_nav_menu_objects' to 'wp_get_nav_menu_items' filter
+* Add the filter 'pll_redirect_home'
+* Automatically translate ids in 'include' argument of 'get_terms' (useful for the menus in the Suffusion theme)
+* Add compatibility with Jetpack infinite scroll
+* Bug correction: rtl text direction not set when adding the language code to all urls (introduced in 1.1)
+* Bug correction: hide again navigation panel in theme customizer as it still doesn't work
+* Bug correction: is_home not set on translated page when searching an empty string
+* Bug correction: fatal error when creating a post or term from frontend (introduced in 1.1)
+* Bug correction: attachments may load a wrong language when media translation was enabled then disabled
+* Bug correction: warning when querying posts before the action 'wp_loaded' has been fired (in auto-translate.php)
+* Bug correction: potential issue if other plugins use the filter 'get_nav_menu'
+* Bug correction: interference between language inline edit and search in admin list tables
+* Bug correction: auto-translate breaks queries tax_query when the 'field' is set to 'id'
+* Bug correction: search is not filtered by language for default permalinks (introduced in 1.1)
+* Tests done with WP 3.6 beta 3 and Twenty thirteen
+
+= 1.1 (2013-05-10) =
+
+* When adding the language to all urls, the language is now defined in (plugins_loaded, 1) for better compatibility with some plugins (WordPress SEO)
+* When querying posts and terms, ids are now automatically translated
+* Add the possibility to group string translations
+* Add the possibility to delete strings registered with 'icl_register_string'
+* Move the option 'polylang_widgets' in general polylang options
+* Better integration of the multilingual nav menus (everything is now integrated in the menus page of WordPress
+* The language switcher is now a menu item which can be placed everywhere in a nav menu
+* Posts or terms created from frontend are now assigned the current language (or another one if specified in the variable 'lang')
+* Bug correction: continents-cities-xx_XX.mo not downloaded
+* Bug correction: a gzipped 404 page is downloaded when a mo file does not exist on WordPress languages files repository
+* Bug correction: post_date_gmt not synchronized together with post_date
+* Tests done with WP 3.6 beta 2 and Twenty thirteen
+
+= 1.0.4 (2013-04-08) =
+
+* Add Estonian translation contributed by [Ahto Naris](http://profiles.wordpress.org/ahtonaris/)
+* Now compatible with languages files stored in wp-content/languages/themes
+* Bug correction: page preview does not work when adding the language code to all urls
+* Bug correction: error when a post type or taxonomy label is not a string
+* Bug correction: admin text section of wpml-config.xml (introduced in 1.0.3)
+* Bug correction: infinite redirect loop when querying an unattached media and the language code is added to all urls
+* Bug correction: the text direction is not set from Polylang options when the language code is added to all urls
+* Bug correction: get_adjacent_post is filtered by language even for post types without language
+* Bug correction: the home url is not not in the correct language in wp-login.php
+* Bug correction: the language is not correctly set when using date and name permalinks (introduced in 1.0.3)
+
+= 1.0.3 (2013-03-17) =
+
+* Add Catalan translation contributed by [Núria Martínez Berenguer](http://nuriamb.capa.webfactional.com)
+* Add Ukrainian translation contributed by [cmd soft](http://www.cmd-soft.com/)
+* Improve compatibility with WordPress SEO (sitemap for categories and tags)
+* A query is no more filtered by language when setting the parameter 'lang' to an empty value
+* Add the possibility to create a custom wpml-config.xml file in wp-content/polylang/
+* Bug correction: custom menus are not displayed on search page (introduced in 1.0.2)
+* Bug correction: sql error when filtering terms by language (introduced in 1.0.2)
+* Bug correction: SSL doesn't work properly
+* Bug correction: php notice on IIS servers
+* Bug correction: clicking on the radio buttons in the admin language switcher does not work in Chrome
+* Bug correction: on multisite, the signup page is redirected to the home page
+* Bug correction: date archives are not correctly filtered for the default language when hiding the language code and using date and name permalinks
+* Bug correction: only one wpml-config.xml file is parsed
+
+= 1.0.2 (2013-02-26) =
+
+* Add the possibility to query comments by language
+* Add the possibility not to set a cookie by defining PLL_COOKIE to false (Polylang may not work as expected on some pages)
+* Now a returning visitor is redirected to its preferred language when visiting the front page in the default language
+* Add compatibility with the plugin Custom field template (copy and synchronize custom fields)
+* Improve compatibility with plugins or themes which overwrite columns in posts list table
+* Add the filter 'pll_get_flag'
+* Add support of 'icl_unregister_string' function from the WPML API
+* Bug correction: synchronizing custom fields breaks the plugin Advanced Custom Fields
+* Bug correction: 'pll_default_language' broken
+* Bug correction: rewrite rules are not flushed when re-activating the plugin
+* Bug correction: feed urls are not correctly escaped when using default permalinks
+* Bug correction: notice Undefined index: media_support
+* Bug correction: custom post types and taxonomies set in wpml-config.xml are not hidden
+* Bug correction: get_terms cannot query multiple languages
+* Bug correction: 'icl_register_string' is now persistent as in WPML (fixes Nextgen gallery translations which were not working)
+
+= 1.0.1 (2013-01-28) =
+
+* Add Swedish translation contributed by [matsii](http://wordpress.org/support/profile/matsii)
+* Add 2 new API functions : 'pll_is_translated_post_type' and 'pll_is_translated_taxonomy'
+* Bug correction: when using a static front page, the posts page is not filtered by language (introduced in 1.0)
+* Bug correction: disable translation for hard coded menu as it creates more problems than it solves (introduced in 1.0)
+
+= 1.0 (2013-01-24) =
+
+* Add Hungarian translation contributed by Csaba Erdei
+* Add Norwegian translation contributed by [Tom Boersma](http://www.oransje.com/)
+* Add Slovak translation contributed by [Branco (WebHostingGeeks.com)](http://webhostinggeeks.com/user-reviews/)
+* Code cleaning -> remove compatibility with versions older than 0.8
+* Add search in the string translations list table
+* Add options to better control the synchronization of various metas for posts
+* It is now possible to synchronize sticky posts and publication dates
+* Add option to disable the multilingual support of media
+* Add options to better control the multilingual capability of custom post types and taxonomies
+* Better integration with new media management in WP 3.5
+* Improve menu translation for themes which register a theme location but don't use it in wp_nav_menu (hard coded menu)
+* Add the pll_preferred_language filter allowing plugins to modify the language set by browser preferences detection
+* Add support of the WPML config file
+* Add support of 'icl_get_languages' and 'icl_link_to_element' functions from the WPML API
+* Add compatibility with YARPP and improve compatibility with WordPress SEO
+* Change cookie name which conflicts with Quick cache and allow users to overwrite it by defining the constant PLL_COOKIE
+* Bug correction: again the canonical redirection
+* Bug correction: the languages are not correctly displayed after they have been modified using quick edit
+* Bug correction: undefined index notice when saving strings translation when the admin language filter is active
+* Bug correction: rewrite rules are not correctly flushed when adding / deleting a language (introduced in 0.9.2)
+* Bug correction: the list of pages is displayed when a static font page translation is not translated (now replaced by the list of posts)
+* Bug correction: permalinks are not modified when doing cron and the language code is added to all urls
+* Bug correction: creating a new term with the same name as a language may modify the language code (slug)
+
+= 0.9.8 (2012-12-05) =
+
+* Bug correction: ajax on frontend does not work when adding the language code to all urls
+* Bug correction: search forms using the get_search_form filter do not work
+
+= 0.9.7 (2012-12-04) =
+
+* Bug correction: the admin language filter does filter non translatable post types
+* Bug correction: again the canonical redirection
+* Bug correction: fatal error when Polylang is used together with 'Author Avatars List'
+* Bug correction: widget titles uselessly appear in the strings translations table when the widget is set for only one language
+* Tests done with WordPress 3.5 RC3 and Twenty Twelve
+
+= 0.9.6 (2012-11-26) =
+
+* It is now possible to query the terms by language using the WordPress function 'get_terms'
+* Bug correction: search for empty string in default language displays posts in all languages when hiding the URL language information for default language
+* Bug correction: completely reworked the canonical redirection introduced in 0.9.5 which created more problems than it solved
+* Bug correction: ajax for media translations does not work
+* Started tests with WordPress 3.5 RC1 and Twenty Twelve
+
+= 0.9.5 (2012-11-13) =
+
+* The user can now choose the number of languages and strings translations to display
+* Add compatibility with the 'icl_object_id' function and ICL_LANGUAGE_CODE and ICL_LANGUAGE_NAME constants from the WPML API
+* Add 17 languages to the predefined list (automatic download and update of language files won't work)
+* Bug correction: post preview does not work when adding the language code to all urls
+* Bug correction: redirect to front page in default language when posting a comment on static front page
+* Bug correction: impossible to create terms with the same name in different languages
+* Bug correction: query string added by other plugins is erased when adding the language code to all urls
+* Bug correction: redirect erase 'POST' variables on homepage when adding the language code to all urls
+* Bug correction: English (en_US) loads rtl style when using a localized WordPress package with an rtl language
+* Bug correction: on some installation strings translations do not work with some special characters
+* Bug correction: incoming links are not redirected to canonical url when adding the language code to all urls and hiding the code for the default language
+* Bug correction: search form does not work in non default language when using permalinks without trailing slash
+
+= 0.9.4 (2012-10-23) =
+
+* Add Afrikaans translation contributed by [Kobus Joubert](http://translate3d.com/)
+* Add Belarusian translation contributed by [Alexander Markevitch](http://fourfeathers.by/)
+* Add Afrikaans (af) and Belarusian (be_BY) to predefined languages list (automatic download and update of language files won't work)
+* Add the possibility to translate the date format and time format
+* Add compatibility with the 'icl_get_home_url' function from the WPML API
+* Bug correction: still some issues with string translations
+* Bug correction: search is not filtered by the (default) language when the language is set by content and the language code is hidden for the default language
+* Bug correction: posts & pages preview urls are broken when adding the language code to all urls
+* Bug correction: automatically added new top-level pages to menus are not filtered by language
+* Bug correction: the admin language filter messes the categories languages when editing a post and the parent dropdown list when editing a category
+* Bug correction: search form does not work when using a static front page (introduced in 0.9.2)
+* Bug correction: can't set languages for categories and post tags on blogs created after polylang has been activated at network level
+* Bug correction: menus don't work with catch box theme ('has_nav_menu' not correctly filtered)
+
+= 0.9.3 (2012-10-08) =
+
+* Add Bulgarian translation contributed by [pavelsof](http://wordpress.org/support/profile/pavelsof)
+* Add compatibility with WPML API for strings translations
+* Bug correction: dates are not translated (introduced in 0.9.2)
+* Bug correction: the language is lost when keeping - No change - for language in bulk edit
+* Bug correction: categories and tags are duplicate (when default language is set automatically to existing content and categories and tags share the same name)
+
+= 0.9.2 (2012-09-30) =
+
+* Support new WordPress (WP 3.5+) convention for js and css files naming
+* Improve performance, mainly on frontend
+* Bug correction: the category language is not set when creating it in the post editor (introduced in 0.9)
+* Bug correction: unable to add a query string when using a static front page
+* Bug correction: ajax tag suggestion in "edit post" conflicts with the admin content language filter
+* Bug correction: ugly notices when trying to access a static front page which has not been translated
+* Bug correction: the language code is added to custom post types and taxonomies permalinks even if they are not translatable
+* Bug correction: some arrays in wp_locale mix English and other language
+* Bug correction: the media language is not correctly set when uploading from post if the post has not been saved after choosing the language
+
+= 0.9.1 (2012-09-20) =
+
+* Add Finnish translation contributed by [Jani Alha](http://www.wysiwyg.fi)
+* Bug correction: improve the robustness of the admin content language filter
+* Bug correction: the language switcher displays languages which have no posts or pages (introduced in 0.9)
+* Bug correction: wrong default language when adding a new media
+* Bug correction: the dropdown language switcher does not switch language when there is no post translation
+* Bug correction: issue with translations when using category quick edit
+* Bug correction: home redirects to 404 when combining static front page + force_lang = 1 + hide_default = 0
+
+= 0.9 (2012-09-12) =
+
+* Add Turkish translation contributed by [darchws](http://darch.ws/)
+* Add media translation support
+* Add a persistent content language filter on admin side (WP 3.2+ required)
+* Add biographical info translation
+* Add multiline support for string translations
+* Add the possibility to clean the strings translation database
+* Add quick edit and bulk edit support for posts and pages
+* Add quick edit support for categories and tags
+* The language is now loaded with 'setup_theme' action instead of 'wp' action when always adding language information url
+* Search form now does use javascript only for searchform.php when pretty permalinks are not used
+* Add the option PLL_SEARCH_FORM_JS to disable the js code used to modify the search form
+* Suppress the option PLL_SYNC, replaced by an option in the language settings ui
+* Suppress the PLL_DISPLAY_ALL option
+* Suppress the template tag 'the_languages' (replaced by 'pll_the_languages' since v0.5)
+* Suppress the function 'pll_is_front_page' (useless since 0.8.2)
+* Bug correction: the browser language is sometimes not correctly detected by Android
+* Bug correction: the rtl text direction is not correct when editing an existing language
+* Bug correction: rss feed does not work if translated site title or tagline contains special characters
+* Bug correction: post types and taxonomies labels are not translated on frontend
+* Bug correction: the filter 'pll_copy_post_metas' does not work for metas with multiple values
+* Bug correction: translations table for post and terms are uselessly serialized two times
+* Bug correction: attempt to suppress conflict with themes which hardcode the name of nav menus (but do define a theme location)
+* Bug correction: homepage displays all posts when the front page displays a static page and no page is selected for front page (but one is selected for posts page)
+* Bug correction: widgets disappear when Polylang is enabled
+
+= 0.8.10 (2012-08-06) =
+
+* Add Lithuanian (lt_LT) to predefined languages list (automatic download and update of language files won't work)
+* Add Lithuanian translation contributed by [Naglis Jonaitis](http://najo.lt/)
+* Bug correction: empty string translation issue
+* Bug correction: 'wp_list_pages' does not filter custom post types
+* Bug correction: warning if posts are queried before the action 'wp_loaded' has been fired
+* Bug correction: notice in twentyten when requesting a date archive with no posts
+
+= 0.8.9 (2012-07-20) =
+
+* Add Portuguese translation contributed by [Vitor Carvalho](http://vcarvalho.com/)
+
+= 0.8.8 (2012-07-18) =
+
+* Validation improvement thanks to kg69design
+* Bug correction: custom post types rewrite rules are broken when registered with query_var=>false
+* Bug correction: user admin language not deleted when uninstalling the plugin
+* Bug correction: pll_current_language('name') returns locale instead of language name
+* Bug correction: ajax on frontend does not work
+* Bug correction: homepage pagination broken when redirecting the language page to a static front page
+* Bug correction: taxonomies conflicts on custom post types
+* Bug correction: the admin language is not updated when edited by other users
+
+= 0.8.7 (2012-06-10) =
+
+* Add the possibility to load Polylang API for ajax requests on frontend
+* Bug correction: search form is broken when using a static front page
+* Bug correction: admin bar search does not work
+* Tests done with WordPress 3.4 RC2
+
+= 0.8.6 (2012-05-23) =
+
+* Add the possibility to use a local config file to set options
+* Improve robustness (less PHP notices)
+* Bug correction: Menus not showing in preview mode
+* Bug correction: fatal error when customizing a theme in WP 3.4 beta 4
+* Bug correction: second page of search results returns 404 when using pretty permalinks
+
+= 0.8.5 (2012-05-14) =
+
+* Bug correction : sites using static front page are messed in v0.8.4
+
+= 0.8.4 (2012-05-13) =
+
+* Add a new argument 'post_id' to the function pll_the_languages to display posts translations within the loop
+* Bug correction: every posts in every languages are shown on the homepage when requesting the wrong one with or without 'www.'
+* Bug correction: every posts in every languages are shown when requesting /?p=string
+* Bug correction: the language is not correctly set for wp-signup.php and wp-activate.php
+* Bug correction: wrong home links when using permalinks with front with WP 3.3 and older
+* Bug correction: wrong redirection after posting a comment when adding the language information to all urls
+* Bug correction: term language may be lost in some situations
+* Bug correction: post language is set to default if updated outside the edit post page
+* Bug correction: javascript error in WP 3.1
+* Bug correction: can't toggle visibility of tags metabox in edit post panel
+* Tests done with WordPress 3.4 beta 4
+
+= 0.8.3 (2012-04-10) =
+
+* Add Danish translation contributed by [Compute](http://wordpress.org/support/profile/compute)
+* Add Spanish translation contributed by Curro
+* Add the possibility to add a content in a different language than the current one by setting explicitly the lang parameter in the secondary query
+* Add support of PATHINFO permalinks
+* Bug correction: secondary queries not correctly filtered by language
+* Bug correction: wrong archives links when using permalinks with front
+* Bug correction: wrong homepage link when keeping 'language' in permalinks with front
+* Bug correction: flush_rewrite_rules notice when setting up a static front page (introduced in 0.8.2)
+* Bug correction: every posts in every languages are shown when hitting the homepage with a query string unknown to WP (thanks to Gonçalo Peres)
+* Bug correction: every posts in every languages are shown on the homepage when PHP adds index.php to the url
+* Tests done with WordPress 3.4 beta 1
+
+
+= 0.8.2 (2012-03-20) =
+
+* Add Italian translation contributed by [Luca Barbetti](http://wordpress.org/support/profile/lucabarbetti)
+* Improve performance on admin side
+* Comment status and ping status are now copied when adding a new translation
+* Deprecated API function 'pll_is_front_page' as it is now useless
+* Bug correction: Wrong translation url for taxonomies when adding the language information to all urls
+* Bug correction: "translation" of search page does not work if the site is only made of pages
+* Bug correction: wrong language permalink structure introduced in 0.8.1
+* Bug correction: wrong language set when clicking on "add new" translation in edit category and edit tags panels
+* Bug correction: site does not display if no languages are set
+* Bug correction: get_author_posts_url is 404
+* Bug correction: homepage is 404 when using a static front page and adding the language information to all urls
+
+= 0.8.1 (2012-03-11) =
+
+* Add Latvian translation contributed by [@AndyDeGroo](http://twitter.com/AndyDeGroo)
+* It is now possible to synchronize multiple values for custom fields
+* Add new API function pll_current_language
+* Add the pll_rewrite_rules filter allowing plugins to filter rewrite rules by language
+* WP 3.4 preparation: disable the menu section in the customize theme admin panel (unusable with Polylang)
+* Bug correction: removing 'language' in permalinks does not work in WP 3.4 alpha
+* Bug correction: problems with custom post type archives when 'has_archive' is set (thanks to AndyDeGroo)
+* Bug correction: 404 error when combining %postname% permastructure with "Add language information to all URL" option
+* Bug correction: translated custom strings are duplicated if registered several times
+* Bug correction: queries with an array of post types are not correctly filtered
+* Bug correction: wp-login.php always in English
+
+= 0.8 (2012-02-29) =
+
+* Sticky posts are now filtered by language
+* It is now possible to use the language page as home page
+* Add an "About Polylang" metabox on the languages admin page
+* Add the pll_the_languages filter allowing to filter the whole output of the language switcher
+* Add a new argument 'display_names_as' to the function pll_the_languages
+* Add pll_get_post_types & pll_get_taxonomies filters allowing to enable / disable the language filter for post types & taxonomies
+* Add ckb to predefined languages list
+* Completely reworked the string translation storage in the database
+* Some performance improvements on admin side
+* Improve compatibility with other plugins broken by the home url filter
+* Add an option to disable the home url filter
+* Add an option to disable synchronization of metas between translations
+* Bug correction: body class 'home' is not set on translated homepage
+* Bug correction: robots.txt is broken when adding the language code to all urls (including default language)
+* Bug correction: bad name for the Czech flag
+* Bug correction: bad language information in rss feed for WP < 3.4
+* Bug correction: signup broken on multisite
+* Bug correction: the translation url is set to self when using a static front page and no page for posts and there is no translation
+* Bug correction: problems with custom post type archive titles
+* Bug correction: problems with custom post type if rewrite slug is different from post_type (thanks to AndyDeGroo)
+* Bug correction: quick edit still breaks translation linking of pages (thanks to AndyDeGroo)
+* Bug correction: bad rewrite rules for feeds (introduced in 0.7.2)
+* Bug correction: the order is not saved when creating a language
+* Bug correction: the categories list is not updated when adding a new category (ajax broken)
+
+= 0.7.2 (2012-02-15) =
+
+* Add Polish translation contributed by [Peter Paciorkiewicz](http://www.paciorkiewicz.pl)
+* Add 5 new languages to predefined list
+* completely reworked rewrite rules
+* WP 3.4 preparation: add new WordPress languages files to download when creating a new language
+* Bug correction: custom nav menus do not work in Artisteer generated themes
+* Bug correction: having a single language causes multiple warnings while saving post/page.
+* Bug correction: custom nav menu broken on archives pages
+* Bug correction: the language switcher does not link to translated post type archive when using pretty permalinks
+* Bug correction: the tags are not saved in the right language when translated tags have the same name
+* Bug correction: bad link in post preview when adding language code to all urls
+* Bug correction: feed not filtered by language when adding language code to all urls
+* Bug correction: duplicate canonical link when used together with WordPress SEO by Yoast
+* Bug correction: the all posts admin page is messed if another plugin adds a column
+* Bug correction: 404 error on static front page when adding language code to all urls (including default language)
+
+= 0.7.1 (2012-02-06) =
+
+* Allow using 3 characters languages codes (ISO 639-2 or 639-3)
+* The predefined languages dropdown list now displays the locale to help differentiate some languages
+* Add 5 new languages to predefined list
+* Bug correction: the filter 'pll_copy_post_metas' does not work
+* Bug correction: impossible to add a tag in the edit post panel
+* Bug correction: rewrite rules not correct
+* Bug correction: cache issue with css and js files
+
+= 0.7 (2012-01-30) =
+
+* Add Hebrew translation contributed by [ArielK](http://www.arielk.net)
+* Add support for RTL languages for both frontend and admin
+* Twenty Ten and Twenty Eleven languages files are now automatically downloaded when creating a new language
+* Improve filtering tags by language in the edit post panel
+* Category parent dropdown list is now filtered by language
+* Category parents are now synchronized between translations
+* Add the possibility to have the language information in all URL
+* Add support for post formats
+* Add option allowing not to show the current language in the language switcher (for both menu and widget)
+* Add a title attribute (and the possibility to personalize it with a filter) to flags
+* pll_get_post and pll_get_term second parameter is now optional and defaults to current language
+* Add pll_the_language_link filter allowing to filter translation links outputted by the language switcher
+* The option PLL_DISPLAY_ALL is no longer supported
+* Bug correction: Autosave reset to default language
+* Bug correction: blog info not translated in feeds
+* Bug correction: post comments feed always in default language
+* Bug correction: undefined index notice when setting up a custom menu widget
+* Bug correction: rewrite rules are not correctly reset when deactivating the plugin
+* Bug correction: is_home not correctly set on pages 2, 3...
+* Bug correction: avoid naming conflicts (in sql queries) with other themes / plugins
+* Bug correction: bad language detection and url rewriting of custom post types archives
+
+= 0.6.1 (2012-01-12) =
+
+* Add Dutch translation contributed by [AlbertGn](http://wordpress.org/support/profile/albertgn)
+* Disable everything except the languages management panel while no language has been created
+* Bug correction: can't have the same featured image in translated posts
+* Bug correction: parent page dropdown does appear only after the page has been saved
+* Bug correction: archives widget not working anymore
+* Bug correction: string translations does not work for WP < 3.3
+* Bug correction: fix fatal error in string translations caused by widgets using the old API
+* Bug correction: the strings translation panel is unable to translate strings with special characters
+* Bug correction: Polylang "is_front_page" returns true on archives pages
+
+= 0.6 (2012-01-07) =
+
+* Add Greek translation contributed by [theodotos](http://www.ubuntucy.org)
+* WordPress languages files are now automatically downloaded when creating a new language (and updated when updating WordPress)
+* Add the possibility to change the order of the languages in the language switcher
+* Add the possibility to translate the site title, tagline and widgets titles
+* Categories, post tags, featured image, page parent, page template and menu order are now copied when adding a new translation
+* Translations are now accessibles in the "Posts", "Pages", "Categories" and "Post tags" admin panels
+* Improve the dropdown language switcher widget (sends now to translated page or home page based on options)
+* Move custom flags from polylang/local_flags to wp_content/polylang
+* Add two options to "pll_the_languages" ('hide_if_no_translation' and 'hide_current'). *The function does not output ul tag anymore*
+* Improve API
+* Bug correction: Twenty eleven custom Header problem with v0.5.1
+* Bug correction: front-page.php not loaded for translated front page
+
+= 0.5.1 (2011-12-18) =
+
+* Improved German translation contributed by [Christian Ries](http://www.singbyfoot.lu)
+* Bug correction: translated homepage not recognized as home page when it displays posts
+* Bug correction: predefined language list does not work on IE8
+* Bug correction: on some installations, "Add New" post doesn't keep intended language
+* Bug correction: fatal error when Polylang is used together with the plugin Tabbed Widgets
+* Bug correction: language Switcher points sometimes to wrong places
+
+= 0.5 (2011-12-07) =
+
+* Add multisite support
+* Rework the Polylang admin panel. There is now a set of predefined languages
+* Improve categories and tags language filter in the edit post panel
+* Categories and tags created in the edit post panel are now created with the same language as the post
+* The language switcher can now force the link to the front page instead of the translated page
+* The nav menus can now display a language switcher
+* Improved performance
+* Optimized the calendar widget (less code and sql queries executed)
+* Added the possibility to display posts and terms with no language set (see the documentation to know how to enable this functionality)
+* Started the creation of a small API for theme and plugin programmers
+* Bug correction: when using a static front page, the page for posts does not work when using the default permalink settings
+* Bug correction: the search form does not work if a static front page is used
+* Bug correction: quick edit breaks translations
+* Bug correction: categories and post tags translations don't work for more than 2 languages
+* Bug correction: the output of wp_page_menu is not correct for non default languages
+
+= 0.4.4 (2011-11-28) =
+
+* Bug correction: When using a static front page, the translated home page displays posts instead of the translated page
+* Bug correction: Automatic language setting of existing categories and post tags does not work correctly
+
+= 0.4.3 (2011-11-19) =
+
+* Add Russian translation contributed by [yoyurec](http://yoyurec.in.ua)
+* Bug correction: impossible to suppress the language name in the language switcher widget settings
+* Bug correction: post's page does not work when using a static front page
+* Bug correction: flags in local_flags directory are removed after an automatic upgrade (now works for an upgrade from 0.4.3+ to a higher version)
+* Bug correction: switching to default language displays a 404 Error when hiding the default language in url and displaying the language switcher as dropdown
+* Other minor bug corrections
+* Tests done with WordPress 3.3 beta 3
+
+= 0.4.2 (2011-11-16) =
+
+* Bug correction: language settings page is broken in v0.4.1
+
+= 0.4.1 (2011-11-16) =
+
+* Bug correction: flags shows even when you set doesn't to show
+* Bug correction: custom taxonomies do not work
+* Bug correction: some users get the fatal error: call to undefined function wp_get_current_user() in /wp-includes/user.php on line 227
+
+= 0.4 (2011-11-10) =
+
+* Add a documentation (in English only)
+* Add the possibility to hide the url language information for the default language
+* Add the possibility to set the admin language in the user profile
+* Add the possibility to fill existing posts, pages, categories & tags with the default language
+* Add support for custom post types and custom taxonomies
+* Add the possibility to display flags in the language switcher
+* Add CSS classes to customize rendering of the language switcher
+* Add the possibility to display the language switcher as a dropdown list
+* Add support for calendar widget
+* Improve performance: less sql queries
+* Improve data validation when creating or updating languages
+* Bug correction: 'wp_list_pages' page order is ignored when the plugin is enabled
+* Bug correction: when using 'edit' or 'add new' (translation) for posts, the categories appear in the wrong language
+* Bug correction: pages are not included in language post count
+* Bug correction: the language switcher does not display languages if there are only pages
+* Bug correction: the widget filter does not allow to come back to 'all languages' once a language has been set
+* Other minor bug corrections
+
+= 0.3.2 (2011-10-20) =
+
+* Bug correction: authors pages are not filtered by language
+* Bug correction: language pages use the archive template
+* Bug correction: database error for comments on posts and pages
+* Bug correction: "Add new" translation for pages creates a post instead of a page
+* Bug correction: the search query does not look into pages
+
+= 0.3.1 (2011-10-16) =
+
+* Bug correction: the widget settings cannot be saved when activating Polylang
+* Bug correction: the archives widget does not display any links
+* Bug correction: ajax form for translations not working in the 'Categories' and 'Post tags' admin panels
+
+= 0.3 (2011-10-07) =
+
+* Add language filter for widgets
+* Improved performance for filtering pages by language
+* Improved security
+* Minor bug correction with versions management
+
+= 0.2 (2011-10-05) =
+
+* Add language filter for nav menus
+* Add German translation
+* Add language filter for recent comments
+* Add ajax to term edit form
+* Add ajax to post metabox
+* Improved performance for filtering terms by language
+* Bugs correction
+
+= 0.1 (2011-09-22) =
+* Initial release
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/admin.css b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/admin.css
new file mode 100644
index 000000000..d71aad602
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/admin.css
@@ -0,0 +1,459 @@
+/* languages admin panel */
+#add-lang select {
+ width: 95%;
+}
+
+#add-lang label {
+ margin: 0.35em 0 0.5em;
+}
+
+.pll-legend {
+ display: block;
+ padding: 2px 0;
+ color: #1d2327;
+ font-weight: 400;
+ text-shadow: none;
+ margin: 0.35em 0 0.5em;
+}
+
+.column-locale,
+.languages .column-slug {
+ width : 15%
+}
+
+.column-default_lang {
+ width : 5%;
+}
+
+.column-term_group,
+.column-flag, .column-count {
+ width : 10%;
+}
+
+td.column-default_lang .icon-default-lang:before,
+.pll-wizard-content .icon-default-lang:before {
+ font-family: 'dashicons';
+ content: "\f155";
+}
+
+.pll-icon:before{
+ display: inline-block;
+ text-align: left;
+ width: 15px;
+}
+.pll-circle:before{
+ content: "\25cf";
+}
+
+/* about Polylang metabox */
+#pll-about-box p,
+#pll-recommended p {
+ text-align: justify;
+}
+
+#pll-about-box input {
+ margin: 0;
+ padding: 0;
+ float: right;
+}
+
+/* strings translation table */
+.stringstranslations .column-name,
+.stringstranslations .column-context {
+ width: 10%;
+}
+
+.stringstranslations .column-string {
+ width: 33%;
+}
+
+.translation label {
+ display: inline-block;
+ width: 23%;
+ vertical-align: top;
+}
+
+.translation {
+ display: flex; /* fix #691 to remove default margin bottom */
+}
+@media screen and (max-width: 782px) { /* reset default display property for small device */
+ .translation{
+ display: block;
+ }
+}
+.translation textarea{
+ display: block; /* fix #691 to remove default margin bottom */
+}
+.translation input,
+.translation textarea {
+ width: 72%;
+ box-sizing: border-box; /* to be sure field don't overrun outside their wrapper */
+ margin-bottom: 4px; /* fix #691 set the same margin bottom for both textarea and input tags */
+}
+
+/* settings */
+.pll-settings {
+ margin-top: 20px;
+}
+
+.pll-settings .plugin-title {
+ width: 25%;
+}
+
+#wpbody-content .pll-settings .pll-configure tr {
+ display: table-row;
+}
+
+#wpbody-content .pll-settings .pll-configure td {
+ display: table-cell;
+}
+
+#wpbody-content .pll-settings .pll-configure > td {
+ padding: 20px 20px 20px 40px;
+}
+
+.pll-configure legend {
+ font-size: 14px;
+ font-weight: 600;
+ margin-bottom: 0.5em;
+}
+
+.pll-configure td .description {
+ margin-top: 2px;
+ margin-bottom: 0.5em;
+}
+
+.pll-configure p.submit {
+ margin-top: 20px;
+}
+
+.pll-configure .button {
+ margin-right: 20px;
+}
+
+.pll-configure fieldset {
+ margin-bottom: 1.5em;
+}
+
+.pll-inline-block-list {
+ margin: 0;
+}
+
+.pll-inline-block-list li {
+ display: inline-block;
+ margin: 0;
+ width: 250px;
+}
+
+/* settings URL modifications */
+#pll-domains-table td {
+ padding: 2px 2px 2px 1.5em;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: none;
+}
+
+.pll-settings-url-col {
+ display: inline-block;
+ width: 49%;
+ vertical-align: top;
+}
+
+/* settings Activation keys */
+.pll-table-top td {
+ vertical-align: top;
+}
+
+#pll-licenses-table label {
+ font-size: 1em;
+ font-weight: 600;
+}
+
+.pll-configure .pll-deactivate-license {
+ margin: 0 0 0 20px;
+}
+
+/* language columns in edit.php and edit-tags.php */
+.wp-list-table th[class*='column-language_'],
+.wp-list-table td[class*='column-language_'] {
+ width: 1.5em;
+ box-sizing: content-box; /* Override ACF 5.9.0 styles */
+}
+
+/* Text direction in post.php and edit-tags.php */
+.pll-dir-rtl textarea,
+.pll-dir-rtl input[type="text"] {
+ direction: rtl;
+}
+
+.pll-dir-ltr textarea,
+.pll-dir-ltr input[type="text"] {
+ direction: ltr;
+}
+
+.pll-dir-ltr .tr_lang,
+.pll-dir-rtl .tr_lang {
+ direction: inherit;
+}
+
+/* languages metabox in post.php */
+#ml_box p {
+ margin-top: 1em;
+}
+
+#post-translations p {
+ float: left;
+ margin-top: 1em;
+}
+
+.rtl #post-translations p {
+ float: right;
+}
+
+#post-translations table {
+ table-layout: fixed;
+ width: 100%;
+ clear: both;
+}
+
+#post-translations a {
+ text-decoration: none;
+}
+
+#post-translations .pll-language-column,
+#post-translations .pll-column-icon {
+ width: 20px;
+}
+
+#post-translations .tr_lang {
+ width: 100%;
+}
+
+#post-translations td {
+ padding: 2px;
+}
+
+#post-translations .spinner,
+#term-translations .spinner {
+ float: none;
+ margin: 0;
+ background-position: center;
+ width: auto;
+}
+
+#select-post-language .pll-select-flag {
+ padding: 4px;
+ margin-right: 10px;
+}
+
+.rtl #select-post-language .pll-select-flag {
+ padding: 4px;
+ margin-right: 0px;
+ margin-left: 10px;
+}
+
+/* specific cases for media */
+#select-media-language .pll-select-flag {
+ padding: 4px;
+ margin-right: 10px;
+}
+
+.pll-media-edit-column {
+ float: right;
+}
+
+/* language and translations in edit-tags.php */
+.pll-translation-flag { /* also for media */
+ margin-right: 14px;
+}
+
+#select-add-term-language .pll-select-flag {
+ padding: 11px;
+ margin-right: 13px;
+}
+
+#select-edit-term-language .pll-select-flag {
+ padding: 11px;
+ margin-right: 4px;
+}
+
+#term-translations p {
+ /* same style as label */
+ font-weight: 400;
+ font-style: normal;
+ padding: 2px;
+ color: #23282d;
+}
+
+#add-term-translations,
+#edit-term-translations {
+ width: 95%;
+}
+
+#term-translations .pll-language-column {
+ line-height: 28px;
+ width: 20%;
+}
+
+#term-translations .pll-edit-column,
+#add-term-translations .pll-language-column {
+ width: 20px;
+}
+
+#edit-term-translations .pll-language-column {
+ padding: 15px 10px;
+ font-weight: normal;
+}
+
+/* icon fonts */
+.pll_icon_add:before {
+ content: "\f132";
+}
+
+.pll_icon_edit:before {
+ content: "\f464";
+}
+
+[class^="pll_icon_"] {
+ font: 20px/1 'dashicons';
+ vertical-align: middle;
+}
+
+/* admin bar */
+#wpadminbar #wp-admin-bar-languages .ab-item img {
+ margin: 0 8px 0 2px;
+}
+
+#wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon {
+ float: none;
+ top: 4px;
+}
+
+#wpadminbar #wp-admin-bar-languages .ab-icon:before {
+ content: "\f326";
+ top: 1px;
+}
+
+#wp-admin-bar-languages.pll-filtered-languages {
+ background: #a03f3f;
+}
+
+#wpadminbar #wp-admin-bar-languages.pll-filtered-languages span.ab-label{ /* Enforce white color for WordPress admin light theme. */
+ color: #fff;
+}
+
+/* Notices */
+.pll-notice.notice {
+ padding-right: 38px;
+ position: relative;
+}
+
+.pll-notice a.notice-dismiss {
+ text-decoration: none;
+}
+
+.pll-notice .button {
+ margin-right: 10px;
+}
+
+@media screen and ( max-width: 782px ) {
+ /* settings */
+ #wpbody-content .pll-settings .pll-configure > td {
+ padding: 20px;
+ }
+
+ #wpbody-content .pll-settings #cb {
+ padding: 20px 9px;
+ }
+
+ /* settings URL modifications */
+ .pll-inline-block {
+ width: auto;
+ }
+
+ .pll-settings-url-col {
+ display: block;
+ width: 100%;
+ }
+
+ /* settings licenses */
+ #wpbody-content .pll-settings #pll-licenses-table td {
+ display: block;
+ }
+
+ .pll-configure .pll-deactivate-license {
+ margin: 10px 0 5px;
+ }
+
+ /* strings translations table */
+ .translation label {
+ display: block;
+ width: 95%;
+ padding-left: 0;
+ }
+
+ .translation input,
+ .translation textarea {
+ width: 95%;
+ }
+
+ /* hide selected language flag and translations language name */
+ #select-add-term-language .pll-select-flag,
+ #select-edit-term-language .pll-select-flag,
+ #edit-term-translations .pll-language-name {
+ display: none;
+ }
+
+ #edit-term-translations {
+ width: 100%;
+ }
+
+ #add-term-translations .pll-language-column {
+ line-height: 38px;
+ }
+
+ #edit-term-translations td {
+ padding: 8px 10px;
+ }
+
+ #edit-term-translations .pll-language-column,
+ #edit-term-translations .pll-edit-column {
+ width: 20px;
+ }
+
+ /* translations tables should be kept as table */
+ .term-translations .pll-language-column,
+ .term-translations .pll-edit-column,
+ .term-translations .pll-translation-column {
+ display: table-cell;
+ }
+
+ .term-translations .hidden {
+ display: none;
+ }
+
+ /* admin bar */
+ #wpadminbar #wp-admin-bar-languages {
+ display: block; /*shows our menu on mobile devices */
+ }
+
+ #wpadminbar #wp-admin-bar-languages > .ab-item {
+ width: 50px;
+ text-align: center;
+ }
+
+ #wpadminbar #wp-admin-bar-languages > .ab-item .ab-icon:before {
+ font: 32px/1 'dashicons';
+ top: -1px;
+ }
+
+ #wpadminbar #wp-admin-bar-languages > .ab-item img {
+ margin: 19px 0;
+ }
+
+ #wpadminbar #wp-admin-bar-languages #wp-admin-bar-all .ab-item .ab-icon {
+ margin-right: 6px;
+ font-size: 20px !important;
+ line-height: 20px !important;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/dialog.css b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/dialog.css
new file mode 100644
index 000000000..103d15af1
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/dialog.css
@@ -0,0 +1,85 @@
+/* By default Polylang dialog box use WordPress jQuery UI dialog styles.
+ However WooCommerce loads its own jQuery UI dialog styles and we need to override them by ours
+ to revert to the default WordPress ones.
+*/
+.pll-confirmation-modal.ui-widget,
+.pll-confirmation-modal.ui-widget .ui-widget,
+.pll-confirmation-modal .ui-widget {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 13px;
+}
+.pll-confirmation-modal.ui-dialog {
+ padding: 0;
+ z-index: 100102;
+ background: #fff;
+ border: 0;
+ color: #444;
+ border-radius: 0; /* Override WooCommerce dialog styles - jQuery UI 1.11.4 - WP < 5.6 */
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-titlebar {
+ background: #fcfcfc;
+ border-radius: 0;
+ border: 0;
+ border-bottom: 1px solid #dfdfdf;
+ height: 36px;
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 2;
+ padding: 0 36px 0 16px;
+ color: #444;
+ position: static;
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-title {
+ float: none;
+ width: auto;
+ margin: 0;
+}
+.pll-confirmation-modal .ui-widget-header .ui-icon {
+ background: none;
+ position: static;
+}
+.pll-confirmation-modal .ui-button.ui-dialog-titlebar-close {
+ padding: 0;
+ margin: 0;
+ top: 0;
+ right: 0;
+ width: 36px;
+ height: 36px;
+ border: 0; /* Override WooCommerce dialog styles - jQuery UI 1.11.4 - WP < 5.6 */
+ background: none; /* Override WooCommerce dialog styles - jQuery UI 1.11.4 - WP < 5.6 */
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-content {
+ border: 0;
+ padding: 16px;
+ color: #444;
+ position: static;
+ box-sizing: border-box;
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-buttonpane{
+ margin: 0;
+ padding: 16px;
+ border: 0;
+ background: #fcfcfc;
+ border-top: 1px solid #dfdfdf;
+}
+.ui-dialog.pll-confirmation-modal .ui-dialog-buttonpane .ui-button{
+ margin: 0 0 0 16px;
+ padding: 0 10px 1px;
+ background: #f7f7f7;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ position: static;
+ line-height: 2;
+ vertical-align: top;
+}
+.ui-dialog.pll-confirmation-modal .ui-button:hover,
+.ui-dialog.pll-confirmation-modal .ui-button:focus {
+ background: #fafafa;
+ border-color: #999;
+ color: #23282d;
+}
+.pll-confirmation-modal + .ui-widget-overlay {
+ background: #000;
+ opacity: 0.7;
+ z-index: 100101;
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/selectmenu.css b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/selectmenu.css
new file mode 100644
index 000000000..6040faa26
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/css/src/selectmenu.css
@@ -0,0 +1,239 @@
+/* Greatly modified version of the jquery-ui.css */
+
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+
+.ui-menu .ui-menu {
+ position: absolute;
+}
+
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+
+/* for jQuery UI 1.12 which introduces a wrapper */
+.ui-menu .ui-menu-item:not([role]) {
+ padding: 0;
+}
+
+.ui-menu-item-wrapper {
+ padding: 3px 1em 3px 2em;
+}
+.rtl .ui-menu .ui-menu-item {
+ text-align: right;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+
+.ui-menu-icons .ui-menu-item[role] {
+ padding-left: 2em;
+}
+
+.rtl .ui-menu-item-wrapper, /* for jQuery UI 1.12 which introduces a wrapper */
+.rtl .ui-menu-icons .ui-menu-item[role] {
+ padding-left: 1em;
+ padding-right: 2em;
+}
+
+/* left-aligned */
+.ui-selectmenu-text .ui-icon,
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .3em;
+ margin: auto 0;
+}
+
+.rtl .ui-selectmenu-text .ui-icon,
+.rtl .ui-menu .ui-icon {
+ right: .3em;
+ left: auto;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 23px;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+
+.ui-selectmenu-open {
+ display: block;
+}
+
+.ui-selectmenu-button, /* jQuery UI 1.11.4 - WP < 5.6 */
+.ui-selectmenu-button.ui-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ box-sizing: border-box; /* To keep width calculation in percent since WP 5.6 */
+ text-align: left;
+ white-space: nowrap;
+ vertical-align: top;
+ padding: 0;
+ line-height: normal; /* Override WC Bookings styles with WP < 5.6 */
+ height: 28px; /* Override WC Bookings styles with WP < 5.6 */
+}
+
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ position: absolute;
+ top: 26%;
+ width: 16px;
+ height: 16px;
+ text-indent: 0; /* due to text-indent for jquery ui-dialog in wizard */
+ background: none;
+}
+
+.rtl .ui-selectmenu-button span.ui-icon {
+ left: 0.5em;
+ right: auto;
+}
+
+
+.ui-selectmenu-button.ui-widget span.ui-selectmenu-text, /* Override WC Bookings styles with WP < 5.6 */
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.1em 2.1em 0.2em 2em;
+ display: block;
+ line-height: 23px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ margin: 0;
+}
+
+.rtl .ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: right;
+ padding: 0.2em 2em 0.2em 2.1em;
+}
+
+.ui-widget-content,
+.ui-state-default,
+.ui-selectmenu-button.ui-state-default, /* Override WC Bookings styles with WP < 5.6 */
+.ui-button.ui-selectmenu-button-closed, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+.ui-button.ui-selectmenu-button-open, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ background: #fff;
+ border: 1px solid #ddd;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07) inset;
+ color: #32373c;
+}
+/* Override to have same styles as WP form styles since WordPress 5.4 */
+.toplevel_page_mlang .ui-selectmenu-button.ui-state-default,
+.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-closed, /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+.toplevel_page_mlang .ui-selectmenu-button.ui-selectmenu-button-open{ /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+ box-shadow: 0 0 0 transparent;
+ border-radius: 4px;
+ border: 1px solid #7e8993;
+}
+
+/* From this line and below: override WooCommerce bookings plugin styles which overrides default WordPress styles */
+.pll-selectmenu-menu .ui-widget,
+.pll-selectmenu-button.ui-widget {
+ font-size: 13px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+}
+
+.toplevel_page_mlang .ui-button.ui-selectmenu-button:focus{
+ color: #016087; /* Same color as WordPress focused select HTML tag */
+ border-color: #007cba;
+ box-shadow: 0 0 0 1px #007cba;
+ outline: 2px solid transparent;
+ background: #fff; /* Override bookings plugin styles which overrides default WordPress styles */
+}
+
+.toplevel_page_mlang .ui-menu-item,
+.toplevel_page_mlang .ui-widget-content .ui-state-hover,
+.toplevel_page_mlang .ui-widget-content .ui-state-focus,
+.toplevel_page_mlang .ui-widget-content .ui-state-active {
+ color: #016087; /* Same color as option in a WordPress focused select HTML tag */
+ margin: 0;
+}
+
+.ui-selectmenu-open .ui-widget-content .ui-state-hover, /* Override WC Bookings styles with WP < 5.6 */
+.ui-selectmenu-open .ui-widget-content .ui-state-focus, /* Override WC Bookings styles with WP < 5.6 */
+.ui-selectmenu-open .ui-widget-content .ui-state-active, /* Override WC Bookings styles with WP < 5.6 */
+.pll-selectmenu-menu .ui-widget-content .ui-state-hover,
+.pll-selectmenu-menu .ui-widget-content .ui-state-focus,
+.pll-selectmenu-menu .ui-widget-content .ui-state-active { /* To be compatible jQuery UI 1.12.1 since WordPress 5.6 */
+ background: #d5d5d5;
+ border: 0;
+}
+
+.ui-selectmenu-button.ui-state-focus {
+ border: 1px solid #5b9dd9;
+ box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
+}
+
+.ui-icon-triangle-1-s:before {
+ content: "";
+ background: #fff url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E) no-repeat right 0px top 55%;
+ background-size: 16px 16px;
+ box-sizing: border-box;
+ position: absolute;
+ width: 16px;
+ height: 16px;
+}
+
+.pll-selectmenu-button.ui-button:hover,
+.pll-wizard .ui-button:hover,
+.pll-wizard .ui-button:focus {
+ background: #fff; /* To override jQuery ui-dialog styles provided by WordPress */
+}
+
+.ui-widget-content {
+ max-height: 231px;
+ box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3);
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ad.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ad.png
new file mode 100644
index 000000000..0523f1b2c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ad.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ae.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ae.png
new file mode 100644
index 000000000..c47bfeb3f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ae.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/af.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/af.png
new file mode 100644
index 000000000..b1a1a3b6d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/af.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ag.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ag.png
new file mode 100644
index 000000000..f607adc74
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ag.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ai.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ai.png
new file mode 100644
index 000000000..4aa642544
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ai.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/al.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/al.png
new file mode 100644
index 000000000..6ffe0ac05
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/al.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/am.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/am.png
new file mode 100644
index 000000000..e7520d7af
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/am.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/an.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/an.png
new file mode 100644
index 000000000..2b61643ec
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/an.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ao.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ao.png
new file mode 100644
index 000000000..742882fe1
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ao.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ar.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ar.png
new file mode 100644
index 000000000..46d43f450
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ar.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/arab.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/arab.png
new file mode 100644
index 000000000..fd70e4a22
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/arab.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/as.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/as.png
new file mode 100644
index 000000000..e66a3ae20
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/as.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/at.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/at.png
new file mode 100644
index 000000000..bed916d97
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/at.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/au.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/au.png
new file mode 100644
index 000000000..8b0d24453
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/au.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/aw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/aw.png
new file mode 100644
index 000000000..b272f781e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/aw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ax.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ax.png
new file mode 100644
index 000000000..256d61e61
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ax.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/az.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/az.png
new file mode 100644
index 000000000..d9a32de7b
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/az.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ba.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ba.png
new file mode 100644
index 000000000..d10cd5cf4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ba.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/basque.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/basque.png
new file mode 100644
index 000000000..3b5936951
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/basque.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bb.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bb.png
new file mode 100644
index 000000000..e786361eb
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bb.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bd.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bd.png
new file mode 100644
index 000000000..de039dd85
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bd.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/be.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/be.png
new file mode 100644
index 000000000..94470bc85
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/be.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bf.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bf.png
new file mode 100644
index 000000000..167207f3e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bf.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bg.png
new file mode 100644
index 000000000..fd9b97667
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bh.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bh.png
new file mode 100644
index 000000000..1d2ff7859
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bh.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bi.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bi.png
new file mode 100644
index 000000000..2331b802c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bi.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bj.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bj.png
new file mode 100644
index 000000000..5405502f4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bj.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bm.png
new file mode 100644
index 000000000..7c8046c73
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bn.png
new file mode 100644
index 000000000..59c2eb453
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bo.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bo.png
new file mode 100644
index 000000000..a7bdabc7b
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bo.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/br.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/br.png
new file mode 100644
index 000000000..eabb7ba38
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/br.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bs.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bs.png
new file mode 100644
index 000000000..741a25ca7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bs.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bt.png
new file mode 100644
index 000000000..65571d1b6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bw.png
new file mode 100644
index 000000000..f00a4166e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/by.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/by.png
new file mode 100644
index 000000000..864c60426
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/by.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bz.png
new file mode 100644
index 000000000..b36bc0ad7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/bz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ca.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ca.png
new file mode 100644
index 000000000..5cbb1260b
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ca.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/catalonia.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/catalonia.png
new file mode 100644
index 000000000..616e1cd14
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/catalonia.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cc.png
new file mode 100644
index 000000000..6c50dbe8a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cd.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cd.png
new file mode 100644
index 000000000..c282ffe63
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cd.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cf.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cf.png
new file mode 100644
index 000000000..b67aa2d09
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cf.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cg.png
new file mode 100644
index 000000000..ff3469319
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ch.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ch.png
new file mode 100644
index 000000000..29f6c55bf
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ch.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ci.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ci.png
new file mode 100644
index 000000000..ae6c89b70
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ci.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ck.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ck.png
new file mode 100644
index 000000000..dfb2e78a2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ck.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cl.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cl.png
new file mode 100644
index 000000000..6d3f3b69d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cl.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cm.png
new file mode 100644
index 000000000..a655979f4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cn.png
new file mode 100644
index 000000000..f64afc15d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/co.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/co.png
new file mode 100644
index 000000000..b62e13154
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/co.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cr.png
new file mode 100644
index 000000000..55139ecf2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cu.png
new file mode 100644
index 000000000..859e59823
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cv.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cv.png
new file mode 100644
index 000000000..cef21f92f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cv.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cx.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cx.png
new file mode 100644
index 000000000..a2d748e48
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cx.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cy.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cy.png
new file mode 100644
index 000000000..7f9ed40d3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cy.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cz.png
new file mode 100644
index 000000000..6c2c5656e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/cz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/de.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/de.png
new file mode 100644
index 000000000..41bc81b64
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/de.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dj.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dj.png
new file mode 100644
index 000000000..fb82dcc92
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dj.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dk.png
new file mode 100644
index 000000000..3b9282c23
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dm.png
new file mode 100644
index 000000000..5488cb52e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/do.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/do.png
new file mode 100644
index 000000000..d27ef3d79
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/do.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dz.png
new file mode 100644
index 000000000..78a7be65b
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/dz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ec.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ec.png
new file mode 100644
index 000000000..fef746c2d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ec.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ee.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ee.png
new file mode 100644
index 000000000..e49b1b47f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ee.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/eg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/eg.png
new file mode 100644
index 000000000..f37f60a6d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/eg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/eh.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/eh.png
new file mode 100644
index 000000000..49bff039a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/eh.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/england.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/england.png
new file mode 100644
index 000000000..e0984c300
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/england.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/er.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/er.png
new file mode 100644
index 000000000..5d6d16cb7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/er.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/es.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/es.png
new file mode 100644
index 000000000..04c65aa9a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/es.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/esperanto.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/esperanto.png
new file mode 100644
index 000000000..00306b663
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/esperanto.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/et.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/et.png
new file mode 100644
index 000000000..45a622fe2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/et.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fi.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fi.png
new file mode 100644
index 000000000..a1a843f4a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fi.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fj.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fj.png
new file mode 100644
index 000000000..308d1ecd1
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fj.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fk.png
new file mode 100644
index 000000000..9a1c740e3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fm.png
new file mode 100644
index 000000000..b97a1248c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fo.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fo.png
new file mode 100644
index 000000000..4cad1fc6d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fo.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fr.png
new file mode 100644
index 000000000..9e443e685
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/fr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ga.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ga.png
new file mode 100644
index 000000000..8c902acaa
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ga.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/galicia.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/galicia.png
new file mode 100644
index 000000000..ed6568761
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/galicia.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gb.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gb.png
new file mode 100644
index 000000000..f8c4cbdbd
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gb.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gd.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gd.png
new file mode 100644
index 000000000..060fe2b96
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gd.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ge.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ge.png
new file mode 100644
index 000000000..26cbbc9dc
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ge.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gh.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gh.png
new file mode 100644
index 000000000..573e1b1e6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gh.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gi.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gi.png
new file mode 100644
index 000000000..412a6428b
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gi.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gl.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gl.png
new file mode 100644
index 000000000..9a376c8ee
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gl.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gm.png
new file mode 100644
index 000000000..d39aa5b6f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gn.png
new file mode 100644
index 000000000..e6e8ec88d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gp.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gp.png
new file mode 100644
index 000000000..aceeea925
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gp.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gq.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gq.png
new file mode 100644
index 000000000..5450d0b99
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gq.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gr.png
new file mode 100644
index 000000000..57afba596
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gs.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gs.png
new file mode 100644
index 000000000..2efa092bd
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gs.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gt.png
new file mode 100644
index 000000000..bcd0e148c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gu.png
new file mode 100644
index 000000000..1e7644e09
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gw.png
new file mode 100644
index 000000000..762cdee12
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gy.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gy.png
new file mode 100644
index 000000000..e90b8f789
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/gy.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hk.png
new file mode 100644
index 000000000..d285f57c9
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hm.png
new file mode 100644
index 000000000..8b0d24453
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hn.png
new file mode 100644
index 000000000..d108cd019
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hr.png
new file mode 100644
index 000000000..ced078099
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ht.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ht.png
new file mode 100644
index 000000000..bc5a38573
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ht.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hu.png
new file mode 100644
index 000000000..3ce936953
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/hu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/id.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/id.png
new file mode 100644
index 000000000..fc6b7b990
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/id.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ie.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ie.png
new file mode 100644
index 000000000..0432bc779
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ie.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/il.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/il.png
new file mode 100644
index 000000000..315ac318a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/il.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/in.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/in.png
new file mode 100644
index 000000000..14f49a593
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/in.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/io.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/io.png
new file mode 100644
index 000000000..e92820737
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/io.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/iq.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/iq.png
new file mode 100644
index 000000000..989cdc82d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/iq.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ir.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ir.png
new file mode 100644
index 000000000..bdbf70da3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ir.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/is.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/is.png
new file mode 100644
index 000000000..3dd06dba8
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/is.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/it.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/it.png
new file mode 100644
index 000000000..9dc1a86bc
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/it.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jm.png
new file mode 100644
index 000000000..83fcc7560
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jo.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jo.png
new file mode 100644
index 000000000..c6c11adab
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jo.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jp.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jp.png
new file mode 100644
index 000000000..82168d961
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/jp.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ke.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ke.png
new file mode 100644
index 000000000..33306eea1
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ke.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kg.png
new file mode 100644
index 000000000..73f997f22
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kh.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kh.png
new file mode 100644
index 000000000..ee718d9dc
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kh.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ki.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ki.png
new file mode 100644
index 000000000..2835c4605
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ki.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/km.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/km.png
new file mode 100644
index 000000000..2ee55b1ca
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/km.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kn.png
new file mode 100644
index 000000000..f3f43999a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kp.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kp.png
new file mode 100644
index 000000000..c55ebef1a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kp.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kr.png
new file mode 100644
index 000000000..ea24bd06a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kurdistan.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kurdistan.png
new file mode 100644
index 000000000..fded8c5db
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kurdistan.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kw.png
new file mode 100644
index 000000000..9e852ebb5
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ky.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ky.png
new file mode 100644
index 000000000..c2cd82017
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ky.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kz.png
new file mode 100644
index 000000000..52f6cfec2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/kz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/la.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/la.png
new file mode 100644
index 000000000..a93fb5da7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/la.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lb.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lb.png
new file mode 100644
index 000000000..ba5df97e4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lb.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lc.png
new file mode 100644
index 000000000..72526dbd8
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/li.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/li.png
new file mode 100644
index 000000000..cac346ba8
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/li.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lk.png
new file mode 100644
index 000000000..9942f39e6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lr.png
new file mode 100644
index 000000000..175bcd8e4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ls.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ls.png
new file mode 100644
index 000000000..3c0f37fd6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ls.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lt.png
new file mode 100644
index 000000000..9860367ef
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lu.png
new file mode 100644
index 000000000..cf14435c7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lv.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lv.png
new file mode 100644
index 000000000..ec616e835
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/lv.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ly.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ly.png
new file mode 100644
index 000000000..e04ecb376
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ly.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ma.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ma.png
new file mode 100644
index 000000000..a96ae4578
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ma.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mc.png
new file mode 100644
index 000000000..a4a03893e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/md.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/md.png
new file mode 100644
index 000000000..4faa1d1b3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/md.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/me.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/me.png
new file mode 100644
index 000000000..70d7b4f57
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/me.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mg.png
new file mode 100644
index 000000000..fd71126af
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mh.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mh.png
new file mode 100644
index 000000000..572b2cc0e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mh.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mk.png
new file mode 100644
index 000000000..5b495c781
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ml.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ml.png
new file mode 100644
index 000000000..83d2d3cee
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ml.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mm.png
new file mode 100644
index 000000000..c820369e7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mn.png
new file mode 100644
index 000000000..99af9598a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mo.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mo.png
new file mode 100644
index 000000000..179edf3f5
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mo.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mp.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mp.png
new file mode 100644
index 000000000..5e51851f2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mp.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mq.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mq.png
new file mode 100644
index 000000000..16a24fce6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mq.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mr.png
new file mode 100644
index 000000000..60bc15f88
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ms.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ms.png
new file mode 100644
index 000000000..19cb7b631
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ms.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mt.png
new file mode 100644
index 000000000..32e460ce9
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mu.png
new file mode 100644
index 000000000..6219cb677
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mv.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mv.png
new file mode 100644
index 000000000..22a5982d7
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mv.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mw.png
new file mode 100644
index 000000000..7b72870d2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mx.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mx.png
new file mode 100644
index 000000000..233d6c525
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mx.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/my.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/my.png
new file mode 100644
index 000000000..ef4fc0700
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/my.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mz.png
new file mode 100644
index 000000000..c12027395
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/mz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/na.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/na.png
new file mode 100644
index 000000000..cb1488aa9
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/na.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nc.png
new file mode 100644
index 000000000..bf83cce3d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ne.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ne.png
new file mode 100644
index 000000000..1db0c05b6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ne.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nf.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nf.png
new file mode 100644
index 000000000..225e608c3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nf.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ng.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ng.png
new file mode 100644
index 000000000..71db60520
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ng.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ni.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ni.png
new file mode 100644
index 000000000..8a3df9f4c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ni.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nl.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nl.png
new file mode 100644
index 000000000..34b52a24a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nl.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/no.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/no.png
new file mode 100644
index 000000000..0f98f5e2a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/no.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/np.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/np.png
new file mode 100644
index 000000000..4fda5d66c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/np.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nr.png
new file mode 100644
index 000000000..e4d797778
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nu.png
new file mode 100644
index 000000000..350a9ddd8
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nz.png
new file mode 100644
index 000000000..c83bd1ab2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/nz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/occitania.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/occitania.png
new file mode 100644
index 000000000..08688df9b
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/occitania.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/om.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/om.png
new file mode 100644
index 000000000..2eb3a1553
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/om.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pa.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pa.png
new file mode 100644
index 000000000..1f84ae5a9
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pa.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pe.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pe.png
new file mode 100644
index 000000000..342d003b4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pe.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pf.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pf.png
new file mode 100644
index 000000000..4663091b2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pf.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pg.png
new file mode 100644
index 000000000..46d821896
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ph.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ph.png
new file mode 100644
index 000000000..7aeee8c58
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ph.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pk.png
new file mode 100644
index 000000000..e898448cf
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pl.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pl.png
new file mode 100644
index 000000000..10da179ab
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pl.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pm.png
new file mode 100644
index 000000000..b6cd50f24
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pn.png
new file mode 100644
index 000000000..600994df5
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pr.png
new file mode 100644
index 000000000..cf104c42c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ps.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ps.png
new file mode 100644
index 000000000..e313f3183
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ps.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pt.png
new file mode 100644
index 000000000..c90c4456d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pw.png
new file mode 100644
index 000000000..b1a4f4fca
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/pw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/py.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/py.png
new file mode 100644
index 000000000..0f143ffe6
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/py.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/qa.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/qa.png
new file mode 100644
index 000000000..9945c6854
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/qa.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/quebec.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/quebec.png
new file mode 100644
index 000000000..8c34644ad
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/quebec.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ro.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ro.png
new file mode 100644
index 000000000..24e989a3a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ro.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/rs.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/rs.png
new file mode 100644
index 000000000..8fb41a5d0
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/rs.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ru.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ru.png
new file mode 100644
index 000000000..2c5f1337a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ru.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/rw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/rw.png
new file mode 100644
index 000000000..2ce164566
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/rw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sa.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sa.png
new file mode 100644
index 000000000..0246b1a6a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sa.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sb.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sb.png
new file mode 100644
index 000000000..da51301e3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sb.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sc.png
new file mode 100644
index 000000000..52408113d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/scotland.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/scotland.png
new file mode 100644
index 000000000..eda0d4913
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/scotland.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sd.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sd.png
new file mode 100644
index 000000000..20fb23057
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sd.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/se.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/se.png
new file mode 100644
index 000000000..4f66b4722
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/se.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sg.png
new file mode 100644
index 000000000..a4e86518f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sh.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sh.png
new file mode 100644
index 000000000..6ac0d8052
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sh.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/si.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/si.png
new file mode 100644
index 000000000..36f0a9599
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/si.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sk.png
new file mode 100644
index 000000000..5b613d99e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sl.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sl.png
new file mode 100644
index 000000000..72c6af427
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sl.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sm.png
new file mode 100644
index 000000000..fe9a6bb9e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sn.png
new file mode 100644
index 000000000..889c002a2
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/so.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/so.png
new file mode 100644
index 000000000..843606fd9
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/so.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sr.png
new file mode 100644
index 000000000..b1684cb1f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ss.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ss.png
new file mode 100644
index 000000000..833eef240
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ss.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/st.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/st.png
new file mode 100644
index 000000000..f1b0b531c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/st.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sv.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sv.png
new file mode 100644
index 000000000..70ac44f23
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sv.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sy.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sy.png
new file mode 100644
index 000000000..a39ebefb0
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sy.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sz.png
new file mode 100644
index 000000000..9ae485123
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/sz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tc.png
new file mode 100644
index 000000000..e6972adfb
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/td.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/td.png
new file mode 100644
index 000000000..acf1da6f5
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/td.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tf.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tf.png
new file mode 100644
index 000000000..fe4ade762
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tf.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tg.png
new file mode 100644
index 000000000..b9a04838e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/th.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/th.png
new file mode 100644
index 000000000..ad9462a68
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/th.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tibet.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tibet.png
new file mode 100644
index 000000000..b2f743bdc
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tibet.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tj.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tj.png
new file mode 100644
index 000000000..192bd87e0
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tj.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tk.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tk.png
new file mode 100644
index 000000000..59a93bd78
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tk.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tl.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tl.png
new file mode 100644
index 000000000..e65b54a77
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tl.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tm.png
new file mode 100644
index 000000000..a5a00005f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tn.png
new file mode 100644
index 000000000..57e21bdda
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/to.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/to.png
new file mode 100644
index 000000000..e320c68ff
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/to.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tr.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tr.png
new file mode 100644
index 000000000..4b472dd6d
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tr.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tt.png
new file mode 100644
index 000000000..fec31bc1e
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tv.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tv.png
new file mode 100644
index 000000000..359b8be84
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tv.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tw.png
new file mode 100644
index 000000000..e026cb721
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tz.png
new file mode 100644
index 000000000..3b1090ac0
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/tz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ua.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ua.png
new file mode 100644
index 000000000..24cd433c8
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ua.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ug.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ug.png
new file mode 100644
index 000000000..1cac8d7c5
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ug.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/us.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/us.png
new file mode 100644
index 000000000..81899ff3a
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/us.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/uy.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/uy.png
new file mode 100644
index 000000000..6d3f7e246
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/uy.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/uz.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/uz.png
new file mode 100644
index 000000000..f9d4707ed
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/uz.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/va.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/va.png
new file mode 100644
index 000000000..05f59d182
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/va.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vc.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vc.png
new file mode 100644
index 000000000..0e0626b98
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vc.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ve.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ve.png
new file mode 100644
index 000000000..a4ac3357c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ve.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/veneto.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/veneto.png
new file mode 100644
index 000000000..45c5a1cf4
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/veneto.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vg.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vg.png
new file mode 100644
index 000000000..47df07b9c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vg.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vi.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vi.png
new file mode 100644
index 000000000..12e7fb367
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vi.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vn.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vn.png
new file mode 100644
index 000000000..911897f73
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vn.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vu.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vu.png
new file mode 100644
index 000000000..508fc0aea
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/vu.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/wales.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/wales.png
new file mode 100644
index 000000000..d43bb1ac3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/wales.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/wf.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/wf.png
new file mode 100644
index 000000000..45bfce65f
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/wf.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ws.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ws.png
new file mode 100644
index 000000000..cdda4f23c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ws.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ye.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ye.png
new file mode 100644
index 000000000..0908b9b8c
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/ye.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/yt.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/yt.png
new file mode 100644
index 000000000..4e43a1ed3
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/yt.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/za.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/za.png
new file mode 100644
index 000000000..c7fc63e01
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/za.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/zm.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/zm.png
new file mode 100644
index 000000000..0b4bbfaee
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/zm.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/zw.png b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/zw.png
new file mode 100644
index 000000000..a808419ed
Binary files /dev/null and b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/flags/zw.png differ
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/accept-language.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/accept-language.php
new file mode 100644
index 000000000..10b01ec59
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/accept-language.php
@@ -0,0 +1,112 @@
+ '(\b[a-z]{2,3}|[a-z]{4}|[a-z]{5-8}\b)',
+ 'language-extension' => '(?:-(\b[a-z]{3}){1,3}\b)?',
+ 'script' => '(?:-(\b[a-z]{4})\b)?',
+ 'region' => '(?:-(\b[a-z]{2}|[0-9]{3})\b)?',
+ 'variant' => '(?:-(\b[0-9][a-z]{1,3}|[a-z][a-z0-9]{4,7})\b)?',
+ 'extension' => '(?:-(\b[a-wy-z]-[a-z0-9]{2,8})\b)?',
+ 'private-use' => '(?:-(\bx-[a-z0-9]{1,8})\b)?',
+ );
+
+ /**
+ * @var string[] {
+ * @type string $language Usually 2 or three letters (ISO 639).
+ * @type string $language-extension Up to three groups of 3 letters.
+ * @type string $script Four letters.
+ * @type string $region Either two letters of three digits.
+ * @type string $variant Either one digit followed by 1 to 3 letters, or a letter followed by 2 to 7 alphanumerical characters.
+ * @type string $extension One letter that cannot be an 'x', followed by 2 to 8 alphanumerical characters.
+ * @type string $private-use Starts by 'x-', followed by 1 to 8 alphanumerical characters.
+ * }
+ */
+ protected $subtags;
+
+ /**
+ * @var float
+ */
+ protected $quality;
+
+ /**
+ * PLL_Accept_Language constructor.
+ *
+ * @since 3.0
+ *
+ * @param string[] $subtags With subtag name as keys and subtag values as names.
+ * @param mixed $quality Floating point value from 0.0 to 1.0. Higher values indicates a user's preference.
+ */
+ public function __construct( $subtags, $quality = 1.0 ) {
+ $this->subtags = $subtags;
+ $this->quality = is_numeric( $quality ) ? floatval( $quality ) : 1.0;
+ }
+
+ /**
+ * Creates a new instance from an array resulting of a PHP {@see preg_match()} or {@see preg_match_all()} call.
+ *
+ * @since 3.0
+ *
+ * @param string[] $matches Expects first entry to be full match, following entries to be subtags and last entry to be quality factor.
+ * @return PLL_Accept_Language
+ */
+ public static function from_array( $matches ) {
+ $subtags = array_combine(
+ array_keys( array_slice( self::SUBTAG_PATTERNS, 0, count( $matches ) - 1 ) ),
+ array_slice( $matches, 1, count( self::SUBTAG_PATTERNS ) )
+ );
+ $quality = count( $matches ) === 9 ? $matches[8] : 1.0;
+
+ return new PLL_Accept_Language( $subtags, $quality );
+ }
+
+ /**
+ * Returns the full language tag.
+ *
+ * @since 3.0
+ *
+ * @return string
+ */
+ public function __toString() {
+ $subtags = array_filter(
+ $this->subtags,
+ function ( $subtag ) {
+ return ! empty( trim( $subtag ) );
+ }
+ );
+ return implode( '-', $subtags );
+ }
+
+ /**
+ * Returns the quality factor as negotiated by the browser agent.
+ *
+ * @since 3.0
+ *
+ * @return float
+ */
+ public function get_quality() {
+ return $this->quality;
+ }
+
+ /**
+ * Returns a subtag from the language tag.
+ *
+ * @since 3.0
+ *
+ * @param string $name A valid subtag name, {@see PLL_Accept_Language::SUBTAG_PATTERNS} for available subtag names.
+ * @return string
+ */
+ public function get_subtag( $name ) {
+ return isset( $this->subtags[ $name ] ) ? $this->subtags[ $name ] : '';
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/accept-languages-collection.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/accept-languages-collection.php
new file mode 100644
index 000000000..1e512c18d
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/accept-languages-collection.php
@@ -0,0 +1,143 @@
+1|0)(?>\.[0-9]+)?)';
+ $full_pattern = "/{$language_pattern}(?:{$quality_pattern})?/i";
+
+ preg_match_all(
+ $full_pattern,
+ $http_header,
+ $lang_parse,
+ PREG_SET_ORDER
+ );
+
+ return new PLL_Accept_Languages_Collection(
+ array_map(
+ array( PLL_Accept_Language::class, 'from_array' ),
+ $lang_parse
+ )
+ );
+ }
+
+ /**
+ * PLL_Accept_Languages_Collection constructor.
+ *
+ * @since 3.0
+ *
+ * @param PLL_Accept_Language[] $accept_languages Objects representing Accept-Language HTTP headers.
+ */
+ public function __construct( $accept_languages = array() ) {
+ $this->accept_languages = $accept_languages;
+ }
+
+ /**
+ * Bubble sort (need a stable sort for Android, so can't use a PHP sort function).
+ *
+ * @since 3.0
+ *
+ * @return void
+ */
+ public function bubble_sort() {
+ $k = $this->accept_languages;
+ $v = array_map(
+ function ( $accept_lang ) {
+ return $accept_lang->get_quality();
+ },
+ $this->accept_languages
+ );
+
+ if ( $n = count( $k ) ) {
+
+ if ( $n > 1 ) {
+ for ( $i = 2; $i <= $n; $i++ ) {
+ for ( $j = 0; $j <= $n - 2; $j++ ) {
+ if ( $v[ $j ] < $v[ $j + 1 ] ) {
+ // Swap values.
+ $temp = $v[ $j ];
+ $v[ $j ] = $v[ $j + 1 ];
+ $v[ $j + 1 ] = $temp;
+ // Swap keys.
+ $temp = $k[ $j ];
+ $k[ $j ] = $k[ $j + 1 ];
+ $k[ $j + 1 ] = $temp;
+ }
+ }
+ }
+ }
+ $this->accept_languages = array_filter(
+ $k,
+ function ( $accept_lang ) {
+ return $accept_lang->get_quality() > 0;
+ }
+ );
+ }
+ }
+
+ /**
+ * Looks through sorted list and use first one that matches our language list.
+ *
+ * @since 3.0
+ *
+ * @param PLL_Language[] $languages The language list.
+ * @return string|false A language slug if there's a match, false otherwise.
+ */
+ public function find_best_match( $languages = array() ) {
+ foreach ( $this->accept_languages as $accept_lang ) {
+ // First loop to match the exact locale.
+ foreach ( $languages as $language ) {
+ if ( 0 === strcasecmp( $accept_lang, $language->get_locale( 'display' ) ) ) {
+ return $language->slug;
+ }
+ }
+
+ // In order of priority.
+ $subsets = array();
+ if ( ! empty( $accept_lang->get_subtag( 'region' ) ) ) {
+ $subsets[] = $accept_lang->get_subtag( 'language' ) . '-' . $accept_lang->get_subtag( 'region' );
+ $subsets[] = $accept_lang->get_subtag( 'region' );
+ }
+ if ( ! empty( $accept_lang->get_subtag( 'variant' ) ) ) {
+ $subsets[] = $accept_lang->get_subtag( 'language' ) . '-' . $accept_lang->get_subtag( 'variant' );
+ }
+ $subsets[] = $accept_lang->get_subtag( 'language' );
+
+ // More loops to match the subsets.
+ foreach ( $languages as $language ) {
+ foreach ( $subsets as $subset ) {
+
+ if ( 0 === stripos( $subset, $language->slug ) || 0 === stripos( $language->get_locale( 'display' ), $subset ) ) {
+ return $language->slug;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/canonical.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/canonical.php
new file mode 100644
index 000000000..b6f2a734f
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/canonical.php
@@ -0,0 +1,269 @@
+links_model = &$polylang->links_model;
+ $this->model = &$polylang->model;
+ $this->options = &$polylang->options;
+ $this->curlang = &$polylang->curlang;
+ }
+
+ /**
+ * If the language code is not in agreement with the language of the content,
+ * redirects incoming links to the proper URL to avoid duplicate content.
+ *
+ * @since 0.9.6
+ *
+ * @global WP_Query $wp_query WordPress Query object.
+ * @global bool $is_IIS
+ *
+ * @param string $requested_url Optional, defaults to requested url.
+ * @param bool $do_redirect Optional, whether to perform the redirect or not.
+ * @return string|void Returns if redirect is not performed.
+ */
+ public function check_canonical_url( $requested_url = '', $do_redirect = true ) {
+ global $wp_query;
+
+ // Don't redirect in same cases as WP.
+ if ( is_trackback() || is_search() || is_admin() || is_preview() || is_robots() || ( $GLOBALS['is_IIS'] && ! iis7_supports_permalinks() ) ) {
+ return;
+ }
+
+ // Don't redirect mysite.com/?attachment_id= to mysite.com/en/?attachment_id=.
+ if ( 1 == $this->options['force_lang'] && is_attachment() && isset( $_GET['attachment_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ return;
+ }
+
+ /*
+ * If the default language code is not hidden and the static front page url contains the page name,
+ * the customizer lands here and the code below would redirect to the list of posts.
+ */
+ if ( is_customize_preview() ) {
+ return;
+ }
+
+ if ( empty( $requested_url ) ) {
+ $requested_url = pll_get_requested_url();
+ }
+
+ if ( ( is_single() || is_page() ) && ! is_front_page() ) {
+ $post = get_post();
+ if ( $post instanceof WP_Post && $this->model->is_translated_post_type( $post->post_type ) ) {
+ $language = $this->model->post->get_language( (int) $post->ID );
+ }
+ }
+
+ if ( ! empty( $wp_query->tax_query ) ) {
+ if ( $this->model->is_translated_taxonomy( $this->get_queried_taxonomy( $wp_query->tax_query ) ) ) {
+ $term_id = $this->get_queried_term_id( $wp_query->tax_query );
+ if ( $term_id ) {
+ $language = $this->model->term->get_language( $term_id );
+ }
+ }
+ }
+
+ if ( $wp_query->is_posts_page ) {
+ $page_id = get_query_var( 'page_id' );
+ if ( ! $page_id ) {
+ $page_id = get_queried_object_id();
+ }
+ if ( $page_id && is_numeric( $page_id ) ) {
+ $language = $this->model->post->get_language( (int) $page_id );
+ }
+ }
+
+ if ( 3 === $this->options['force_lang'] ) {
+ $requested_host = wp_parse_url( $requested_url, PHP_URL_HOST );
+ foreach ( $this->options['domains'] as $lang => $domain ) {
+ $host = wp_parse_url( $domain, PHP_URL_HOST );
+ if ( $requested_host && $host && ltrim( $requested_host, 'w.' ) === ltrim( $host, 'w.' ) ) {
+ $language = $this->model->get_language( $lang );
+ }
+ }
+ }
+
+ if ( empty( $language ) ) {
+ $language = $this->curlang;
+ $redirect_url = $requested_url;
+ } else {
+ $redirect_url = $this->redirect_canonical( $requested_url, $language );
+ $redirect_url = $this->options['force_lang'] ?
+ $this->links_model->switch_language_in_link( $redirect_url, $language ) :
+ $this->links_model->remove_language_from_link( $redirect_url ); // Works only for default permalinks.
+ }
+
+
+ /**
+ * Filters the canonical url detected by Polylang.
+ *
+ * @since 1.6
+ *
+ * @param string|false $redirect_url False or the url to redirect to.
+ * @param PLL_Language $language The language detected.
+ */
+ $redirect_url = apply_filters( 'pll_check_canonical_url', $redirect_url, $language );
+
+ if ( ! $redirect_url || $requested_url === $redirect_url ) {
+ return $requested_url;
+ }
+
+ if ( ! $do_redirect ) {
+ return $redirect_url;
+ }
+
+ // Protect against chained redirects.
+ if ( $redirect_url === $this->check_canonical_url( $redirect_url, false ) && wp_validate_redirect( $redirect_url ) ) {
+ wp_safe_redirect( $redirect_url, 301, POLYLANG );
+ exit;
+ }
+ }
+
+ /**
+ * Returns the term_id of the requested term.
+ *
+ * @since 2.9
+ *
+ * @param WP_Tax_Query $tax_query An instance of WP_Tax_Query.
+ * @return int
+ */
+ protected function get_queried_term_id( $tax_query ) {
+ $queried_terms = $tax_query->queried_terms;
+ $taxonomy = $this->get_queried_taxonomy( $tax_query );
+
+ if ( ! is_array( $queried_terms[ $taxonomy ]['terms'] ) ) {
+ return 0;
+ }
+ $field = $queried_terms[ $taxonomy ]['field'];
+ $term = reset( $queried_terms[ $taxonomy ]['terms'] );
+ $lang = isset( $queried_terms['language']['terms'] ) ? reset( $queried_terms['language']['terms'] ) : '';
+
+ // We can get a term_id when requesting a plain permalink, eg /?cat=1.
+ if ( 'term_id' === $field ) {
+ return $term;
+ }
+
+ // We get a slug when requesting a pretty permalink. Let's query all corresponding terms.
+ $args = array(
+ 'lang' => '',
+ 'taxonomy' => $taxonomy,
+ $field => $term,
+ 'hide_empty' => false,
+ 'fields' => 'ids',
+ );
+ $term_ids = get_terms( $args );
+
+ if ( ! is_array( $term_ids ) || empty( $term_ids ) ) {
+ return 0;
+ }
+
+ $term_ids = array_filter( $term_ids, 'is_numeric' );
+
+ $filtered_terms_by_lang = array_filter(
+ $term_ids,
+ function ( $term_id ) use ( $lang ) {
+ $term_lang = $this->model->term->get_language( (int) $term_id );
+
+ return ! empty( $term_lang ) && $term_lang->slug === $lang;
+ }
+ );
+
+ $tr_term = (int) reset( $filtered_terms_by_lang );
+
+ if ( ! empty( $tr_term ) ) {
+ // The queried term exists in the desired language.
+ return $tr_term;
+ }
+
+ // The queried term doesn't exist in the desired language, let's return the first one retrieved.
+ return (int) reset( $term_ids );
+ }
+
+ /**
+ * Find the taxonomy being queried.
+ *
+ * @since 2.9
+ *
+ * @param WP_Tax_Query $tax_query An instance of WP_Tax_Query.
+ * @return string A taxonomy slug
+ */
+ protected function get_queried_taxonomy( $tax_query ) {
+ $queried_terms = $tax_query->queried_terms;
+ unset( $queried_terms['language'] );
+
+ return (string) key( $queried_terms );
+ }
+
+ /**
+ * Evaluates the canonical redirect url through the deidcated WP function.
+ *
+ * @since 3.3
+ *
+ * @global WP_Query $wp_query WordPress Query object.
+ *
+ * @param string $url Requested url.
+ * @param PLL_Language $language Language of the queried object.
+ * @return string
+ */
+ protected function redirect_canonical( $url, $language ) {
+ /**
+ * @var WP_Query
+ */
+ global $wp_query;
+
+ $this->curlang = $language; // Hack to filter the `page_for_posts` option in the correct language.
+
+ $backup_wp_query = $wp_query;
+
+ if ( isset( $wp_query->tax_query ) ) {
+ unset( $wp_query->tax_query->queried_terms['language'] );
+ unset( $wp_query->query['lang'] );
+ }
+
+ $redirect_url = redirect_canonical( $url, false );
+
+ $wp_query = $backup_wp_query;
+
+ return $redirect_url ? $redirect_url : $url;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-content.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-content.php
new file mode 100644
index 000000000..9222f1815
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-content.php
@@ -0,0 +1,166 @@
+options['media_support'] ) ) {
+ return $this->get_preferred_language();
+ }
+
+ if ( $var = get_query_var( 'lang' ) ) {
+ $lang = explode( ',', $var );
+ $lang = $this->model->get_language( reset( $lang ) ); // Choose the first queried language
+ }
+
+ elseif ( ( is_single() || is_page() || ( is_attachment() && $this->options['media_support'] ) ) && ( ( $var = get_queried_object_id() ) || ( $var = get_query_var( 'p' ) ) || ( $var = get_query_var( 'page_id' ) ) || ( $var = get_query_var( 'attachment_id' ) ) ) && is_numeric( $var ) ) {
+ $lang = $this->model->post->get_language( (int) $var );
+ }
+
+ else {
+ foreach ( $this->model->get_translated_taxonomies() as $taxonomy ) {
+ $tax_object = get_taxonomy( $taxonomy );
+
+ if ( empty( $tax_object ) ) {
+ continue;
+ }
+
+ $var = get_query_var( $tax_object->query_var );
+
+ if ( ! is_string( $var ) || empty( $var ) ) {
+ continue;
+ }
+
+ $term = get_term_by( 'slug', $var, $taxonomy );
+
+ if ( ! $term instanceof WP_Term ) {
+ continue;
+ }
+
+ $lang = $this->model->term->get_language( $term->term_id );
+ }
+ }
+
+ /**
+ * Filters the language before it is set from the content.
+ *
+ * @since 0.9
+ *
+ * @param PLL_Language|false $lang Language object or false if none was found.
+ */
+ return apply_filters( 'pll_get_current_language', isset( $lang ) ? $lang : false );
+ }
+
+ /**
+ * Sets the language for the home page.
+ * Adds the lang query var when querying archives with no language code.
+ *
+ * @since 1.2
+ *
+ * @param WP_Query $query Instance of WP_Query.
+ * @return void
+ */
+ public function parse_main_query( $query ) {
+ if ( empty( $GLOBALS['wp_the_query'] ) || $query !== $GLOBALS['wp_the_query'] ) {
+ return;
+ }
+
+ $qv = $query->query_vars;
+
+ // Homepage is requested, let's set the language
+ // Take care to avoid posts page for which is_home = 1
+ if ( empty( $query->query ) && ( is_home() || is_page() ) ) {
+ $this->home_language();
+ $this->home_requested();
+ }
+
+ parent::parse_main_query( $query );
+
+ $is_archive = ( count( $query->query ) == 1 && ! empty( $qv['paged'] ) ) ||
+ $query->is_date ||
+ $query->is_author ||
+ ( ! empty( $qv['post_type'] ) && $query->is_post_type_archive && $this->model->is_translated_post_type( $qv['post_type'] ) );
+
+ // Sets the language in case we hide the default language
+ // Use $query->query['s'] as is_search is not set when search is empty
+ // http://wordpress.org/support/topic/search-for-empty-string-in-default-language
+ if ( $this->options['hide_default'] && ! isset( $qv['lang'] ) && ( $is_archive || isset( $query->query['s'] ) || ( count( $query->query ) == 1 && ! empty( $qv['feed'] ) ) ) ) {
+ $this->set_language( $this->model->get_default_language() );
+ $this->set_curlang_in_query( $query );
+ }
+ }
+
+ /**
+ * Sets the language from content
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ public function wp() {
+ // Nothing to do if the language has already been set ( although normally the filter has been removed )
+ if ( empty( $this->curlang ) && $curlang = $this->get_language_from_content() ) {
+ parent::set_language( $curlang );
+ }
+ }
+
+ /**
+ * If no language is found by {@see PLL_Choose_Lang_Content::get_language_from_content()}, returns the preferred one.
+ *
+ * @since 0.9
+ *
+ * @param PLL_Language|false $lang Language found by {@see PLL_Choose_Lang_Content::get_language_from_content()}.
+ * @return PLL_Language|false
+ */
+ public function pll_get_current_language( $lang ) {
+ return ! $lang ? $this->get_preferred_language() : $lang;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-domain.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-domain.php
new file mode 100644
index 000000000..dd11f19f9
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-domain.php
@@ -0,0 +1,45 @@
+model->get_language( $this->links_model->get_language_from_url() );
+ }
+
+ /**
+ * Adds query vars to query for home pages in all languages
+ *
+ * @since 1.5
+ *
+ * @return void
+ */
+ public function home_requested() {
+ $this->set_curlang_in_query( $GLOBALS['wp_query'] );
+ /** This action is documented in include/choose-lang.php */
+ do_action( 'pll_home_requested' );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-url.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-url.php
new file mode 100644
index 000000000..cde95fd70
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang-url.php
@@ -0,0 +1,118 @@
+set_language_from_url();
+ }
+
+ add_filter( 'request', array( $this, 'request' ) );
+ }
+
+ /**
+ * Finds the language according to information found in the url
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ public function set_language_from_url() {
+ $host = str_replace( 'www.', '', (string) wp_parse_url( $this->links_model->home, PHP_URL_HOST ) ); // Remove www. for the comparison
+ $home_path = (string) wp_parse_url( $this->links_model->home, PHP_URL_PATH );
+
+ $requested_url = pll_get_requested_url();
+ $requested_host = str_replace( 'www.', '', (string) wp_parse_url( $requested_url, PHP_URL_HOST ) ); // Remove www. for the comparison
+ $requested_path = rtrim( str_replace( $this->index, '', (string) wp_parse_url( $requested_url, PHP_URL_PATH ) ), '/' ); // Some PHP setups turn requests for / into /index.php in REQUEST_URI
+ $requested_query = wp_parse_url( $requested_url, PHP_URL_QUERY );
+
+ // Home is requested
+ if ( $requested_host === $host && $requested_path === $home_path && empty( $requested_query ) ) {
+ $this->home_language();
+ add_action( 'setup_theme', array( $this, 'home_requested' ) );
+ }
+
+ // Take care to post & page preview http://wordpress.org/support/topic/static-frontpage-url-parameter-url-language-information
+ elseif ( isset( $_GET['preview'] ) && ( ( isset( $_GET['p'] ) && $id = (int) $_GET['p'] ) || ( isset( $_GET['page_id'] ) && $id = (int) $_GET['page_id'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $curlang = ( $lg = $this->model->post->get_language( $id ) ) ? $lg : $this->model->get_default_language();
+ }
+
+ // Take care to ( unattached ) attachments
+ elseif ( isset( $_GET['attachment_id'] ) && $id = (int) $_GET['attachment_id'] ) { // phpcs:ignore WordPress.Security.NonceVerification
+ $curlang = ( $lg = $this->model->post->get_language( $id ) ) ? $lg : $this->get_preferred_language();
+ }
+
+ elseif ( $slug = $this->links_model->get_language_from_url() ) {
+ $curlang = $this->model->get_language( $slug );
+ }
+
+ elseif ( $this->options['hide_default'] ) {
+ $curlang = $this->model->get_default_language();
+ }
+
+ // If no language found, check_language_code_in_url() will attempt to find one and redirect to the correct url
+ // Otherwise a 404 will be fired in the preferred language
+ $this->set_language( empty( $curlang ) ? $this->get_preferred_language() : $curlang );
+ }
+
+
+ /**
+ * Adds the current language in query vars
+ * useful for subdomains and multiple domains
+ *
+ * @since 1.8
+ *
+ * @param array $qv main request query vars
+ * @return array modified query vars
+ */
+ public function request( $qv ) {
+ // FIXME take care not to break untranslated content
+ // FIXME media ?
+
+ // Untranslated post types
+ if ( isset( $qv['post_type'] ) && ! $this->model->is_translated_post_type( $qv['post_type'] ) ) {
+ return $qv;
+ }
+
+ // Untranslated taxonomies
+ $tax_qv = array_filter( wp_list_pluck( get_taxonomies( array(), 'objects' ), 'query_var' ) ); // Get all taxonomies query vars
+ $tax_qv = array_intersect( $tax_qv, array_keys( $qv ) ); // Get all queried taxonomies query vars
+
+ if ( ! $this->model->is_translated_taxonomy( array_keys( $tax_qv ) ) ) {
+ return $qv;
+ }
+
+ if ( isset( $this->curlang ) && empty( $qv['lang'] ) ) {
+ $qv['lang'] = $this->curlang->slug;
+ }
+
+ return $qv;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang.php
new file mode 100644
index 000000000..433c31f38
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/choose-lang.php
@@ -0,0 +1,351 @@
+links_model = &$polylang->links_model;
+ $this->model = &$polylang->model;
+ $this->options = &$polylang->options;
+
+ $this->curlang = &$polylang->curlang;
+ }
+
+ /**
+ * Sets the language for ajax requests
+ * and setup actions
+ * Any child class must call this method if it overrides it
+ *
+ * @since 1.8
+ *
+ * @return void
+ */
+ public function init() {
+ if ( Polylang::is_ajax_on_front() || ! wp_using_themes() ) {
+ $this->set_language( empty( $_REQUEST['lang'] ) ? $this->get_preferred_language() : $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
+ }
+
+ add_action( 'pre_comment_on_post', array( $this, 'pre_comment_on_post' ) ); // sets the language of comment
+ add_action( 'parse_query', array( $this, 'parse_main_query' ), 2 ); // sets the language in special cases
+ add_action( 'wp', array( $this, 'maybe_setcookie' ), 7 );
+ }
+
+ /**
+ * Sets the current language
+ * and fires the action 'pll_language_defined'.
+ *
+ * @since 1.2
+ *
+ * @param PLL_Language|false $curlang Current language.
+ * @return void
+ */
+ protected function set_language( $curlang ) {
+ // Don't set the language a second time
+ if ( isset( $this->curlang ) ) {
+ return;
+ }
+
+ // Final check in case $curlang has an unexpected value
+ // See https://wordpress.org/support/topic/detect-browser-language-sometimes-setting-null-language
+ if ( ! $curlang instanceof PLL_Language ) {
+ $curlang = $this->model->get_default_language();
+
+ if ( ! $curlang instanceof PLL_Language ) {
+ return;
+ }
+ }
+
+ $this->curlang = $curlang;
+
+ $GLOBALS['text_direction'] = $this->curlang->is_rtl ? 'rtl' : 'ltr';
+ if ( did_action( 'wp_default_styles' ) ) {
+ wp_styles()->text_direction = $GLOBALS['text_direction'];
+ }
+
+ /**
+ * Fires when the current language is defined.
+ *
+ * @since 0.9.5
+ *
+ * @param string $slug Current language code.
+ * @param PLL_Language $curlang Current language object.
+ */
+ do_action( 'pll_language_defined', $this->curlang->slug, $this->curlang );
+ }
+
+ /**
+ * Set a cookie to remember the language.
+ * Setting PLL_COOKIE to false will disable cookie although it will break some functionalities
+ *
+ * @since 1.5
+ *
+ * @return void
+ */
+ public function maybe_setcookie() {
+ // Don't set cookie in javascript when a cache plugin is active.
+ if ( ! pll_is_cache_active() && ! empty( $this->curlang ) && ! is_404() ) {
+ $args = array(
+ 'domain' => 2 === $this->options['force_lang'] ? wp_parse_url( $this->links_model->home, PHP_URL_HOST ) : COOKIE_DOMAIN,
+ 'samesite' => 3 === $this->options['force_lang'] ? 'None' : 'Lax',
+ );
+ PLL_Cookie::set( $this->curlang->slug, $args );
+ }
+ }
+
+ /**
+ * Get the preferred language according to the browser preferences.
+ *
+ * @since 1.8
+ *
+ * @return string|bool The preferred language slug or false.
+ */
+ public function get_preferred_browser_language() {
+ if ( isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
+ $accept_langs = PLL_Accept_Languages_Collection::from_accept_language_header( sanitize_text_field( wp_unslash( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) );
+
+ $accept_langs->bubble_sort();
+
+ $languages = $this->model->get_languages_list( array( 'hide_empty' => true ) ); // Hides languages with no post.
+
+ /**
+ * Filters the list of languages to use to match the browser preferences.
+ *
+ * @since 1.9.3
+ *
+ * @param array $languages Array of PLL_Language objects.
+ */
+ $languages = apply_filters( 'pll_languages_for_browser_preferences', $languages );
+
+ return $accept_langs->find_best_match( $languages );
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the preferred language
+ * either from the cookie if it's a returning visit
+ * or according to browser preference
+ * or the default language
+ *
+ * @since 0.1
+ *
+ * @return PLL_Language|false browser preferred language or default language
+ */
+ public function get_preferred_language() {
+ $language = false;
+ $cookie = false;
+
+ if ( isset( $_COOKIE[ PLL_COOKIE ] ) ) {
+ // Check first if the user was already browsing this site.
+ $language = sanitize_key( $_COOKIE[ PLL_COOKIE ] );
+ $cookie = true;
+ } elseif ( $this->options['browser'] ) {
+ $language = $this->get_preferred_browser_language();
+ }
+
+ /**
+ * Filter the visitor's preferred language (normally set first by cookie
+ * if this is not the first visit, then by the browser preferences).
+ * If no preferred language has been found or set by this filter,
+ * Polylang fallbacks to the default language
+ *
+ * @since 1.0
+ * @since 2.7 Added $cookie parameter.
+ *
+ * @param string|bool $language Preferred language code, false if none has been found.
+ * @param bool $cookie Whether the preferred language has been defined by the cookie.
+ */
+ $slug = apply_filters( 'pll_preferred_language', $language, $cookie );
+
+ // Return default if there is no preferences in the browser or preferences does not match our languages or it is requested not to use the browser preference
+ return ( $lang = $this->model->get_language( $slug ) ) ? $lang : $this->model->get_default_language();
+ }
+
+ /**
+ * Sets the language when home page is requested
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ protected function home_language() {
+ // Test referer in case PLL_COOKIE is set to false. Since WP 3.6.1, wp_get_referer() validates the host which is exactly what we want
+ // Thanks to Ov3rfly http://wordpress.org/support/topic/enhance-feature-when-front-page-is-visited-set-language-according-to-browser
+ $language = $this->options['hide_default'] && ( wp_get_referer() || ! $this->options['browser'] ) ?
+ $this->model->get_default_language() :
+ $this->get_preferred_language(); // Sets the language according to browser preference or default language
+ $this->set_language( $language );
+ }
+
+ /**
+ * To call when the home page has been requested
+ * Make sure to call this after 'setup_theme' has been fired as we need $wp_query
+ * Performs a redirection to the home page in the current language if needed
+ *
+ * @since 0.9
+ *
+ * @return void
+ */
+ public function home_requested() {
+ if ( empty( $this->curlang ) ) {
+ return;
+ }
+
+ // We are already on the right page
+ if ( $this->curlang->is_default && $this->options['hide_default'] ) {
+ $this->set_curlang_in_query( $GLOBALS['wp_query'] );
+
+ /**
+ * Fires when the site root page is requested
+ *
+ * @since 1.8
+ */
+ do_action( 'pll_home_requested' );
+ }
+ // Redirect to the home page in the right language
+ // Test to avoid crash if get_home_url returns something wrong
+ // FIXME why this happens? http://wordpress.org/support/topic/polylang-crashes-1
+ // Don't redirect if $_POST is not empty as it could break other plugins
+ elseif ( is_string( $redirect = $this->curlang->get_home_url() ) && empty( $_POST ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ // Don't forget the query string which may be added by plugins
+ $query_string = wp_parse_url( pll_get_requested_url(), PHP_URL_QUERY );
+ if ( ! empty( $query_string ) ) {
+ $redirect .= ( $this->links_model->using_permalinks ? '?' : '&' ) . $query_string;
+ }
+
+ /**
+ * When a visitor reaches the site home, Polylang redirects to the home page in the correct language.
+ * This filter allows plugins to modify the redirected url or prevent this redirection
+ * /!\ this filter may be fired *before* the theme is loaded
+ *
+ * @since 1.1.1
+ *
+ * @param string $redirect the url the visitor will be redirected to
+ */
+ $redirect = apply_filters( 'pll_redirect_home', $redirect );
+ if ( $redirect && wp_validate_redirect( $redirect ) ) {
+ $this->maybe_setcookie();
+ header( 'Vary: Accept-Language' );
+ wp_safe_redirect( $redirect, 302, POLYLANG );
+ exit;
+ }
+ }
+ }
+
+ /**
+ * Set the language when posting a comment
+ *
+ * @since 0.8.4
+ *
+ * @param int $post_id the post being commented
+ * @return void
+ */
+ public function pre_comment_on_post( $post_id ) {
+ $this->set_language( $this->model->post->get_language( $post_id ) );
+ }
+
+ /**
+ * Modifies some main query vars for the home page and the page for posts
+ * to enable one home page (and one page for posts) per language.
+ *
+ * @since 1.2
+ *
+ * @param WP_Query $query Instance of WP_Query.
+ * @return void
+ */
+ public function parse_main_query( $query ) {
+ if ( ! $query->is_main_query() ) {
+ return;
+ }
+
+ /**
+ * This filter allows to set the language based on information contained in the main query
+ *
+ * @since 1.8
+ *
+ * @param PLL_Language|false $lang Language object or false.
+ * @param WP_Query $query WP_Query object.
+ */
+ if ( $lang = apply_filters( 'pll_set_language_from_query', false, $query ) ) {
+ $this->set_language( $lang );
+ $this->set_curlang_in_query( $query );
+ } elseif ( ( count( $query->query ) == 1 || ( is_paged() && count( $query->query ) == 2 ) ) && $lang = get_query_var( 'lang' ) ) {
+ $lang = $this->model->get_language( $lang );
+ $this->set_language( $lang ); // Set the language now otherwise it will be too late to filter sticky posts!
+
+ // Set is_home on translated home page when it displays posts. It must be true on page 2, 3... too.
+ $query->is_home = true;
+ $query->is_tax = false;
+ $query->is_archive = false;
+
+ // Filters is_front_page() in case a static front page is not translated in this language.
+ add_filter( 'option_show_on_front', array( $this, 'filter_option_show_on_front' ) );
+ }
+ }
+
+ /**
+ * Filters the option show_on_front when the current front page displays posts.
+ *
+ * This is useful when a static front page is not translated in all languages.
+ *
+ * @return string
+ */
+ public function filter_option_show_on_front() {
+ return 'posts';
+ }
+
+ /**
+ * Sets the current language in the query.
+ *
+ * @since 2.2
+ *
+ * @param WP_Query $query Instance of WP_Query.
+ * @return void
+ */
+ protected function set_curlang_in_query( &$query ) {
+ if ( ! empty( $this->curlang ) ) {
+ $pll_query = new PLL_Query( $query, $this->model );
+ $pll_query->set_language( $this->curlang );
+ }
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-auto-translate.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-auto-translate.php
new file mode 100644
index 000000000..8c1d4e86f
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-auto-translate.php
@@ -0,0 +1,331 @@
+model = &$polylang->model;
+ $this->curlang = &$polylang->curlang;
+
+ add_action( 'parse_query', array( $this, 'translate_included_ids_in_query' ), 100 ); // After all Polylang filters.
+ add_filter( 'get_terms_args', array( $this, 'get_terms_args' ), 20, 2 );
+ }
+
+ /**
+ * Helper function to get the translated post in the current language.
+ *
+ * @since 1.8
+ *
+ * @param int $post_id The ID of the post to translate.
+ * @return int
+ *
+ * @phpstan-return int<0, max>
+ */
+ protected function get_post( $post_id ) {
+ return $this->model->post->get( $post_id, $this->curlang );
+ }
+
+ /**
+ * Helper function to get the translated term in the current language.
+ *
+ * @since 1.8
+ *
+ * @param int $term_id The ID of the term to translate.
+ * @return int
+ *
+ * @phpstan-return int<0, max>
+ */
+ protected function get_term( $term_id ) {
+ return $this->model->term->get( $term_id, $this->curlang );
+ }
+
+ /**
+ * Filters posts query to automatically translate included ids
+ *
+ * @since 1.1
+ *
+ * @param WP_Query $query WP_Query object
+ * @return void
+ */
+ public function translate_included_ids_in_query( $query ) {
+ global $wpdb;
+ $qv = &$query->query_vars;
+
+ if ( $query->is_main_query() || isset( $qv['lang'] ) || ( ! empty( $qv['post_type'] ) && ! $this->model->is_translated_post_type( $qv['post_type'] ) ) ) {
+ return;
+ }
+
+ // /!\ always keep untranslated as is
+
+ // Term ids separated by a comma
+ $arr = array();
+ if ( ! empty( $qv['cat'] ) ) {
+ foreach ( explode( ',', $qv['cat'] ) as $cat ) {
+ $tr = $this->get_term( abs( $cat ) );
+ $arr[] = $cat < 0 ? -$tr : $tr;
+ }
+
+ $qv['cat'] = implode( ',', $arr );
+ }
+
+ // Category_name
+ $arr = array();
+ if ( ! empty( $qv['category_name'] ) ) {
+ foreach ( explode( ',', $qv['category_name'] ) as $slug ) {
+ $arr[] = $this->get_translated_term_by( 'slug', $slug, 'category' );
+ }
+
+ $qv['category_name'] = implode( ',', $arr );
+ }
+
+ // Array of term ids
+ foreach ( array( 'category__and', 'category__in', 'category__not_in', 'tag__and', 'tag__in', 'tag__not_in' ) as $key ) {
+ $arr = array();
+ if ( ! empty( $qv[ $key ] ) ) {
+ foreach ( $qv[ $key ] as $cat ) {
+ $arr[] = ( $tr = $this->get_term( $cat ) ) ? $tr : $cat;
+ }
+ $qv[ $key ] = $arr;
+ }
+ }
+
+ // Tag
+ if ( ! empty( $qv['tag'] ) ) {
+ $qv['tag'] = $this->translate_terms_list( $qv['tag'], 'post_tag' );
+ }
+
+ // tag_id can only take one id
+ if ( ! empty( $qv['tag_id'] ) && $tr_id = $this->get_term( $qv['tag_id'] ) ) {
+ $qv['tag_id'] = $tr_id;
+ }
+
+ // Array of tag slugs
+ foreach ( array( 'tag_slug__and', 'tag_slug__in' ) as $key ) {
+ $arr = array();
+ if ( ! empty( $qv[ $key ] ) ) {
+ foreach ( $qv[ $key ] as $slug ) {
+ $arr[] = $this->get_translated_term_by( 'slug', $slug, 'post_tag' );
+ }
+
+ $qv[ $key ] = $arr;
+ }
+ }
+
+ // Custom taxonomies
+ // According to the codex, this type of query is deprecated as of WP 3.1 but it does not appear in WP 3.5 source code
+ foreach ( array_intersect( $this->model->get_translated_taxonomies(), get_taxonomies( array( '_builtin' => false ) ) ) as $taxonomy ) {
+ $tax = get_taxonomy( $taxonomy );
+ if ( ! empty( $tax ) && ! empty( $qv[ $tax->query_var ] ) ) {
+ $qv[ $tax->query_var ] = $this->translate_terms_list( $qv[ $tax->query_var ], $taxonomy );
+ }
+ }
+
+ // Tax_query since WP 3.1
+ if ( ! empty( $qv['tax_query'] ) && is_array( $qv['tax_query'] ) ) {
+ $qv['tax_query'] = $this->translate_tax_query_recursive( $qv['tax_query'] );
+ }
+
+ // p, page_id, post_parent can only take one id
+ foreach ( array( 'p', 'page_id', 'post_parent' ) as $key ) {
+ if ( ! empty( $qv[ $key ] ) && $tr_id = $this->get_post( $qv[ $key ] ) ) {
+ $qv[ $key ] = $tr_id;
+ }
+ }
+
+ // name, can only take one slug
+ if ( ! empty( $qv['name'] ) && is_string( $qv['name'] ) ) {
+ if ( empty( $qv['post_type'] ) ) {
+ $post_types = array( 'post' );
+ } elseif ( 'any' === $qv['post_type'] ) {
+ $post_types = get_post_types( array( 'exclude_from_search' => false ) ); // May return a empty array
+ } else {
+ $post_types = (array) $qv['post_type'];
+ }
+
+ if ( ! empty( $post_types ) ) {
+ // No function to get post by name except get_posts itself
+ $id = $wpdb->get_var(
+ sprintf(
+ "SELECT ID from {$wpdb->posts}
+ WHERE {$wpdb->posts}.post_type IN ( '%s' )
+ AND post_name='%s'",
+ implode( "', '", esc_sql( $post_types ) ),
+ esc_sql( $qv['name'] )
+ )
+ );
+ $qv['name'] = ( $id && ( $tr_id = $this->get_post( $id ) ) && $tr = get_post( $tr_id ) ) ? $tr->post_name : $qv['name'];
+ }
+ }
+
+ // pagename, the page id is already available in queried_object_id
+ if ( ! empty( $qv['pagename'] ) && ! empty( $query->queried_object_id ) && $tr_id = $this->get_post( $query->queried_object_id ) ) {
+ $query->queried_object_id = $tr_id;
+ $qv['pagename'] = get_page_uri( $tr_id );
+ }
+
+ // Array of post ids
+ // post_parent__in & post_parent__not_in since WP 3.6
+ foreach ( array( 'post__in', 'post__not_in', 'post_parent__in', 'post_parent__not_in' ) as $key ) { // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn
+ $arr = array();
+ if ( ! empty( $qv[ $key ] ) ) {
+ // post__in used by the 2 functions below
+ // Useless to filter them as output is already in the right language and would result in performance loss
+ foreach ( debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ) as $trace ) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions
+ if ( in_array( $trace['function'], array( 'wp_nav_menu', 'gallery_shortcode' ) ) ) {
+ return;
+ }
+ }
+
+ foreach ( $qv[ $key ] as $p ) {
+ $arr[] = ( $tr = $this->get_post( $p ) ) ? $tr : $p;
+ }
+
+ $qv[ $key ] = $arr;
+ }
+ }
+ }
+
+ /**
+ * Filters the terms query to automatically translate included ids.
+ *
+ * @since 1.1.1
+ *
+ * @param array $args An array of get_terms() arguments.
+ * @param array $taxonomies An array of taxonomy names.
+ * @return array
+ */
+ public function get_terms_args( $args, $taxonomies ) {
+ if ( ! isset( $args['lang'] ) && ! empty( $args['include'] ) && ( empty( $taxonomies ) || $this->model->is_translated_taxonomy( $taxonomies ) ) ) {
+ $arr = array();
+
+ foreach ( wp_parse_id_list( $args['include'] ) as $id ) {
+ $arr[] = ( $tr = $this->get_term( $id ) ) ? $tr : $id;
+ }
+
+ $args['include'] = $arr;
+ }
+ return $args;
+ }
+
+ /**
+ * Translates tax queries
+ * Compatible with nested tax queries introduced in WP 4.1
+ *
+ * @since 1.7
+ *
+ * @param array $tax_queries An array of tax queries.
+ * @return array Translated tax queries.
+ */
+ protected function translate_tax_query_recursive( $tax_queries ) {
+ foreach ( $tax_queries as $key => $q ) {
+ if ( ! is_array( $q ) ) {
+ continue;
+ }
+
+ if ( isset( $q['taxonomy'], $q['terms'] ) && $this->model->is_translated_taxonomy( $q['taxonomy'] ) ) {
+ $arr = array();
+ $field = isset( $q['field'] ) && in_array( $q['field'], array( 'slug', 'name' ) ) ? $q['field'] : 'term_id';
+ foreach ( (array) $q['terms'] as $t ) {
+ $arr[] = $this->get_translated_term_by( $field, $t, $q['taxonomy'] );
+ }
+
+ $tax_queries[ $key ]['terms'] = $arr;
+ } else {
+ // Nested queries.
+ $tax_queries[ $key ] = $this->translate_tax_query_recursive( $q );
+ }
+ }
+
+ return $tax_queries;
+ }
+
+ /**
+ * Translates a term given one field.
+ *
+ * @since 2.3.3
+ *
+ * @param string $field Either 'slug', 'name', 'term_id', or 'term_taxonomy_id'
+ * @param string|int $term Search for this term value
+ * @param string $taxonomy Taxonomy name.
+ * @return string|int Translated term slug, name, term_id or term_taxonomy_id
+ */
+ protected function get_translated_term_by( $field, $term, $taxonomy ) {
+ if ( 'term_id' === $field ) {
+ if ( $tr_id = $this->get_term( $term ) ) {
+ return $tr_id;
+ }
+ } else {
+ $terms = get_terms( array( 'taxonomy' => $taxonomy, $field => $term, 'lang' => '' ) );
+
+ if ( ! empty( $terms ) && is_array( $terms ) ) {
+ $t = reset( $terms );
+ if ( ! $t instanceof WP_Term ) {
+ return $term;
+ }
+ $tr_id = $this->get_term( $t->term_id );
+
+ if ( ! is_wp_error( $tr = get_term( $tr_id, $taxonomy ) ) ) {
+ return $tr->$field;
+ }
+ }
+ }
+ return $term;
+ }
+
+ /**
+ * Translates a list of term slugs provided either as an array or a string
+ * with slugs separated by a comma or a '+'.
+ *
+ * @since 3.2.8
+ *
+ * @param string|string[] $query_var The list of term slugs.
+ * @param string $taxonomy The taxonomy for terms.
+ * @return string|string[] The translated list.
+ */
+ protected function translate_terms_list( $query_var, $taxonomy ) {
+ $slugs = array();
+
+ if ( is_array( $query_var ) ) {
+ $slugs = &$query_var;
+ } elseif ( is_string( $query_var ) ) {
+ $sep = strpos( $query_var, ',' ) !== false ? ',' : '+'; // Two possible separators.
+ $slugs = explode( $sep, $query_var );
+ }
+
+ foreach ( $slugs as &$slug ) {
+ $slug = $this->get_translated_term_by( 'slug', $slug, $taxonomy );
+ }
+
+ if ( ! empty( $sep ) ) {
+ $query_var = implode( $sep, $slugs );
+ }
+
+ return $query_var;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-links.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-links.php
new file mode 100644
index 000000000..f63bff1f6
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-links.php
@@ -0,0 +1,350 @@
+
+ */
+ public $cache;
+
+ /**
+ * Stores a list of files and functions that home_url() must not filter.
+ *
+ * @var array
+ */
+ private $black_list = array();
+
+ /**
+ * Stores a list of files and functions that home_url() must filter.
+ *
+ * @var array
+ */
+ private $white_list = array();
+
+ /**
+ * Constructor
+ * Adds filters once the language is defined
+ * Low priority on links filters to come after any other modification
+ *
+ * @since 1.8
+ *
+ * @param object $polylang The Polylang object.
+ */
+ public function __construct( &$polylang ) {
+ parent::__construct( $polylang );
+
+ $this->curlang = &$polylang->curlang;
+ $this->cache = new PLL_Cache();
+
+ // Rewrites author and date links to filter them by language
+ foreach ( array( 'feed_link', 'author_link', 'search_link', 'year_link', 'month_link', 'day_link' ) as $filter ) {
+ add_filter( $filter, array( $this, 'archive_link' ), 20 );
+ }
+
+ // Meta in the html head section
+ add_action( 'wp_head', array( $this, 'wp_head' ), 1 );
+
+ // Modifies the home url
+ if ( pll_get_constant( 'PLL_FILTER_HOME_URL', true ) ) {
+ add_filter( 'home_url', array( $this, 'home_url' ), 10, 2 );
+ }
+
+ if ( $this->options['force_lang'] > 1 ) {
+ // Rewrites next and previous post links when not automatically done by WordPress
+ add_filter( 'get_pagenum_link', array( $this, 'archive_link' ), 20 );
+
+ add_filter( 'get_shortlink', array( $this, 'shortlink' ), 20, 2 );
+
+ // Rewrites ajax url
+ add_filter( 'admin_url', array( $this, 'admin_url' ), 10, 2 );
+ }
+ }
+
+ /**
+ * Modifies the author and date links to add the language parameter (as well as feed link).
+ *
+ * @since 0.4
+ *
+ * @param string $link The permalink to the archive.
+ * @return string The modified link.
+ */
+ public function archive_link( $link ) {
+ return $this->links_model->switch_language_in_link( $link, $this->curlang );
+ }
+
+ /**
+ * Modifies page links
+ * and caches the result
+ *
+ * @since 1.7
+ *
+ * @param string $link The page link.
+ * @param int $post_id The post ID.
+ * @return string The modified page link.
+ */
+ public function _get_page_link( $link, $post_id ) {
+ $cache_key = "post:{$post_id}:{$link}";
+ if ( false === $_link = $this->cache->get( $cache_key ) ) {
+ $_link = parent::_get_page_link( $link, $post_id );
+ $this->cache->set( $cache_key, $_link );
+ }
+ return $_link;
+ }
+
+ /**
+ * Modifies attachment links
+ * and caches the result
+ *
+ * @since 1.6.2
+ *
+ * @param string $link The attachment link.
+ * @param int $post_id The attachment post ID.
+ * @return string The modified attachment link.
+ */
+ public function attachment_link( $link, $post_id ) {
+ $cache_key = "post:{$post_id}:{$link}";
+ if ( false === $_link = $this->cache->get( $cache_key ) ) {
+ $_link = parent::attachment_link( $link, $post_id );
+ $this->cache->set( $cache_key, $_link );
+ }
+ return $_link;
+ }
+
+ /**
+ * Modifies custom posts links
+ * and caches the result.
+ *
+ * @since 1.6
+ *
+ * @param string $link The post link.
+ * @param WP_Post $post The post object.
+ * @return string The modified post link.
+ */
+ public function post_type_link( $link, $post ) {
+ $cache_key = "post:{$post->ID}:{$link}";
+ if ( false === $_link = $this->cache->get( $cache_key ) ) {
+ $_link = parent::post_type_link( $link, $post );
+ $this->cache->set( $cache_key, $_link );
+ }
+ return $_link;
+ }
+
+ /**
+ * Modifies filtered taxonomies ( post format like ) and translated taxonomies links
+ * and caches the result.
+ *
+ * @since 0.7
+ *
+ * @param string $link The term link.
+ * @param WP_Term $term The term object.
+ * @param string $tax The taxonomy name.
+ * @return string The modified link.
+ */
+ public function term_link( $link, $term, $tax ) {
+ $cache_key = "term:{$term->term_id}:{$link}";
+ if ( false === $_link = $this->cache->get( $cache_key ) ) {
+ if ( in_array( $tax, $this->model->get_filtered_taxonomies() ) ) {
+ $_link = $this->links_model->switch_language_in_link( $link, $this->curlang );
+
+ /** This filter is documented in include/filters-links.php */
+ $_link = apply_filters( 'pll_term_link', $_link, $this->curlang, $term );
+ }
+
+ else {
+ $_link = parent::term_link( $link, $term, $tax );
+ }
+ $this->cache->set( $cache_key, $_link );
+ }
+ return $_link;
+ }
+
+ /**
+ * Modifies the post short link when using one domain or subdomain per language.
+ *
+ * @since 2.6.9
+ *
+ * @param string $link Post permalink.
+ * @param int $post_id Post id.
+ * @return string Post permalink with the correct domain.
+ */
+ public function shortlink( $link, $post_id ) {
+ $post_type = get_post_type( $post_id );
+ return $this->model->is_translated_post_type( $post_type ) ? $this->links_model->switch_language_in_link( $link, $this->model->post->get_language( $post_id ) ) : $link;
+ }
+
+ /**
+ * Outputs references to translated pages ( if exists ) in the html head section
+ *
+ * @since 0.1
+ *
+ * @return void
+ */
+ public function wp_head() {
+ // Don't output anything on paged archives: see https://wordpress.org/support/topic/hreflang-on-page2
+ // Don't output anything on paged pages and paged posts
+ if ( is_paged() || ( is_singular() && ( $page = get_query_var( 'page' ) ) && $page > 1 ) ) {
+ return;
+ }
+
+ $urls = array();
+
+ // Google recommends to include self link https://support.google.com/webmasters/answer/189077?hl=en
+ foreach ( $this->model->get_languages_list() as $language ) {
+ if ( $url = $this->links->get_translation_url( $language ) ) {
+ $urls[ $language->get_locale( 'display' ) ] = $url;
+ }
+ }
+
+ // Outputs the section only if there are translations ( $urls always contains self link )
+ if ( ! empty( $urls ) && count( $urls ) > 1 ) {
+ $languages = array();
+ $hreflangs = array();
+
+ // Prepare the list of languages to remove the country code
+ foreach ( array_keys( $urls ) as $locale ) {
+ $split = explode( '-', $locale );
+ $languages[ $locale ] = reset( $split );
+ }
+
+ $count = array_count_values( $languages );
+
+ foreach ( $urls as $locale => $url ) {
+ $lang = $count[ $languages[ $locale ] ] > 1 ? $locale : $languages[ $locale ]; // Output the country code only when necessary
+ $hreflangs[ $lang ] = $url;
+ }
+
+ // Adds the site root url when the default language code is not hidden
+ // See https://wordpress.org/support/topic/implementation-of-hreflangx-default
+ if ( is_front_page() && ! $this->options['hide_default'] && $this->options['force_lang'] < 3 ) {
+ $hreflangs['x-default'] = home_url( '/' );
+ }
+
+ /**
+ * Filters the list of rel hreflang attributes
+ *
+ * @since 2.1
+ *
+ * @param array $hreflangs Array of urls with language codes as keys
+ */
+ $hreflangs = apply_filters( 'pll_rel_hreflang_attributes', $hreflangs );
+
+ foreach ( $hreflangs as $lang => $url ) {
+ printf( '' . "\n", esc_url( $url ), esc_attr( $lang ) );
+ }
+ }
+ }
+
+ /**
+ * Filters the home url to get the right language.
+ *
+ * @since 0.4
+ *
+ * @param string $url The home URL including scheme and path.
+ * @param string $path Path relative to the home URL.
+ * @return string
+ */
+ public function home_url( $url, $path ) {
+ if ( ! ( did_action( 'template_redirect' ) || did_action( 'login_init' ) ) || rtrim( $url, '/' ) != $this->links_model->home ) {
+ return $url;
+ }
+
+ // We *want* to filter the home url in these cases
+ if ( empty( $this->white_list ) ) {
+ // On Windows get_theme_root() mixes / and \
+ // We want only \ for the comparison with debug_backtrace
+ $theme_root = get_theme_root();
+ $theme_root = ( false === strpos( $theme_root, '\\' ) ) ? $theme_root : str_replace( '/', '\\', $theme_root );
+
+ $white_list = array(
+ array( 'file' => $theme_root ),
+ array( 'function' => 'wp_nav_menu' ),
+ array( 'function' => 'login_footer' ),
+ array( 'function' => 'get_custom_logo' ),
+ array( 'function' => 'render_block_core_site_title' ),
+ );
+
+ if ( 3 === $this->options['force_lang'] ) {
+ $white_list[] = array( 'function' => 'redirect_canonical' );
+ }
+
+ /**
+ * Filters the white list of the Polylang 'home_url' filter.
+ *
+ * @since 1.1.2
+ *
+ * @param string[][] $white_list An array of arrays each of them having a 'file' key
+ * and/or a 'function' key to decide which functions in
+ * which files using home_url() calls must be filtered.
+ */
+ $this->white_list = apply_filters( 'pll_home_url_white_list', $white_list );
+ }
+
+ // We don't want to filter the home url in these cases.
+ if ( empty( $this->black_list ) ) {
+ $black_list = array(
+ array( 'file' => 'searchform.php' ), // Since WP 3.6 searchform.php is passed through get_search_form.
+ array( 'function' => 'get_search_form' ),
+ );
+
+ /**
+ * Filters the black list of the Polylang 'home_url' filter.
+ *
+ * @since 1.1.2
+ *
+ * @param string[][] $black_list An array of arrays each of them having a 'file' key
+ * and/or a 'function' key to decide which functions in
+ * which files using home_url() calls must be filtered.
+ */
+ $this->black_list = apply_filters( 'pll_home_url_black_list', $black_list );
+ }
+
+ $traces = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions
+ unset( $traces[0], $traces[1] ); // We don't need the last 2 calls: this function + call_user_func_array (or apply_filters on PHP7+)
+
+ foreach ( $traces as $trace ) {
+ // Black list first
+ foreach ( $this->black_list as $v ) {
+ if ( ( isset( $trace['file'], $v['file'] ) && false !== strpos( $trace['file'], $v['file'] ) ) || ( ! empty( $v['function'] ) && $trace['function'] === $v['function'] ) ) {
+ return $url;
+ }
+ }
+
+ foreach ( $this->white_list as $v ) {
+ if ( ( ! empty( $v['function'] ) && $trace['function'] === $v['function'] ) ||
+ ( isset( $trace['file'], $v['file'] ) && false !== strpos( $trace['file'], $v['file'] ) && in_array( $trace['function'], array( 'home_url', 'get_home_url', 'bloginfo', 'get_bloginfo' ) ) ) ) {
+ $ok = true;
+ }
+ }
+ }
+
+ return empty( $ok ) ? $url : ( empty( $path ) ? rtrim( $this->links->get_home_url( $this->curlang ), '/' ) : $this->links->get_home_url( $this->curlang ) );
+ }
+
+ /**
+ * Rewrites the ajax url when using domains or subdomains.
+ *
+ * @since 1.5
+ *
+ * @param string $url The admin url with path evaluated by WordPress.
+ * @param string $path Path relative to the admin URL.
+ * @return string
+ */
+ public function admin_url( $url, $path ) {
+ return 'admin-ajax.php' === $path ? $this->links_model->switch_language_in_link( $url, $this->curlang ) : $url;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-search.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-search.php
new file mode 100644
index 000000000..cad7e2227
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-search.php
@@ -0,0 +1,183 @@
+links_model = &$polylang->links_model;
+ $this->curlang = &$polylang->curlang;
+
+ // Adds the language information in the search form
+ // Low priority in case the search form is created using the same filter as described in http://codex.wordpress.org/Function_Reference/get_search_form
+ add_filter( 'get_search_form', array( $this, 'get_search_form' ), 99 );
+
+ // Adds the language information in the search block.
+ add_filter( 'render_block_core/search', array( $this, 'get_search_form' ) );
+
+ // Adds the language information in admin bar search form
+ add_action( 'add_admin_bar_menus', array( $this, 'add_admin_bar_menus' ) );
+
+
+ // Adds javascript at the end of the document
+ // Was used for WP < 3.6. kept just in case
+ if ( defined( 'PLL_SEARCH_FORM_JS' ) && PLL_SEARCH_FORM_JS ) {
+ add_action( 'wp_footer', array( $this, 'wp_print_footer_scripts' ) );
+ }
+ }
+
+ /**
+ * Adds the language information in the search form.
+ *
+ * Does not work if searchform.php ( prior to WP 3.6 ) is used or if the search form is hardcoded in another template file
+ *
+ * @since 0.1
+ *
+ * @param string $form The search form HTML.
+ * @return string Modified search form.
+ */
+ public function get_search_form( $form ) {
+ if ( empty( $form ) || empty( $this->curlang ) ) {
+ return $form;
+ }
+
+ if ( $this->links_model->using_permalinks ) {
+ // Take care to modify only the url in the #s', $form, $matches );
+ $old = reset( $matches );
+ if ( empty( $old ) ) {
+ return $form;
+ }
+ // Replace action attribute (a text with no space and no closing tag within double quotes or simple quotes or without quotes).
+ $new = preg_replace( '#\saction=("[^"\r\n]+"|\'[^\'\r\n]+\'|[^\'"][^>\s]+)#', ' action="' . esc_url( $this->curlang->get_search_url() ) . '"', $old );
+ if ( empty( $new ) ) {
+ return $form;
+ }
+ $form = str_replace( $old, $new, $form );
+ } else {
+ $form = str_replace( '', '', $form );
+ }
+
+ return $form;
+ }
+
+ /**
+ * Adds the language information in the admin bar search form.
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ public function add_admin_bar_menus() {
+ // Backward compatibility with WP < 6.6. The priority was 4 before this version, 9999 since then.
+ $priority = has_action( 'admin_bar_menu', 'wp_admin_bar_search_menu' );
+ if ( ! is_int( $priority ) ) {
+ return;
+ }
+
+ remove_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', $priority );
+ add_action( 'admin_bar_menu', array( $this, 'admin_bar_search_menu' ), $priority );
+ }
+
+ /**
+ * Rewrites the admin bar search form to pass our get_search_form filter. See #21342.
+ * Code last checked: WP 5.4.1.
+ *
+ * @since 0.9
+ *
+ * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance, passed by reference.
+ * @return void
+ */
+ public function admin_bar_search_menu( $wp_admin_bar ) {
+ $form = '';
+
+ $wp_admin_bar->add_node(
+ array(
+ 'parent' => 'top-secondary',
+ 'id' => 'search',
+ 'title' => $this->get_search_form( $form ), // Pass the get_search_form filter.
+ 'meta' => array(
+ 'class' => 'admin-bar-search',
+ 'tabindex' => -1,
+ ),
+ )
+ );
+ }
+
+ /**
+ * Allows modifying the search form if it does not pass get_search_form.
+ *
+ * @since 0.1
+ *
+ * @return void
+ */
+ public function wp_print_footer_scripts() {
+ /*
+ * Don't use directly e[0] just in case there is somewhere else an element named 's'
+ * Check before if the hidden input has not already been introduced by get_search_form ( FIXME: is there a way to improve this ) ?
+ * Thanks to AndyDeGroo for improving the code for compatibility with old browsers
+ * http://wordpress.org/support/topic/development-of-polylang-version-08?replies=6#post-2645559
+ */
+ $lang = esc_js( $this->curlang->slug );
+ $js = "e = document.getElementsByName( 's' );
+ for ( i = 0; i < e.length; i++ ) {
+ if ( e[i].tagName.toUpperCase() == 'INPUT' ) {
+ s = e[i].parentNode.parentNode.children;
+ l = 0;
+ for ( j = 0; j < s.length; j++ ) {
+ if ( s[j].name == 'lang' ) {
+ l = 1;
+ }
+ }
+ if ( l == 0 ) {
+ var ih = document.createElement( 'input' );
+ ih.type = 'hidden';
+ ih.name = 'lang';
+ ih.value = '{$lang}';
+ e[i].parentNode.appendChild( ih );
+ }
+ }
+ }";
+
+ $type_attr = current_theme_supports( 'html5', 'script' ) ? '' : ' type="text/javascript"';
+
+ if ( $type_attr ) {
+ $js = "/* */";
+ }
+
+ echo "\n"; // phpcs:ignore WordPress.Security.EscapeOutput
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-widgets.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-widgets.php
new file mode 100644
index 000000000..bcdf907c0
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters-widgets.php
@@ -0,0 +1,153 @@
+
+ */
+ public $cache;
+
+ /**
+ * Current language.
+ *
+ * @var PLL_Language|null
+ */
+ public $curlang;
+
+ /**
+ * Constructor: setups filters and actions.
+ *
+ * @since 1.2
+ *
+ * @param object $polylang The Polylang object.
+ */
+ public function __construct( &$polylang ) {
+ $this->curlang = &$polylang->curlang;
+ $this->cache = new PLL_Cache();
+
+ add_filter( 'sidebars_widgets', array( $this, 'sidebars_widgets' ) );
+ }
+
+ /**
+ * Remove widgets from sidebars if they are not visible in the current language
+ * Needed to allow is_active_sidebar() to return false if all widgets are not for the current language. See #54
+ *
+ * @since 2.1
+ * @since 2.4 The result is cached as the function can be very expensive in case there are a lot of widgets
+ *
+ * @param array $sidebars_widgets An associative array of sidebars and their widgets
+ * @return array
+ */
+ public function sidebars_widgets( $sidebars_widgets ) {
+ global $wp_registered_widgets;
+
+ if ( empty( $wp_registered_widgets ) ) {
+ return $sidebars_widgets;
+ }
+
+ $cache_key = $this->cache->get_unique_key( 'sidebars_widgets_', $sidebars_widgets );
+ $_sidebars_widgets = $this->cache->get( $cache_key );
+
+ if ( false !== $_sidebars_widgets ) {
+ return $_sidebars_widgets;
+ }
+
+ $sidebars_widgets = $this->filter_widgets_sidebars( $sidebars_widgets, $wp_registered_widgets );
+
+ return $this->cache->set( $cache_key, $sidebars_widgets );
+ }
+
+ /**
+ * Method that handles the removal of widgets in the sidebars depending on their display language.
+ *
+ * @since 3.1
+ *
+ * @param array $widget_data An array containing the widget data
+ * @param array $sidebars_widgets An associative array of sidebars and their widgets
+ * @param string $sidebar Sidebar name
+ * @param int $key Widget number
+ * @return array An associative array of sidebars and their widgets
+ */
+ public function handle_widget_in_sidebar_callback( $widget_data, $sidebars_widgets, $sidebar, $key ) {
+ // Remove the widget if not visible in the current language
+ if ( ! empty( $widget_data['settings'][ $widget_data['number'] ]['pll_lang'] ) && $widget_data['settings'][ $widget_data['number'] ]['pll_lang'] !== $this->curlang->slug ) {
+ unset( $sidebars_widgets[ $sidebar ][ $key ] );
+ }
+ return $sidebars_widgets;
+ }
+
+ /**
+ * Browse the widgets sidebars and sort the ones that should be displayed or not.
+ *
+ * @since 3.1
+ *
+ * @param array $sidebars_widgets An associative array of sidebars and their widgets
+ * @param array $wp_registered_widgets Array of all registered widgets.
+ * @return array An associative array of sidebars and their widgets
+ */
+ public function filter_widgets_sidebars( $sidebars_widgets, $wp_registered_widgets ) {
+ foreach ( $sidebars_widgets as $sidebar => $widgets ) {
+ if ( 'wp_inactive_widgets' === $sidebar || empty( $widgets ) ) {
+ continue;
+ }
+
+ foreach ( $widgets as $key => $widget ) {
+ if ( ! $this->is_widget_object( $wp_registered_widgets, $widget ) ) {
+ continue;
+ }
+
+ $widget_data = $this->get_widget_data( $wp_registered_widgets, $widget );
+
+ $sidebars_widgets = $this->handle_widget_in_sidebar_callback( $widget_data, $sidebars_widgets, $sidebar, $key );
+ }
+ }
+ return $sidebars_widgets;
+ }
+
+ /**
+ * Test if the widget is an object.
+ *
+ * @since 3.1
+ *
+ * @param array $wp_registered_widgets Array of all registered widgets.
+ * @param string $widget String that identifies the widget.
+ * @return bool True if object, false otherwise.
+ */
+ protected function is_widget_object( $wp_registered_widgets, $widget ) {
+ // Nothing can be done if the widget is created using pre WP2.8 API :(
+ // There is no object, so we can't access it to get the widget options
+ return isset( $wp_registered_widgets[ $widget ]['callback'] ) &&
+ is_array( $wp_registered_widgets[ $widget ]['callback'] ) &&
+ isset( $wp_registered_widgets[ $widget ]['callback'][0] ) &&
+ is_object( $wp_registered_widgets[ $widget ]['callback'][0] ) &&
+ method_exists( $wp_registered_widgets[ $widget ]['callback'][0], 'get_settings' );
+ }
+
+ /**
+ * Get widgets settings and number.
+ *
+ * @since 3.1
+ *
+ * @param array $wp_registered_widgets Array of all registered widgets.
+ * @param string $widget String that identifies the widget.
+ * @return array An array containing the widget settings and number.
+ */
+ protected function get_widget_data( $wp_registered_widgets, $widget ) {
+ $widget_settings = $wp_registered_widgets[ $widget ]['callback'][0]->get_settings();
+ $number = $wp_registered_widgets[ $widget ]['params'][0]['number'];
+
+ return array(
+ 'settings' => $widget_settings,
+ 'number' => $number,
+ );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters.php
new file mode 100644
index 000000000..83558128e
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-filters.php
@@ -0,0 +1,210 @@
+options['media_support'] ) {
+ add_filter( 'widget_media_image_instance', array( $this, 'widget_media_instance' ), 1 ); // Since WP 4.8
+ }
+
+ // Strings translation ( must be applied before WordPress applies its default formatting filters )
+ foreach ( array( 'widget_text', 'widget_title' ) as $filter ) {
+ add_filter( $filter, 'pll__', 1 );
+ }
+
+ // Translates biography
+ add_filter( 'get_user_metadata', array( $this, 'get_user_metadata' ), 10, 4 );
+
+ if ( Polylang::is_ajax_on_front() ) {
+ add_filter( 'load_textdomain_mofile', array( $this, 'load_textdomain_mofile' ) );
+ }
+ }
+
+ /**
+ * Returns the locale based on current language
+ *
+ * @since 0.1
+ *
+ * @return string
+ */
+ public function get_locale() {
+ return $this->curlang->locale;
+ }
+
+ /**
+ * Filters sticky posts by current language.
+ *
+ * @since 0.8
+ *
+ * @param int[] $posts List of sticky posts ids.
+ * @return int[] Modified list of sticky posts ids
+ */
+ public function option_sticky_posts( $posts ) {
+ global $wpdb;
+
+ // Do not filter sticky posts on REST requests as $this->curlang is *not* the 'lang' parameter set in the request
+ if ( ! defined( 'REST_REQUEST' ) && ! empty( $this->curlang ) && ! empty( $posts ) ) {
+ $_posts = wp_cache_get( 'sticky_posts', 'options' ); // This option is usually cached in 'all_options' by WP.
+ $tt_id = $this->curlang->get_tax_prop( 'language', 'term_taxonomy_id' );
+
+ if ( empty( $_posts ) || ! is_array( $_posts ) || empty( $_posts[ $tt_id ] ) || ! is_array( $_posts[ $tt_id ] ) ) {
+ $posts = array_map( 'intval', $posts );
+ $posts = implode( ',', $posts );
+
+ $languages = array();
+ foreach ( $this->model->get_languages_list() as $language ) {
+ $languages[] = $language->get_tax_prop( 'language', 'term_taxonomy_id' );
+ }
+
+ $_posts = array_fill_keys( $languages, array() ); // Init with empty arrays
+ $languages = implode( ',', $languages );
+
+ // PHPCS:ignore WordPress.DB.PreparedSQL
+ $relations = $wpdb->get_results( "SELECT object_id, term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN ({$posts}) AND term_taxonomy_id IN ({$languages})" );
+
+ foreach ( $relations as $relation ) {
+ $_posts[ $relation->term_taxonomy_id ][] = (int) $relation->object_id;
+ }
+ wp_cache_add( 'sticky_posts', $_posts, 'options' );
+ }
+
+ $posts = $_posts[ $tt_id ];
+ }
+
+ return $posts;
+ }
+
+ /**
+ * Modifies the sql request for wp_get_archives to filter by the current language
+ *
+ * @since 1.9
+ *
+ * @param string $sql JOIN clause
+ * @param array $r wp_get_archives arguments
+ * @return string modified JOIN clause
+ */
+ public function getarchives_join( $sql, $r ) {
+ return ! empty( $r['post_type'] ) && $this->model->is_translated_post_type( $r['post_type'] ) ? $sql . $this->model->post->join_clause() : $sql;
+ }
+
+ /**
+ * Modifies the sql request for wp_get_archives to filter by the current language
+ *
+ * @since 1.9
+ *
+ * @param string $sql WHERE clause
+ * @param array $r wp_get_archives arguments
+ * @return string modified WHERE clause
+ */
+ public function getarchives_where( $sql, $r ) {
+ if ( ! $this->curlang instanceof PLL_Language ) {
+ return $sql;
+ }
+
+ if ( empty( $r['post_type'] ) || ! $this->model->is_translated_post_type( $r['post_type'] ) ) {
+ return $sql;
+ }
+
+ return $sql . $this->model->post->where_clause( $this->curlang );
+ }
+
+ /**
+ * Filters the widgets according to the current language
+ * Don't display if a language filter is set and this is not the current one
+ * Needed for {@see https://developer.wordpress.org/reference/functions/the_widget/ the_widget()}.
+ *
+ * @since 0.3
+ *
+ * @param array $instance Widget settings
+ * @return bool|array false if we hide the widget, unmodified $instance otherwise
+ */
+ public function widget_display_callback( $instance ) {
+ return ! empty( $instance['pll_lang'] ) && $instance['pll_lang'] != $this->curlang->slug ? false : $instance;
+ }
+
+ /**
+ * Translates media in media widgets
+ *
+ * @since 2.1.5
+ *
+ * @param array $instance Widget instance data
+ * @return array
+ */
+ public function widget_media_instance( $instance ) {
+ if ( empty( $instance['pll_lang'] ) && $instance['attachment_id'] && $tr_id = pll_get_post( $instance['attachment_id'] ) ) {
+ $instance['attachment_id'] = $tr_id;
+ $attachment = get_post( $tr_id );
+
+ if ( $instance['caption'] && ! empty( $attachment->post_excerpt ) ) {
+ $instance['caption'] = $attachment->post_excerpt;
+ }
+
+ if ( $instance['alt'] && $alt_text = get_post_meta( $tr_id, '_wp_attachment_image_alt', true ) ) {
+ $instance['alt'] = $alt_text;
+ }
+
+ if ( $instance['image_title'] && ! empty( $attachment->post_title ) ) {
+ $instance['image_title'] = $attachment->post_title;
+ }
+ }
+ return $instance;
+ }
+
+ /**
+ * Translates the biography.
+ *
+ * @since 0.9
+ *
+ * @param null $null Expecting the default null value.
+ * @param int $id The user id.
+ * @param string $meta_key The metadata key.
+ * @param bool $single Whether to return only the first value of the specified $meta_key.
+ * @return string|null
+ */
+ public function get_user_metadata( $null, $id, $meta_key, $single ) {
+ return 'description' === $meta_key && ! empty( $this->curlang ) && ! $this->curlang->is_default ? get_user_meta( $id, 'description_' . $this->curlang->slug, $single ) : $null;
+ }
+
+ /**
+ * Filters the translation files to load when doing ajax on front
+ * This is needed because WP the language files associated to the user locale when a user is logged in
+ *
+ * @since 2.2.6
+ *
+ * @param string $mofile Translation file name
+ * @return string
+ */
+ public function load_textdomain_mofile( $mofile ) {
+ $user_locale = get_user_locale();
+ return str_replace( "{$user_locale}.mo", "{$this->curlang->locale}.mo", $mofile );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-links.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-links.php
new file mode 100644
index 000000000..364f9d716
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-links.php
@@ -0,0 +1,228 @@
+
+ */
+ public $cache;
+
+ /**
+ * Constructor
+ *
+ * @since 1.2
+ *
+ * @param object $polylang The Polylang object.
+ */
+ public function __construct( &$polylang ) {
+ parent::__construct( $polylang );
+
+ $this->curlang = &$polylang->curlang;
+ $this->cache = new PLL_Cache();
+ }
+
+ /**
+ * Returns the url of the translation (if it exists) of the current page.
+ *
+ * @since 0.1
+ *
+ * @param PLL_Language $language Language object.
+ * @return string
+ */
+ public function get_translation_url( $language ) {
+ global $wp_query;
+
+ if ( false !== $translation_url = $this->cache->get( 'translation_url:' . $language->slug ) ) {
+ return $translation_url;
+ }
+
+ // Make sure that we have the queried object
+ // See https://wordpress.org/support/topic/patch-for-fixing-a-notice
+ $queried_object_id = $wp_query->get_queried_object_id();
+
+ /**
+ * Filters the translation url before Polylang attempts to find one.
+ * Internally used by Polylang for the static front page and posts page.
+ *
+ * @since 1.8
+ *
+ * @param string $url Empty string or the url of the translation of the current page.
+ * @param PLL_Language $language Language of the translation.
+ * @param int $queried_object_id Queried object ID.
+ */
+ if ( ! $url = apply_filters( 'pll_pre_translation_url', '', $language, $queried_object_id ) ) {
+ $qv = $wp_query->query_vars;
+
+ // Post and attachment
+ if ( is_single() && ( $this->options['media_support'] || ! is_attachment() ) && ( $id = $this->model->post->get( $queried_object_id, $language ) ) && $this->model->post->current_user_can_read( $id ) ) {
+ $url = get_permalink( $id );
+ }
+
+ // Page
+ elseif ( is_page() && ( $id = $this->model->post->get( $queried_object_id, $language ) ) && $this->model->post->current_user_can_read( $id ) ) {
+ $url = get_page_link( $id );
+ }
+
+ elseif ( is_search() ) {
+ $url = $this->get_archive_url( $language );
+
+ // Special case for search filtered by translated taxonomies: taxonomy terms are translated in the translation url
+ if ( ! empty( $wp_query->tax_query->queries ) ) {
+ foreach ( $wp_query->tax_query->queries as $tax_query ) {
+ if ( ! empty( $tax_query['taxonomy'] ) && $this->model->is_translated_taxonomy( $tax_query['taxonomy'] ) ) {
+
+ $tax = get_taxonomy( $tax_query['taxonomy'] );
+ $terms = get_terms( array( 'taxonomy' => $tax->name, 'fields' => 'id=>slug' ) ); // Filtered by current language
+
+ foreach ( $tax_query['terms'] as $slug ) {
+ $term_id = array_search( $slug, $terms ); // What is the term_id corresponding to taxonomy term?
+ if ( $term_id && $term_id = $this->model->term->get_translation( $term_id, $language ) ) { // Get the translated term_id
+ $term = get_term( $term_id, $tax->name );
+
+ if ( ! $term instanceof WP_Term ) {
+ continue;
+ }
+
+ $url = str_replace( $slug, $term->slug, $url );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Translated taxonomy
+ // Take care that is_tax() is false for categories and tags
+ elseif ( ( is_category() || is_tag() || is_tax() ) && ( $term = get_queried_object() ) && $this->model->is_translated_taxonomy( $term->taxonomy ) ) {
+ $lang = $this->model->term->get_language( $term->term_id );
+
+ if ( ! $lang || $language->slug == $lang->slug ) {
+ $url = get_term_link( $term, $term->taxonomy ); // Self link
+ }
+
+ elseif ( $tr_id = $this->model->term->get_translation( $term->term_id, $language ) ) {
+ $tr_term = get_term( $tr_id, $term->taxonomy );
+ if ( $tr_term instanceof WP_Term ) {
+ // Check if translated term ( or children ) have posts
+ $count = $tr_term->count || ( is_taxonomy_hierarchical( $term->taxonomy ) && array_sum( wp_list_pluck( get_terms( array( 'taxonomy' => $term->taxonomy, 'child_of' => $tr_term->term_id, 'lang' => $language->slug ) ), 'count' ) ) );
+
+ /**
+ * Filter whether to hide an archive translation url
+ *
+ * @since 2.2.4
+ *
+ * @param bool $hide True to hide the translation url.
+ * defaults to true when the translated archive is empty, false otherwise.
+ * @param string $lang The language code of the translation
+ * @param array $args Arguments used to evaluated the number of posts in the archive
+ */
+ if ( ! apply_filters( 'pll_hide_archive_translation_url', ! $count, $language->slug, array( 'taxonomy' => $term->taxonomy ) ) ) {
+ $url = get_term_link( $tr_term, $term->taxonomy );
+ }
+ }
+ }
+ }
+
+ // Post type archive
+ elseif ( is_post_type_archive() ) {
+ if ( $this->model->is_translated_post_type( $qv['post_type'] ) ) {
+ $args = array( 'post_type' => $qv['post_type'] );
+ $count = $this->model->count_posts( $language, $args );
+
+ /** This filter is documented in frontend/frontend-links.php */
+ if ( ! apply_filters( 'pll_hide_archive_translation_url', ! $count, $language->slug, $args ) ) {
+ $url = $this->get_archive_url( $language );
+ }
+ }
+ }
+
+ // Other archives
+ elseif ( is_archive() ) {
+ $keys = array( 'post_type', 'm', 'year', 'monthnum', 'day', 'author', 'author_name' );
+ $keys = array_merge( $keys, $this->model->get_filtered_taxonomies_query_vars() );
+ $args = array_intersect_key( $qv, array_flip( $keys ) );
+ $count = $this->model->count_posts( $language, $args );
+
+ /** This filter is documented in frontend/frontend-links.php */
+ if ( ! apply_filters( 'pll_hide_archive_translation_url', ! $count, $language->slug, $args ) ) {
+ $url = $this->get_archive_url( $language );
+ }
+ }
+
+ // Front page when it is the list of posts
+ elseif ( is_front_page() ) {
+ $url = $this->get_home_url( $language );
+ }
+ }
+
+ $url = ! empty( $url ) && ! is_wp_error( $url ) ? $url : null;
+
+ /**
+ * Filter the translation url of the current page before Polylang caches it
+ *
+ * @since 1.1.2
+ *
+ * @param null|string $url The translation url, null if none was found
+ * @param string $language The language code of the translation
+ */
+ $translation_url = (string) apply_filters( 'pll_translation_url', $url, $language->slug );
+
+ // Don't cache before template_redirect to avoid a conflict with Barrel + WP Bakery Page Builder
+ if ( did_action( 'template_redirect' ) ) {
+ $this->cache->set( 'translation_url:' . $language->slug, $translation_url );
+ }
+
+ return $translation_url;
+ }
+
+ /**
+ * Get the translation of the current archive url
+ * used also for search
+ *
+ * @since 1.2
+ *
+ * @param PLL_Language $language An object representing a language.
+ * @return string
+ */
+ public function get_archive_url( $language ) {
+ $url = pll_get_requested_url();
+ $url = $this->links_model->switch_language_in_link( $url, $language );
+ $url = $this->links_model->remove_paged_from_link( $url );
+
+ /**
+ * Filter the archive url
+ *
+ * @since 1.6
+ *
+ * @param string $url Url of the archive
+ * @param object $language Language of the archive
+ */
+ return apply_filters( 'pll_get_archive_url', $url, $language );
+ }
+
+ /**
+ * Returns the home url in the right language.
+ *
+ * @since 0.1
+ *
+ * @param PLL_Language|string $language Optional, defaults to current language.
+ * @param bool $is_search Optional, whether we need the home url for a search form, defaults to false.
+ */
+ public function get_home_url( $language = '', $is_search = false ) {
+ if ( empty( $language ) ) {
+ $language = $this->curlang;
+ }
+
+ return parent::get_home_url( $language, $is_search );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-nav-menu.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-nav-menu.php
new file mode 100644
index 000000000..c4ac02a60
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-nav-menu.php
@@ -0,0 +1,339 @@
+curlang = &$polylang->curlang;
+
+ // Split the language switcher menu item in several language menu items
+ add_filter( 'wp_get_nav_menu_items', array( $this, 'wp_get_nav_menu_items' ), 20 ); // after the customizer menus
+ add_filter( 'wp_nav_menu_objects', array( $this, 'wp_nav_menu_objects' ) );
+ add_filter( 'nav_menu_link_attributes', array( $this, 'nav_menu_link_attributes' ), 10, 2 );
+
+ // Filters menus by language
+ add_filter( 'theme_mod_nav_menu_locations', array( $this, 'nav_menu_locations' ), 20 );
+ add_filter( 'wp_nav_menu_args', array( $this, 'wp_nav_menu_args' ) );
+
+ // The customizer
+ if ( isset( $_POST['wp_customize'], $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ add_filter( 'wp_nav_menu_args', array( $this, 'filter_args_before_customizer' ) );
+ add_filter( 'wp_nav_menu_args', array( $this, 'filter_args_after_customizer' ), 2000 );
+ }
+ }
+
+ /**
+ * Sorts menu items by menu order.
+ *
+ * @since 1.7.9
+ *
+ * @param stdClass $a The first object to compare.
+ * @param stdClass $b The second object to compare.
+ * @return int -1 or 1 if $a is considered to be respectively less than or greater than $b.
+ */
+ protected function usort_menu_items( $a, $b ) {
+ return ( $a->menu_order < $b->menu_order ) ? -1 : 1;
+ }
+
+ /**
+ * Format a language switcher menu item title based on options
+ *
+ * @since 2.2.6
+ *
+ * @param string $flag Formatted flag
+ * @param string $name Language name
+ * @param array $options Language switcher options
+ * @return string Formatted menu item title
+ */
+ protected function get_item_title( $flag, $name, $options ) {
+ if ( $options['show_flags'] ) {
+ if ( $options['show_names'] ) {
+ $title = sprintf( '%1$s%3$s', $flag, is_rtl() ? 'right' : 'left', esc_html( $name ) );
+ } else {
+ $title = $flag;
+ }
+ } else {
+ $title = esc_html( $name );
+ }
+ return $title;
+ }
+
+ /**
+ * Splits the one language switcher menu item of backend in several menu items on frontend.
+ * Takes care to menu_order as it is used later in wp_nav_menu().
+ *
+ * @since 1.1.1
+ *
+ * @param stdClass[] $items Menu items.
+ * @return stdClass[] Modified menu items.
+ */
+ public function wp_get_nav_menu_items( $items ) {
+ if ( empty( $this->curlang ) ) {
+ return $items;
+ }
+
+ if ( doing_action( 'customize_register' ) ) { // needed since WP 4.3, doing_action available since WP 3.9
+ return $items;
+ }
+
+ // The customizer menus does not sort the items and we need them to be sorted before splitting the language switcher
+ usort( $items, array( $this, 'usort_menu_items' ) );
+
+ $new_items = array();
+
+ $offset = 0;
+
+ foreach ( $items as $item ) {
+ if ( $options = get_post_meta( $item->ID, '_pll_menu_item', true ) ) {
+ /** This filter is documented in include/switcher.php */
+ $options = apply_filters( 'pll_the_languages_args', $options ); // Honor the filter here for 'show_flags', 'show_names' and 'dropdown'.
+
+ $switcher = new PLL_Switcher();
+ $args = array_merge( array( 'raw' => 1 ), $options );
+
+ /** @var array */
+ $the_languages = $switcher->the_languages( PLL()->links, $args );
+
+ // parent item for dropdown
+ if ( ! empty( $options['dropdown'] ) ) {
+ $name = isset( $options['display_names_as'] ) && 'slug' === $options['display_names_as'] ? $this->curlang->slug : $this->curlang->name;
+ $item->title = $this->get_item_title( $this->curlang->get_display_flag( empty( $options['show_names'] ) ? 'alt' : 'no-alt' ), $name, $options );
+ $item->attr_title = '';
+ $item->classes = array( 'pll-parent-menu-item' );
+ $item->menu_order += $offset;
+ $new_items[] = $item;
+ ++$offset;
+ }
+
+ $i = 0; // for incrementation of menu order only in case of dropdown
+ foreach ( $the_languages as $lang ) {
+ ++$i;
+ $lang_item = clone $item;
+ $lang_item->ID = $lang_item->ID . '-' . $lang['slug']; // A unique ID
+ $lang_item->title = $this->get_item_title( $lang['flag'], $lang['name'], $options );
+ $lang_item->attr_title = '';
+ $lang_item->url = $lang['url'];
+ $lang_item->lang = $lang['locale']; // Save this for use in nav_menu_link_attributes
+ $lang_item->classes = $lang['classes'];
+ if ( ! empty( $options['dropdown'] ) ) {
+ $lang_item->menu_order = $item->menu_order + $i;
+ $lang_item->menu_item_parent = $item->db_id;
+ $lang_item->db_id = 0; // to avoid recursion
+ } else {
+ $lang_item->menu_order += $offset;
+ }
+ $new_items[] = $lang_item;
+ ++$offset;
+ }
+ --$offset;
+ } else {
+ $item->menu_order += $offset;
+ $new_items[] = $item;
+ }
+ }
+ return $new_items;
+ }
+
+ /**
+ * Returns the ancestors of a menu item.
+ *
+ * @since 1.1.1
+ *
+ * @param stdClass $item Menu item.
+ * @return int[] Ancestors ids.
+ */
+ public function get_ancestors( $item ) {
+ $ids = array();
+ $_anc_id = (int) $item->db_id;
+ while ( ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) && ! in_array( $_anc_id, $ids ) ) {
+ $ids[] = $_anc_id;
+ }
+ return $ids;
+ }
+
+ /**
+ * Removes current-menu and current-menu-ancestor classes to lang switcher when not on the home page.
+ *
+ * @since 1.1.1
+ *
+ * @param stdClass[] $items An array of menu items.
+ * @return stdClass[]
+ */
+ public function wp_nav_menu_objects( $items ) {
+ $r_ids = $k_ids = array();
+
+ foreach ( $items as $item ) {
+ if ( ! empty( $item->classes ) && is_array( $item->classes ) ) {
+ if ( in_array( 'current-lang', $item->classes ) ) {
+ $item->current = false;
+ $item->classes = array_diff( $item->classes, array( 'current-menu-item' ) );
+ $r_ids = array_merge( $r_ids, $this->get_ancestors( $item ) ); // Remove the classes for these ancestors
+ } elseif ( in_array( 'current-menu-item', $item->classes ) ) {
+ $k_ids = array_merge( $k_ids, $this->get_ancestors( $item ) ); // Keep the classes for these ancestors
+ }
+ }
+ }
+
+ $r_ids = array_diff( $r_ids, $k_ids );
+
+ foreach ( $items as $item ) {
+ if ( ! empty( $item->db_id ) && in_array( $item->db_id, $r_ids ) ) {
+ $item->classes = array_diff( $item->classes, array( 'current-menu-ancestor', 'current-menu-parent', 'current_page_parent', 'current_page_ancestor' ) );
+ }
+ }
+
+ return $items;
+ }
+
+ /**
+ * Adds hreflang attribute for the language switcher menu items.
+ * available since WP 3.6.
+ *
+ * @since 1.1
+ *
+ * @param string[] $atts HTML attributes applied to the menu item's `` element.
+ * @param stdClass $item Menu item.
+ * @return string[] Modified attributes.
+ */
+ public function nav_menu_link_attributes( $atts, $item ) {
+ if ( isset( $item->lang ) ) {
+ $atts['lang'] = $atts['hreflang'] = esc_attr( $item->lang );
+ }
+ return $atts;
+ }
+
+ /**
+ * Fills the theme nav menus locations with the right menu in the right language
+ * Needs to wait for the language to be defined
+ *
+ * @since 1.2
+ *
+ * @param array|bool $menus list of nav menus locations, false if menu locations have not been filled yet
+ * @return array|bool modified list of nav menus locations
+ */
+ public function nav_menu_locations( $menus ) {
+ if ( is_array( $menus ) && ! empty( $this->curlang ) ) {
+ // First get multilingual menu locations from DB
+ $theme = get_option( 'stylesheet' );
+
+ foreach ( array_keys( $menus ) as $loc ) {
+ $menus[ $loc ] = empty( $this->options['nav_menus'][ $theme ][ $loc ][ $this->curlang->slug ] ) ? 0 : $this->options['nav_menus'][ $theme ][ $loc ][ $this->curlang->slug ];
+ }
+
+ // Support for theme customizer
+ if ( is_customize_preview() ) {
+ global $wp_customize;
+ foreach ( $wp_customize->unsanitized_post_values() as $key => $value ) {
+ if ( false !== strpos( $key, 'nav_menu_locations[' ) ) {
+ $loc = substr( trim( $key, ']' ), 19 );
+ $infos = $this->explode_location( $loc );
+ if ( $infos['lang'] === $this->curlang->slug ) {
+ $menus[ $infos['location'] ] = (int) $value;
+ } elseif ( $this->curlang->is_default ) {
+ $menus[ $loc ] = (int) $value;
+ }
+ }
+ }
+ }
+ }
+ return $menus;
+ }
+
+ /**
+ * Attempts to translate the nav menu when it is hardcoded or when no location is defined in wp_nav_menu().
+ *
+ * @since 1.7.10
+ *
+ * @param array $args Array of `wp_nav_menu()` arguments.
+ * @return array
+ */
+ public function wp_nav_menu_args( $args ) {
+ $theme = get_option( 'stylesheet' );
+
+ if ( empty( $this->curlang ) || empty( $this->options['nav_menus'][ $theme ] ) ) {
+ return $args;
+ }
+
+ // Get the nav menu based on the requested menu
+ $menu = wp_get_nav_menu_object( $args['menu'] );
+
+ // Attempt to find a translation of this menu
+ // This obviously does not work if the nav menu has no associated theme location
+ if ( $menu ) {
+ foreach ( $this->options['nav_menus'][ $theme ] as $menus ) {
+ if ( in_array( $menu->term_id, $menus ) && ! empty( $menus[ $this->curlang->slug ] ) ) {
+ $args['menu'] = $menus[ $this->curlang->slug ];
+ return $args;
+ }
+ }
+ }
+
+ // Get the first menu that has items and and is in the current language if we still can't find a menu
+ if ( ! $menu && ! $args['theme_location'] ) {
+ $menus = wp_get_nav_menus();
+ foreach ( $menus as $menu_maybe ) {
+ if ( wp_get_nav_menu_items( $menu_maybe->term_id, array( 'update_post_term_cache' => false ) ) ) {
+ foreach ( $this->options['nav_menus'][ $theme ] as $menus ) {
+ if ( in_array( $menu_maybe->term_id, $menus ) && ! empty( $menus[ $this->curlang->slug ] ) ) {
+ $args['menu'] = $menus[ $this->curlang->slug ];
+ return $args;
+ }
+ }
+ }
+ }
+ }
+
+ return $args;
+ }
+
+ /**
+ * Filters the nav menu location before the customizer so that it matches the temporary location in the customizer
+ *
+ * @since 1.8
+ *
+ * @param array $args wp_nav_menu $args
+ * @return array modified $args
+ */
+ public function filter_args_before_customizer( $args ) {
+ if ( ! empty( $this->curlang ) ) {
+ $args['theme_location'] = $this->combine_location( $args['theme_location'], $this->curlang );
+ }
+ return $args;
+ }
+
+ /**
+ * Filters the nav menu location after the customizer to get back the true nav menu location for the theme
+ *
+ * @since 1.8
+ *
+ * @param array $args wp_nav_menu $args
+ * @return array modified $args
+ */
+ public function filter_args_after_customizer( $args ) {
+ $infos = $this->explode_location( $args['theme_location'] );
+ $args['theme_location'] = $infos['location'];
+ return $args;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-static-pages.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-static-pages.php
new file mode 100644
index 000000000..bb076230a
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend-static-pages.php
@@ -0,0 +1,318 @@
+links_model = &$polylang->links_model;
+ $this->links = &$polylang->links;
+ $this->options = &$polylang->options;
+
+ add_action( 'pll_home_requested', array( $this, 'pll_home_requested' ) );
+
+ // Manages the redirection of the homepage.
+ add_filter( 'redirect_canonical', array( $this, 'redirect_canonical' ) );
+
+ add_filter( 'pll_pre_translation_url', array( $this, 'pll_pre_translation_url' ), 10, 3 );
+ add_filter( 'pll_check_canonical_url', array( $this, 'pll_check_canonical_url' ) );
+
+ add_filter( 'pll_set_language_from_query', array( $this, 'page_on_front_query' ), 10, 2 );
+ add_filter( 'pll_set_language_from_query', array( $this, 'page_for_posts_query' ), 10, 2 );
+
+ // Specific cases for the customizer.
+ add_action( 'customize_register', array( $this, 'filter_customizer' ) );
+ }
+
+ /**
+ * Translates the page_id query var when the site root page is requested
+ *
+ * @since 1.8
+ *
+ * @return void
+ */
+ public function pll_home_requested() {
+ set_query_var( 'page_id', $this->curlang->page_on_front );
+ }
+
+ /**
+ * Manages the canonical redirect of the homepage when using a page on front.
+ *
+ * @since 0.1
+ *
+ * @param string $redirect_url The redirect url.
+ * @return string|false The modified url, false if the redirect is canceled.
+ */
+ public function redirect_canonical( $redirect_url ) {
+ if ( is_page() && ! is_feed() && get_queried_object_id() == $this->curlang->page_on_front ) {
+ $url = is_paged() ? $this->links_model->add_paged_to_link( $this->links->get_home_url(), get_query_var( 'page' ) ) : $this->links->get_home_url();
+
+ // Don't forget additional query vars
+ $query = wp_parse_url( $redirect_url, PHP_URL_QUERY );
+ if ( ! empty( $query ) ) {
+ parse_str( $query, $query_vars );
+ $query_vars = rawurlencode_deep( $query_vars ); // WP encodes query vars values
+ $url = add_query_arg( $query_vars, $url );
+ }
+
+ return $url;
+ }
+
+ return $redirect_url;
+ }
+
+ /**
+ * Translates the url of the page on front and page for posts.
+ *
+ * @since 1.8
+ *
+ * @param string $url Empty string or the url of the translation of the current page.
+ * @param PLL_Language $language Language of the translation.
+ * @param int $queried_object_id Queried object ID.
+ * @return string The translation url.
+ */
+ public function pll_pre_translation_url( $url, $language, $queried_object_id ) {
+ if ( empty( $queried_object_id ) ) {
+ return $url;
+ }
+
+ // Page for posts.
+ if ( $GLOBALS['wp_query']->is_posts_page ) {
+ $id = $this->model->post->get( $queried_object_id, $language );
+
+ if ( ! empty( $id ) ) {
+ return (string) get_permalink( $id );
+ }
+ }
+
+ // Page on front.
+ if ( is_front_page() && ! empty( $language->page_on_front ) ) {
+ $id = $this->model->post->get( $queried_object_id, $language );
+
+ if ( $language->page_on_front === $id ) {
+ return $language->get_home_url();
+ }
+ }
+
+ return $url;
+ }
+
+ /**
+ * Prevents the canonical redirect if we are on a static front page.
+ *
+ * @since 1.8
+ *
+ * @param string $redirect_url The redirect url.
+ * @return string|false
+ */
+ public function pll_check_canonical_url( $redirect_url ) {
+ return $this->options['redirect_lang'] && ! $this->options['force_lang'] && ! empty( $this->curlang->page_on_front ) && is_page( $this->curlang->page_on_front ) ? false : $redirect_url;
+ }
+
+ /**
+ * Is the query for a the static front page (redirected from the language page)?
+ *
+ * @since 2.3
+ *
+ * @param WP_Query $query The WP_Query object.
+ * @return bool
+ */
+ protected function is_front_page( $query ) {
+ $query = array_diff( array_keys( $query->query ), array( 'preview', 'page', 'paged', 'cpage', 'orderby' ) );
+ return 1 === count( $query ) && in_array( 'lang', $query );
+ }
+
+ /**
+ * Setups query vars when requesting a static front page
+ *
+ * @since 1.8
+ *
+ * @param PLL_Language|false $lang The current language, false if it is not set yet.
+ * @param WP_Query $query The main WP query.
+ * @return PLL_Language|false
+ */
+ public function page_on_front_query( $lang, $query ) {
+ if ( ! empty( $lang ) || ! $this->page_on_front ) {
+ return $lang;
+ }
+
+ // Redirect the language page to the homepage when using a static front page
+ if ( ( $this->options['redirect_lang'] || $this->options['hide_default'] ) && $this->is_front_page( $query ) && $lang = $this->model->get_language( get_query_var( 'lang' ) ) ) {
+ $query->is_archive = $query->is_tax = false;
+ if ( 'page' === get_option( 'show_on_front' ) && ! empty( $lang->page_on_front ) ) {
+ $query->set( 'page_id', $lang->page_on_front );
+ $query->is_singular = $query->is_page = true;
+ unset( $query->query_vars['lang'], $query->queried_object ); // Reset queried object
+ } else {
+ // Handle case where the static front page hasn't be translated to avoid a possible infinite redirect loop.
+ $query->is_home = true;
+ }
+ }
+
+ // Fix paged static front page in plain permalinks when Settings > Reading doesn't match the default language
+ elseif ( ! $this->links_model->using_permalinks && count( $query->query ) === 1 && ! empty( $query->query['page'] ) ) {
+ $lang = $this->model->get_default_language();
+ if ( empty( $lang ) ) {
+ return $lang;
+ }
+ $query->set( 'page_id', $lang->page_on_front );
+ $query->is_singular = $query->is_page = true;
+ $query->is_archive = $query->is_tax = false;
+ unset( $query->query_vars['lang'], $query->queried_object ); // Reset queried object
+ }
+
+ // Set the language when requesting a static front page
+ else {
+ $page_id = $this->get_page_id( $query );
+ $languages = $this->model->get_languages_list();
+ $pages = wp_list_pluck( $languages, 'page_on_front' );
+
+ if ( ! empty( $page_id ) && false !== $n = array_search( $page_id, $pages ) ) {
+ $lang = $languages[ $n ];
+ }
+ }
+
+ // Fix for page_on_front
+ if ( ( $this->options['force_lang'] < 2 || ! $this->options['redirect_lang'] ) && $this->links_model->using_permalinks && ! empty( $lang ) && isset( $query->query['paged'] ) ) {
+ $query->set( 'page', $query->query['paged'] );
+ unset( $query->query['paged'] );
+ } elseif ( ! $this->links_model->using_permalinks && ! empty( $query->query['page'] ) ) {
+ $query->is_paged = true;
+ }
+
+ return $lang;
+ }
+
+ /**
+ * Setups query vars when requesting a posts page
+ *
+ * @since 1.8
+ *
+ * @param PLL_Language|false $lang The current language, false if it is not set yet.
+ * @param WP_Query $query The main WP query.
+ * @return PLL_Language|false
+ */
+ public function page_for_posts_query( $lang, $query ) {
+ if ( ! empty( $lang ) || ! $this->page_for_posts ) {
+ return $lang;
+ }
+
+ $page_id = $this->get_page_id( $query );
+
+ if ( empty( $page_id ) ) {
+ return $lang;
+ }
+
+ $pages = $this->model->get_languages_list( array( 'fields' => 'page_for_posts' ) );
+ $pages = array_filter( $pages );
+
+ if ( in_array( $page_id, $pages ) ) {
+ _prime_post_caches( $pages ); // Fill the cache with all pages for posts to avoid one query per page later.
+
+ $lang = $this->model->post->get_language( $page_id );
+ $query->is_singular = $query->is_page = false;
+ $query->is_home = $query->is_posts_page = true;
+ }
+
+ return $lang;
+ }
+
+ /**
+ * Get the queried page_id (if it exists ).
+ *
+ * If permalinks are used, WordPress does set and use `$query->queried_object_id` and sets `$query->query_vars['page_id']` to 0,
+ * and does set and use `$query->query_vars['page_id']` if permalinks are not used :(.
+ *
+ * @since 1.5
+ *
+ * @param WP_Query $query Instance of WP_Query.
+ * @return int The page_id.
+ */
+ protected function get_page_id( $query ) {
+ if ( ! empty( $query->query_vars['pagename'] ) && isset( $query->queried_object_id ) ) {
+ return $query->queried_object_id;
+ }
+
+ if ( isset( $query->query_vars['page_id'] ) ) {
+ return $query->query_vars['page_id'];
+ }
+
+ return 0; // No page queried.
+ }
+
+ /**
+ * Adds support for the theme customizer.
+ *
+ * @since 3.4.2
+ *
+ * @return void
+ */
+ public function filter_customizer() {
+ add_filter( 'pre_option_page_on_front', array( $this, 'customize_page' ), 20 ); // After the customizer.
+ add_filter( 'pre_option_page_for_post', array( $this, 'customize_page' ), 20 );
+
+ add_filter( 'pll_pre_translation_url', array( $this, 'customize_translation_url' ), 20, 2 ); // After the generic hook in this class.
+ }
+
+ /**
+ * Translates the page ID when customized.
+ *
+ * @since 3.4.2
+ *
+ * @param int|false $pre A page ID if the setting is customized, false otherwise.
+ * @return int|false
+ */
+ public function customize_page( $pre ) {
+ return is_numeric( $pre ) ? pll_get_post( (int) $pre ) : $pre;
+ }
+
+ /**
+ * Fixes the translation URL if the option 'show_on_front' is customized.
+ *
+ * @since 3.4.2
+ *
+ * @param string $url An empty string or the URL of the translation of the current page.
+ * @param PLL_Language $language The language of the translation.
+ * @return string
+ */
+ public function customize_translation_url( $url, $language ) {
+ if ( 'posts' === get_option( 'show_on_front' ) && is_front_page() ) {
+ // When the page on front displays posts, the home URL is the same as the search URL.
+ return $language->get_search_url();
+ }
+ return $url;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend.php
new file mode 100644
index 000000000..1997803b6
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/frontend/frontend.php
@@ -0,0 +1,287 @@
+static_pages = new PLL_Frontend_Static_Pages( $this );
+ }
+
+ $this->model->set_languages_ready();
+ }
+
+ /**
+ * Setups the language chooser based on options
+ *
+ * @since 1.2
+ */
+ public function init() {
+ parent::init();
+
+ $this->links = new PLL_Frontend_Links( $this );
+
+ // Setup the language chooser
+ $c = array( 'Content', 'Url', 'Url', 'Domain' );
+ $class = 'PLL_Choose_Lang_' . $c[ $this->options['force_lang'] ];
+ $this->choose_lang = new $class( $this );
+ $this->choose_lang->init();
+
+ // Need to load nav menu class early to correctly define the locations in the customizer when the language is set from the content
+ $this->nav_menu = new PLL_Frontend_Nav_Menu( $this );
+ }
+
+ /**
+ * Setups filters and nav menus once the language has been defined
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ public function pll_language_defined() {
+ // Filters
+ $this->filters_links = new PLL_Frontend_Filters_Links( $this );
+ $this->filters = new PLL_Frontend_Filters( $this );
+ $this->filters_search = new PLL_Frontend_Filters_Search( $this );
+ $this->filters_widgets = new PLL_Frontend_Filters_Widgets( $this );
+
+ /*
+ * Redirects to canonical url before WordPress redirect_canonical
+ * but after Nextgen Gallery which hacks $_SERVER['REQUEST_URI'] !!!
+ * and restores it in 'template_redirect' with priority 1.
+ */
+ $this->canonical = new PLL_Canonical( $this );
+ add_action( 'template_redirect', array( $this->canonical, 'check_canonical_url' ), 4 );
+
+ // Auto translate for Ajax
+ if ( ( ! defined( 'PLL_AUTO_TRANSLATE' ) || PLL_AUTO_TRANSLATE ) && wp_doing_ajax() ) {
+ $this->auto_translate();
+ }
+ }
+
+ /**
+ * When querying multiple taxonomies, makes sure that the language is not the queried object.
+ *
+ * @since 1.8
+ *
+ * @param WP_Query $query WP_Query object.
+ * @return void
+ */
+ public function parse_tax_query( $query ) {
+ $pll_query = new PLL_Query( $query, $this->model );
+ $queried_taxonomies = $pll_query->get_queried_taxonomies();
+
+ if ( ! empty( $queried_taxonomies ) && 'language' == reset( $queried_taxonomies ) ) {
+ $query->tax_query->queried_terms['language'] = array_shift( $query->tax_query->queried_terms );
+ }
+ }
+
+ /**
+ * Modifies some query vars to "hide" that the language is a taxonomy and avoid conflicts.
+ *
+ * @since 1.2
+ *
+ * @param WP_Query $query WP_Query object.
+ * @return void
+ */
+ public function parse_query( $query ) {
+ $qv = $query->query_vars;
+ $pll_query = new PLL_Query( $query, $this->model );
+ $taxonomies = $pll_query->get_queried_taxonomies();
+
+ // Allow filtering recent posts and secondary queries by the current language
+ if ( ! empty( $this->curlang ) ) {
+ $pll_query->filter_query( $this->curlang );
+ }
+
+ // Modifies query vars when the language is queried
+ if ( ! empty( $qv['lang'] ) || ( ! empty( $taxonomies ) && array( 'language' ) == array_values( $taxonomies ) ) ) {
+ // Do we query a custom taxonomy?
+ $taxonomies = array_diff( $taxonomies, array( 'language', 'category', 'post_tag' ) );
+
+ // Remove pages query when the language is set unless we do a search
+ // Take care not to break the single page, attachment and taxonomies queries!
+ if ( empty( $qv['post_type'] ) && ! $query->is_search && ! $query->is_singular && empty( $taxonomies ) && ! $query->is_category && ! $query->is_tag ) {
+ $query->set( 'post_type', 'post' );
+ }
+
+ // Unset the is_archive flag for language pages to prevent loading the archive template
+ // Keep archive flag for comment feed otherwise the language filter does not work
+ if ( empty( $taxonomies ) && ! $query->is_comment_feed && ! $query->is_post_type_archive && ! $query->is_date && ! $query->is_author && ! $query->is_category && ! $query->is_tag ) {
+ $query->is_archive = false;
+ }
+
+ // Unset the is_tax flag except if another custom tax is queried
+ if ( empty( $taxonomies ) && ( $query->is_category || $query->is_tag || $query->is_author || $query->is_post_type_archive || $query->is_date || $query->is_search || $query->is_feed ) ) {
+ $query->is_tax = false;
+ unset( $query->queried_object ); // FIXME useless?
+ }
+ }
+ }
+
+ /**
+ * Auto translate posts and terms ids
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ public function auto_translate() {
+ $this->auto_translate = new PLL_Frontend_Auto_Translate( $this );
+ }
+
+ /**
+ * Resets some variables when the blog is switched.
+ * Overrides the parent method.
+ *
+ * @since 1.5.1
+ *
+ * @param int $new_blog_id New blog ID.
+ * @param int $prev_blog_id Previous blog ID.
+ * @return void
+ */
+ public function switch_blog( $new_blog_id, $prev_blog_id ) {
+ if ( (int) $new_blog_id === (int) $prev_blog_id ) {
+ // Do nothing if same blog.
+ return;
+ }
+
+ parent::switch_blog( $new_blog_id, $prev_blog_id );
+
+ // Need to check that some languages are defined when user is logged in, has several blogs, some without any languages.
+ if ( ! $this->is_active_on_current_site() || ! $this->model->has_languages() || ! did_action( 'pll_language_defined' ) ) {
+ return;
+ }
+
+ static $restore_curlang;
+
+ if ( empty( $restore_curlang ) ) {
+ $restore_curlang = $this->curlang->slug; // To always remember the current language through blogs.
+ }
+
+ $lang = $this->model->get_language( $restore_curlang );
+ $this->curlang = $lang ? $lang : $this->model->get_default_language();
+ if ( empty( $this->curlang ) ) {
+ return;
+ }
+
+ if ( isset( $this->static_pages ) ) {
+ $this->static_pages->init();
+ }
+
+ // Send the slug instead of the locale here to avoid conflicts with same locales.
+ $this->load_strings_translations( $this->curlang->slug );
+ }
+
+ /**
+ * Remove the customize admin bar on front-end when using a block theme.
+ *
+ * WordPress removes the Customizer menu if a block theme is activated and no other plugins interact with it.
+ * As Polylang interacts with the Customizer, we have to delete this menu ourselves in the case of a block theme,
+ * unless another plugin than Polylang interacts with the Customizer.
+ *
+ * @since 3.2
+ *
+ * @return void
+ */
+ public function remove_customize_admin_bar() {
+ if ( ! $this->should_customize_menu_be_removed() ) {
+ return;
+ }
+
+ global $wp_admin_bar;
+
+ remove_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' ); // To avoid the script launch.
+ $wp_admin_bar->remove_menu( 'customize' );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/api.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/api.php
new file mode 100644
index 000000000..927cd48d0
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/api.php
@@ -0,0 +1,574 @@
+links ) ) {
+ return empty( $args['raw'] ) ? '' : array();
+ }
+
+ $switcher = new PLL_Switcher();
+ return $switcher->the_languages( PLL()->links, $args );
+}
+
+/**
+ * Returns the current language on frontend.
+ * Returns the language set in admin language filter on backend (false if set to all languages).
+ *
+ * @api
+ * @since 0.8.1
+ * @since 3.4 Accepts composite values.
+ *
+ * @param string $field Optional, the language field to return (@see PLL_Language), defaults to `'slug'`.
+ * Pass `\OBJECT` constant to get the language object. A composite value can be used for language
+ * term property values, in the form of `{language_taxonomy_name}:{property_name}` (see
+ * {@see PLL_Language::get_tax_prop()} for the possible values). Ex: `term_language:term_taxonomy_id`.
+ * @return string|int|bool|string[]|PLL_Language The requested field or object for the current language, `false` if the field isn't set or if current language doesn't exist yet.
+ *
+ * @phpstan-return (
+ * $field is \OBJECT ? PLL_Language : (
+ * $field is 'slug' ? non-empty-string : string|int|bool|list
+ * )
+ * )|false
+ */
+function pll_current_language( $field = 'slug' ) {
+ if ( empty( PLL()->curlang ) ) {
+ return false;
+ }
+
+ if ( \OBJECT === $field ) {
+ return PLL()->curlang;
+ }
+
+ return PLL()->curlang->get_prop( $field );
+}
+
+/**
+ * Returns the default language.
+ *
+ * @api
+ * @since 1.0
+ * @since 3.4 Accepts composite values.
+ *
+ * @param string $field Optional, the language field to return (@see PLL_Language), defaults to `'slug'`.
+ * Pass `\OBJECT` constant to get the language object. A composite value can be used for language
+ * term property values, in the form of `{language_taxonomy_name}:{property_name}` (see
+ * {@see PLL_Language::get_tax_prop()} for the possible values). Ex: `term_language:term_taxonomy_id`.
+ * @return string|int|bool|string[]|PLL_Language The requested field or object for the default language, `false` if the field isn't set or if default language doesn't exist yet.
+ *
+ * @phpstan-return (
+ * $field is \OBJECT ? PLL_Language : (
+ * $field is 'slug' ? non-empty-string : string|int|bool|list
+ * )
+ * )|false
+ */
+function pll_default_language( $field = 'slug' ) {
+ $lang = PLL()->model->get_default_language();
+
+ if ( empty( $lang ) ) {
+ return false;
+ }
+
+ if ( \OBJECT === $field ) {
+ return $lang;
+ }
+
+ return $lang->get_prop( $field );
+}
+
+/**
+ * Among the post and its translations, returns the ID of the post which is in the language represented by $lang.
+ *
+ * @api
+ * @since 0.5
+ * @since 3.4 Returns 0 instead of false.
+ * @since 3.4 $lang accepts PLL_Language or string.
+ *
+ * @param int $post_id Post ID.
+ * @param PLL_Language|string $lang Optional language (object or slug), defaults to the current language.
+ * @return int|false The translation post ID if exists, otherwise the passed ID. False if the passed object has no language or if the language doesn't exist.
+ *
+ * @phpstan-return int<0, max>|false
+ */
+function pll_get_post( $post_id, $lang = '' ) {
+ $lang = $lang ? $lang : pll_current_language();
+
+ if ( empty( $lang ) ) {
+ return false;
+ }
+
+ return PLL()->model->post->get( $post_id, $lang );
+}
+
+/**
+ * Among the term and its translations, returns the ID of the term which is in the language represented by $lang.
+ *
+ * @api
+ * @since 0.5
+ * @since 3.4 Returns 0 instead of false.
+ * @since 3.4 $lang accepts PLL_Language or string.
+ *
+ * @param int $term_id Term ID.
+ * @param PLL_Language|string $lang Optional language (object or slug), defaults to the current language.
+ * @return int|false The translation term ID if exists, otherwise the passed ID. False if the passed object has no language or if the language doesn't exist.
+ *
+ * @phpstan-return int<0, max>|false
+ */
+function pll_get_term( $term_id, $lang = null ) {
+ $lang = $lang ? $lang : pll_current_language();
+
+ if ( empty( $lang ) ) {
+ return false;
+ }
+
+ return PLL()->model->term->get( $term_id, $lang );
+}
+
+/**
+ * Returns the home url in a language.
+ *
+ * @api
+ * @since 0.8
+ *
+ * @param string $lang Optional language code, defaults to the current language.
+ * @return string
+ */
+function pll_home_url( $lang = '' ) {
+ if ( empty( $lang ) ) {
+ $lang = pll_current_language();
+ }
+
+ if ( empty( $lang ) || empty( PLL()->links ) ) {
+ return home_url( '/' );
+ }
+
+ return PLL()->links->get_home_url( $lang );
+}
+
+/**
+ * Registers a string for translation in the "strings translation" panel.
+ *
+ * @api
+ * @since 0.6
+ *
+ * @param string $name A unique name for the string.
+ * @param string $string The string to register.
+ * @param string $context Optional, the group in which the string is registered, defaults to 'polylang'.
+ * @param bool $multiline Optional, true if the string table should display a multiline textarea,
+ * false if should display a single line input, defaults to false.
+ * @return void
+ */
+function pll_register_string( $name, $string, $context = 'Polylang', $multiline = false ) {
+ if ( PLL() instanceof PLL_Admin_Base ) {
+ PLL_Admin_Strings::register_string( $name, $string, $context, $multiline );
+ }
+}
+
+/**
+ * Translates a string ( previously registered with pll_register_string ).
+ *
+ * @api
+ * @since 0.6
+ *
+ * @param string $string The string to translate.
+ * @return string The string translated in the current language.
+ */
+function pll__( $string ) {
+ if ( ! is_scalar( $string ) || '' === $string ) {
+ return $string;
+ }
+
+ return __( $string, 'pll_string' ); // PHPCS:ignore WordPress.WP.I18n
+}
+
+/**
+ * Translates a string ( previously registered with pll_register_string ) and escapes it for safe use in HTML output.
+ *
+ * @api
+ * @since 2.1
+ *
+ * @param string $string The string to translate.
+ * @return string The string translated in the current language.
+ */
+function pll_esc_html__( $string ) {
+ return esc_html( pll__( $string ) );
+}
+
+/**
+ * Translates a string ( previously registered with pll_register_string ) and escapes it for safe use in HTML attributes.
+ *
+ * @api
+ * @since 2.1
+ *
+ * @param string $string The string to translate.
+ * @return string The string translated in the current language.
+ */
+function pll_esc_attr__( $string ) {
+ return esc_attr( pll__( $string ) );
+}
+
+/**
+ * Echoes a translated string ( previously registered with pll_register_string )
+ * It is an equivalent of _e() and is not escaped.
+ *
+ * @api
+ * @since 0.6
+ *
+ * @param string $string The string to translate.
+ * @return void
+ */
+function pll_e( $string ) {
+ echo pll__( $string ); // phpcs:ignore
+}
+
+/**
+ * Echoes a translated string ( previously registered with pll_register_string ) and escapes it for safe use in HTML output.
+ *
+ * @api
+ * @since 2.1
+ *
+ * @param string $string The string to translate.
+ * @return void
+ */
+function pll_esc_html_e( $string ) {
+ echo pll_esc_html__( $string ); // phpcs:ignore WordPress.Security.EscapeOutput
+}
+
+/**
+ * Echoes a translated a string ( previously registered with pll_register_string ) and escapes it for safe use in HTML attributes.
+ *
+ * @api
+ * @since 2.1
+ *
+ * @param string $string The string to translate.
+ * @return void
+ */
+function pll_esc_attr_e( $string ) {
+ echo pll_esc_attr__( $string ); // phpcs:ignore WordPress.Security.EscapeOutput
+}
+
+/**
+ * Translates a string ( previously registered with pll_register_string ).
+ *
+ * @api
+ * @since 1.5.4
+ *
+ * @param string $string The string to translate.
+ * @param string $lang Language code.
+ * @return string The string translated in the requested language.
+ */
+function pll_translate_string( $string, $lang ) {
+ if ( PLL() instanceof PLL_Frontend && pll_current_language() === $lang ) {
+ return pll__( $string );
+ }
+
+ if ( ! is_scalar( $string ) || '' === $string ) {
+ return $string;
+ }
+
+ $lang = PLL()->model->get_language( $lang );
+
+ if ( empty( $lang ) ) {
+ return $string;
+ }
+
+ static $cache; // Cache object to avoid loading the same translations object several times.
+
+ if ( empty( $cache ) ) {
+ $cache = new PLL_Cache();
+ }
+
+ $mo = $cache->get( $lang->slug );
+
+ if ( ! $mo instanceof PLL_MO ) {
+ $mo = new PLL_MO();
+ $mo->import_from_db( $lang );
+ $cache->set( $lang->slug, $mo );
+ }
+
+ return $mo->translate( $string );
+}
+
+/**
+ * Returns true if Polylang manages languages and translations for this post type.
+ *
+ * @api
+ * @since 1.0.1
+ *
+ * @param string $post_type Post type name.
+ * @return bool
+ */
+function pll_is_translated_post_type( $post_type ) {
+ return PLL()->model->is_translated_post_type( $post_type );
+}
+
+/**
+ * Returns true if Polylang manages languages and translations for this taxonomy.
+ *
+ * @api
+ * @since 1.0.1
+ *
+ * @param string $tax Taxonomy name.
+ * @return bool
+ */
+function pll_is_translated_taxonomy( $tax ) {
+ return PLL()->model->is_translated_taxonomy( $tax );
+}
+
+/**
+ * Returns the list of available languages.
+ *
+ * @api
+ * @since 1.5
+ *
+ * @param array $args {
+ * Optional array of arguments.
+ *
+ * @type bool $hide_empty Hides languages with no posts if set to true ( defaults to false ).
+ * @type string $fields Return only that field if set ( @see PLL_Language for a list of fields ), defaults to 'slug'.
+ * }
+ * @return string[]
+ */
+function pll_languages_list( $args = array() ) {
+ $args = wp_parse_args( $args, array( 'fields' => 'slug' ) );
+ return PLL()->model->get_languages_list( $args );
+}
+
+/**
+ * Sets the post language.
+ *
+ * @api
+ * @since 1.5
+ * @since 3.4 $lang accepts PLL_Language or string.
+ * @since 3.4 Returns a boolean.
+ *
+ * @param int $id Post ID.
+ * @param PLL_Language|string $lang Language (object or slug).
+ * @return bool True when successfully assigned. False otherwise (or if the given language is already assigned to
+ * the post).
+ */
+function pll_set_post_language( $id, $lang ) {
+ return PLL()->model->post->set_language( $id, $lang );
+}
+
+/**
+ * Sets the term language.
+ *
+ * @api
+ * @since 1.5
+ * @since 3.4 $lang accepts PLL_Language or string.
+ * @since 3.4 Returns a boolean.
+ *
+ * @param int $id Term ID.
+ * @param PLL_Language|string $lang Language (object or slug).
+ * @return bool True when successfully assigned. False otherwise (or if the given language is already assigned to
+ * the term).
+ */
+function pll_set_term_language( $id, $lang ) {
+ return PLL()->model->term->set_language( $id, $lang );
+}
+
+/**
+ * Save posts translations.
+ *
+ * @api
+ * @since 1.5
+ * @since 3.4 Returns an associative array of translations.
+ *
+ * @param int[] $arr An associative array of translations with language code as key and post ID as value.
+ * @return int[] An associative array with language codes as key and post IDs as values.
+ *
+ * @phpstan-return array
+ */
+function pll_save_post_translations( $arr ) {
+ $id = reset( $arr );
+ if ( $id ) {
+ return PLL()->model->post->save_translations( $id, $arr );
+ }
+
+ return array();
+}
+
+/**
+ * Save terms translations
+ *
+ * @api
+ * @since 1.5
+ * @since 3.4 Returns an associative array of translations.
+ *
+ * @param int[] $arr An associative array of translations with language code as key and term ID as value.
+ * @return int[] An associative array with language codes as key and term IDs as values.
+ *
+ * @phpstan-return array
+ */
+function pll_save_term_translations( $arr ) {
+ $id = reset( $arr );
+ if ( $id ) {
+ return PLL()->model->term->save_translations( $id, $arr );
+ }
+
+ return array();
+}
+
+/**
+ * Returns the post language.
+ *
+ * @api
+ * @since 1.5.4
+ * @since 3.4 Accepts composite values for `$field`.
+ *
+ * @param int $post_id Post ID.
+ * @param string $field Optional, the language field to return (@see PLL_Language), defaults to `'slug'`.
+ * Pass `\OBJECT` constant to get the language object. A composite value can be used for language
+ * term property values, in the form of `{language_taxonomy_name}:{property_name}` (see
+ * {@see PLL_Language::get_tax_prop()} for the possible values). Ex: `term_language:term_taxonomy_id`.
+ * @return string|int|bool|string[]|PLL_Language The requested field or object for the post language, `false` if no language is associated to that post.
+ *
+ * @phpstan-return (
+ * $field is \OBJECT ? PLL_Language : (
+ * $field is 'slug' ? non-empty-string : string|int|bool|list
+ * )
+ * )|false
+ */
+function pll_get_post_language( $post_id, $field = 'slug' ) {
+ $lang = PLL()->model->post->get_language( $post_id );
+
+ if ( empty( $lang ) || \OBJECT === $field ) {
+ return $lang;
+ }
+
+ return $lang->get_prop( $field );
+}
+
+/**
+ * Returns the term language.
+ *
+ * @api
+ * @since 1.5.4
+ * @since 3.4 Accepts composite values for `$field`.
+ *
+ * @param int $term_id Term ID.
+ * @param string $field Optional, the language field to return (@see PLL_Language), defaults to `'slug'`.
+ * Pass `\OBJECT` constant to get the language object. A composite value can be used for language
+ * term property values, in the form of `{language_taxonomy_name}:{property_name}` (see
+ * {@see PLL_Language::get_tax_prop()} for the possible values). Ex: `term_language:term_taxonomy_id`.
+ * @return string|int|bool|string[]|PLL_Language The requested field or object for the post language, `false` if no language is associated to that term.
+ *
+ * @phpstan-return (
+ * $field is \OBJECT ? PLL_Language : (
+ * $field is 'slug' ? non-empty-string : string|int|bool|list
+ * )
+ * )|false
+ */
+function pll_get_term_language( $term_id, $field = 'slug' ) {
+ $lang = PLL()->model->term->get_language( $term_id );
+
+ if ( empty( $lang ) || \OBJECT === $field ) {
+ return $lang;
+ }
+
+ return $lang->get_prop( $field );
+}
+
+/**
+ * Returns an array of translations of a post.
+ *
+ * @api
+ * @since 1.8
+ *
+ * @param int $post_id Post ID.
+ * @return int[] An associative array of translations with language code as key and translation post ID as value.
+ *
+ * @phpstan-return array
+ */
+function pll_get_post_translations( $post_id ) {
+ return PLL()->model->post->get_translations( $post_id );
+}
+
+/**
+ * Returns an array of translations of a term.
+ *
+ * @api
+ * @since 1.8
+ *
+ * @param int $term_id Term ID.
+ * @return int[] An associative array of translations with language code as key and translation term ID as value.
+ *
+ * @phpstan-return array
+ */
+function pll_get_term_translations( $term_id ) {
+ return PLL()->model->term->get_translations( $term_id );
+}
+
+/**
+ * Counts posts in a language.
+ *
+ * @api
+ * @since 1.5
+ *
+ * @param string $lang Language code.
+ * @param array $args {
+ * Optional array of arguments.
+ *
+ * @type string $post_type Post type.
+ * @type int $m YearMonth ( ex: 201307 ).
+ * @type int $year 4 digit year.
+ * @type int $monthnum Month number (from 1 to 12).
+ * @type int $day Day of the month (from 1 to 31).
+ * @type int $author Author id.
+ * @type string $author_name Author nicename.
+ * @type string $post_format Post format.
+ * @type string $post_status Post status.
+ * }
+ * @return int Posts count.
+ */
+function pll_count_posts( $lang, $args = array() ) {
+ $lang = PLL()->model->get_language( $lang );
+
+ if ( empty( $lang ) ) {
+ return 0;
+ }
+
+ return PLL()->model->count_posts( $lang, $args );
+}
+
+/**
+ * Allows to access the Polylang instance.
+ * However, it is always preferable to use API functions
+ * as internal methods may be changed without prior notice.
+ *
+ * @since 1.8
+ *
+ * @return PLL_Frontend|PLL_Admin|PLL_Settings|PLL_REST_Request
+ */
+function PLL() { // PHPCS:ignore WordPress.NamingConventions.ValidFunctionName
+ return $GLOBALS['polylang'];
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/base.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/base.php
new file mode 100644
index 000000000..305672dce
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/base.php
@@ -0,0 +1,219 @@
+links_model = &$links_model;
+ $this->model = &$links_model->model;
+ $this->options = &$this->model->options;
+
+ $GLOBALS['l10n_unloaded']['pll_string'] = true; // Short-circuit _load_textdomain_just_in_time() for 'pll_string' domain in WP 4.6+
+
+ add_action( 'widgets_init', array( $this, 'widgets_init' ) );
+
+ // User defined strings translations
+ add_action( 'pll_language_defined', array( $this, 'load_strings_translations' ), 5 );
+ add_action( 'change_locale', array( $this, 'load_strings_translations' ) ); // Since WP 4.7
+ add_action( 'personal_options_update', array( $this, 'load_strings_translations' ), 1, 0 ); // Before WP, for confirmation request when changing the user email.
+ add_action( 'lostpassword_post', array( $this, 'load_strings_translations' ), 10, 0 ); // Password reset email.
+ // Switch_to_blog
+ add_action( 'switch_blog', array( $this, 'switch_blog' ), 10, 2 );
+ }
+
+ /**
+ * Instantiates classes reacting to CRUD operations on posts and terms,
+ * only when at least one language is defined.
+ *
+ * @since 2.6
+ *
+ * @return void
+ */
+ public function init() {
+ if ( $this->model->has_languages() ) {
+ $this->posts = new PLL_CRUD_Posts( $this );
+ $this->terms = new PLL_CRUD_Terms( $this );
+
+ // WordPress options.
+ new PLL_Translate_Option( 'blogname', array(), array( 'context' => 'WordPress' ) );
+ new PLL_Translate_Option( 'blogdescription', array(), array( 'context' => 'WordPress' ) );
+ new PLL_Translate_Option( 'date_format', array(), array( 'context' => 'WordPress' ) );
+ new PLL_Translate_Option( 'time_format', array(), array( 'context' => 'WordPress' ) );
+ }
+ }
+
+ /**
+ * Registers our widgets
+ *
+ * @since 0.1
+ *
+ * @return void
+ */
+ public function widgets_init() {
+ register_widget( 'PLL_Widget_Languages' );
+
+ // Overwrites the calendar widget to filter posts by language
+ if ( ! defined( 'PLL_WIDGET_CALENDAR' ) || PLL_WIDGET_CALENDAR ) {
+ unregister_widget( 'WP_Widget_Calendar' );
+ register_widget( 'PLL_Widget_Calendar' );
+ }
+ }
+
+ /**
+ * Loads user defined strings translations
+ *
+ * @since 1.2
+ * @since 2.1.3 $locale parameter added.
+ *
+ * @param string $locale Language locale or slug. Defaults to current locale.
+ * @return void
+ */
+ public function load_strings_translations( $locale = '' ) {
+ if ( empty( $locale ) ) {
+ $locale = ( is_admin() && ! Polylang::is_ajax_on_front() ) ? get_user_locale() : get_locale();
+ }
+
+ $language = $this->model->get_language( $locale );
+
+ if ( ! empty( $language ) ) {
+ $mo = new PLL_MO();
+ $mo->import_from_db( $language );
+ $GLOBALS['l10n']['pll_string'] = &$mo;
+ } else {
+ unset( $GLOBALS['l10n']['pll_string'] );
+ }
+ }
+
+ /**
+ * Resets some variables when the blog is switched.
+ * Applied only if Polylang is active on the new blog.
+ *
+ * @since 1.5.1
+ *
+ * @param int $new_blog_id New blog ID.
+ * @param int $prev_blog_id Previous blog ID.
+ * @return void
+ */
+ public function switch_blog( $new_blog_id, $prev_blog_id ) {
+ if ( (int) $new_blog_id === (int) $prev_blog_id ) {
+ // Do nothing if same blog.
+ return;
+ }
+
+ $this->links_model->remove_filters();
+
+ if ( $this->is_active_on_current_site() ) {
+ $this->options = get_option( 'polylang' ); // Needed for menus.
+ $this->links_model = $this->model->get_links_model();
+ }
+ }
+
+ /**
+ * Checks if Polylang is active on the current blog (useful when the blog is switched).
+ *
+ * @since 3.5.2
+ *
+ * @return bool
+ */
+ protected function is_active_on_current_site(): bool {
+ return pll_is_plugin_active( POLYLANG_BASENAME ) && get_option( 'polylang' );
+ }
+
+ /**
+ * Check if the customize menu should be removed or not.
+ *
+ * @since 3.2
+ *
+ * @return bool True if it should be removed, false otherwise.
+ */
+ public function should_customize_menu_be_removed() {
+ // Exit if a block theme isn't activated.
+ if ( ! function_exists( 'wp_is_block_theme' ) || ! wp_is_block_theme() ) {
+ return false;
+ }
+
+ return ! $this->is_customize_register_hooked();
+ }
+
+ /**
+ * Tells whether or not Polylang or third party callbacks are hooked to `customize_register`.
+ *
+ * @since 3.4.3
+ *
+ * @global $wp_filter
+ *
+ * @return bool True if Polylang's callbacks are hooked, false otherwise.
+ */
+ protected function is_customize_register_hooked() {
+ global $wp_filter;
+
+ if ( empty( $wp_filter['customize_register'] ) || ! $wp_filter['customize_register'] instanceof WP_Hook ) {
+ return false;
+ }
+
+ /*
+ * 'customize_register' is hooked by:
+ * @see PLL_Nav_Menu::create_nav_menu_locations()
+ * @see PLL_Frontend_Static_Pages::filter_customizer()
+ */
+ $floor = 0;
+ if ( ! empty( $this->nav_menu ) && (bool) $wp_filter['customize_register']->has_filter( 'customize_register', array( $this->nav_menu, 'create_nav_menu_locations' ) ) ) {
+ ++$floor;
+ }
+
+ if ( ! empty( $this->static_pages ) && (bool) $wp_filter['customize_register']->has_filter( 'customize_register', array( $this->static_pages, 'filter_customizer' ) ) ) {
+ ++$floor;
+ }
+
+ $count = array_sum( array_map( 'count', $wp_filter['customize_register']->callbacks ) );
+
+ return $count > $floor;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/cache.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/cache.php
new file mode 100644
index 000000000..69368f921
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/cache.php
@@ -0,0 +1,121 @@
+>
+ */
+ protected $cache = array();
+
+ /**
+ * Constructor.
+ *
+ * @since 1.7
+ */
+ public function __construct() {
+ $this->blog_id = get_current_blog_id();
+ add_action( 'switch_blog', array( $this, 'switch_blog' ) );
+ }
+
+ /**
+ * Called when switching blog.
+ *
+ * @since 1.7
+ *
+ * @param int $new_blog_id New blog ID.
+ * @return void
+ */
+ public function switch_blog( $new_blog_id ) {
+ $this->blog_id = $new_blog_id;
+ }
+
+ /**
+ * Adds a value in cache.
+ *
+ * @since 1.7
+ * @since 3.6 Returns the cached value.
+ *
+ * @param string $key Cache key.
+ * @param mixed $data The value to add to the cache.
+ * @return mixed
+ *
+ * @phpstan-param non-empty-string $key
+ * @phpstan-param TCacheData $data
+ * @phpstan-return TCacheData
+ */
+ public function set( $key, $data ) {
+ $this->cache[ $this->blog_id ][ $key ] = $data;
+
+ return $data;
+ }
+
+ /**
+ * Returns value from cache.
+ *
+ * @since 1.7
+ *
+ * @param string $key Cache key.
+ * @return mixed
+ *
+ * @phpstan-param non-empty-string $key
+ * @phpstan-return TCacheData|false
+ */
+ public function get( $key ) {
+ return isset( $this->cache[ $this->blog_id ][ $key ] ) ? $this->cache[ $this->blog_id ][ $key ] : false;
+ }
+
+ /**
+ * Cleans the cache (for this blog only).
+ *
+ * @since 1.7
+ *
+ * @param string $key Optional. Cache key. An empty string to clean the whole cache for the current blog.
+ * Default is an empty string.
+ * @return void
+ */
+ public function clean( $key = '' ) {
+ if ( '' === $key ) {
+ unset( $this->cache[ $this->blog_id ] );
+ } else {
+ unset( $this->cache[ $this->blog_id ][ $key ] );
+ }
+ }
+
+ /**
+ * Generates and returns a "unique" cache key, depending on `$data` and prefixed by `$prefix`.
+ *
+ * @since 3.6
+ *
+ * @param string $prefix String to prefix the cache key.
+ * @param string|array|object $data Data.
+ * @return string
+ *
+ * @phpstan-param non-empty-string $prefix
+ * @phpstan-return non-empty-string
+ */
+ public function get_unique_key( string $prefix, $data ): string {
+ /** @var scalar */
+ $serialized = maybe_serialize( $data );
+ return $prefix . md5( (string) $serialized );
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/class-polylang.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/class-polylang.php
new file mode 100644
index 000000000..c1e7eb2bb
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/class-polylang.php
@@ -0,0 +1,298 @@
+is_deactivation() || ! $install->can_activate() ) {
+ return;
+ }
+
+ // Plugin initialization
+ // Take no action before all plugins are loaded
+ add_action( 'plugins_loaded', array( $this, 'init' ), 1 );
+
+ // Override load text domain waiting for the language to be defined
+ // Here for plugins which load text domain as soon as loaded :(
+ if ( ! defined( 'PLL_OLT' ) || PLL_OLT ) {
+ PLL_OLT_Manager::instance();
+ }
+
+ /*
+ * Loads the compatibility with some plugins and themes.
+ * Loaded as soon as possible as we may need to act before other plugins are loaded.
+ */
+ if ( ! defined( 'PLL_PLUGINS_COMPAT' ) || PLL_PLUGINS_COMPAT ) {
+ PLL_Integrations::instance();
+ }
+ }
+
+ /**
+ * Tells whether the current request is an ajax request on frontend or not
+ *
+ * @since 2.2
+ *
+ * @return bool
+ */
+ public static function is_ajax_on_front() {
+ // Special test for plupload which does not use jquery ajax and thus does not pass our ajax prefilter
+ // Special test for customize_save done in frontend but for which we want to load the admin
+ $in = isset( $_REQUEST['action'] ) && in_array( sanitize_key( $_REQUEST['action'] ), array( 'upload-attachment', 'customize_save' ) ); // phpcs:ignore WordPress.Security.NonceVerification
+ $is_ajax_on_front = wp_doing_ajax() && empty( $_REQUEST['pll_ajax_backend'] ) && ! $in; // phpcs:ignore WordPress.Security.NonceVerification
+
+ /**
+ * Filters whether the current request is an ajax request on front.
+ *
+ * @since 2.3
+ *
+ * @param bool $is_ajax_on_front Whether the current request is an ajax request on front.
+ */
+ return apply_filters( 'pll_is_ajax_on_front', $is_ajax_on_front );
+ }
+
+ /**
+ * Is the current request a REST API request?
+ * Inspired by WP::parse_request()
+ * Needed because at this point, the constant REST_REQUEST is not defined yet
+ *
+ * @since 2.4.1
+ *
+ * @return bool
+ */
+ public static function is_rest_request() {
+ // Handle pretty permalinks.
+ $home_path = trim( (string) wp_parse_url( home_url(), PHP_URL_PATH ), '/' );
+ $home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) );
+
+ $req_uri = trim( (string) wp_parse_url( pll_get_requested_url(), PHP_URL_PATH ), '/' );
+ $req_uri = (string) preg_replace( $home_path_regex, '', $req_uri );
+ $req_uri = trim( $req_uri, '/' );
+ $req_uri = str_replace( 'index.php', '', $req_uri );
+ $req_uri = trim( $req_uri, '/' );
+
+ // And also test rest_route query string parameter is not empty for plain permalinks.
+ $query_string = array();
+ wp_parse_str( (string) wp_parse_url( pll_get_requested_url(), PHP_URL_QUERY ), $query_string );
+ $rest_route = isset( $query_string['rest_route'] ) ? trim( $query_string['rest_route'], '/' ) : false;
+
+ return 0 === strpos( $req_uri, rest_get_url_prefix() . '/' ) || ! empty( $rest_route );
+ }
+
+ /**
+ * Tells if we are in the wizard process.
+ *
+ * @since 2.7
+ *
+ * @return bool
+ */
+ public static function is_wizard() {
+ return isset( $_GET['page'] ) && ! empty( $_GET['page'] ) && 'mlang_wizard' === sanitize_key( $_GET['page'] ); // phpcs:ignore WordPress.Security.NonceVerification
+ }
+
+ /**
+ * Defines constants
+ * May be overridden by a plugin if set before plugins_loaded, 1
+ *
+ * @since 1.6
+ *
+ * @return void
+ */
+ public static function define_constants() {
+ // Cookie name. no cookie will be used if set to false
+ if ( ! defined( 'PLL_COOKIE' ) ) {
+ define( 'PLL_COOKIE', 'pll_language' );
+ }
+
+ // Backward compatibility with Polylang < 2.3
+ if ( ! defined( 'PLL_AJAX_ON_FRONT' ) ) {
+ define( 'PLL_AJAX_ON_FRONT', self::is_ajax_on_front() );
+ }
+
+ // Admin
+ if ( ! defined( 'PLL_ADMIN' ) ) {
+ define( 'PLL_ADMIN', wp_doing_cron() || ( defined( 'WP_CLI' ) && WP_CLI ) || ( is_admin() && ! PLL_AJAX_ON_FRONT ) );
+ }
+
+ // Settings page whatever the tab except for the wizard which needs to be an admin process.
+ if ( ! defined( 'PLL_SETTINGS' ) ) {
+ define( 'PLL_SETTINGS', is_admin() && ( ( isset( $_GET['page'] ) && 0 === strpos( sanitize_key( $_GET['page'] ), 'mlang' ) && ! self::is_wizard() ) || ! empty( $_REQUEST['pll_ajax_settings'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
+ }
+ }
+
+ /**
+ * Polylang initialization
+ * setups models and separate admin and frontend
+ *
+ * @since 1.2
+ *
+ * @return void
+ */
+ public function init() {
+ self::define_constants();
+ $options = get_option( 'polylang' );
+
+ // Plugin upgrade
+ if ( $options && version_compare( $options['version'], POLYLANG_VERSION, '<' ) ) {
+ $upgrade = new PLL_Upgrade( $options );
+ if ( ! $upgrade->upgrade() ) { // If the version is too old
+ return;
+ }
+ }
+
+ // In some edge cases, it's possible that no options were found in the database. Load default options as we need some.
+ if ( ! $options ) {
+ $options = PLL_Install::get_default_options();
+ }
+
+ /**
+ * Filter the model class to use
+ * /!\ this filter is fired *before* the $polylang object is available
+ *
+ * @since 1.5
+ *
+ * @param string $class either PLL_Model or PLL_Admin_Model
+ */
+ $class = apply_filters( 'pll_model', PLL_SETTINGS || self::is_wizard() ? 'PLL_Admin_Model' : 'PLL_Model' );
+ /** @var PLL_Model $model */
+ $model = new $class( $options );
+
+ if ( ! $model->has_languages() ) {
+ /**
+ * Fires when no language has been defined yet
+ * Used to load overridden textdomains
+ *
+ * @since 1.2
+ */
+ do_action( 'pll_no_language_defined' );
+ }
+
+ $class = '';
+
+ if ( PLL_SETTINGS ) {
+ $class = 'PLL_Settings';
+ } elseif ( PLL_ADMIN ) {
+ $class = 'PLL_Admin';
+ } elseif ( self::is_rest_request() ) {
+ $class = 'PLL_REST_Request';
+ } elseif ( $model->has_languages() ) {
+ $class = 'PLL_Frontend';
+ }
+
+ /**
+ * Filters the class to use to instantiate the $polylang object
+ *
+ * @since 2.6
+ *
+ * @param string $class A class name.
+ */
+ $class = apply_filters( 'pll_context', $class );
+
+ if ( ! empty( $class ) ) {
+ /** @phpstan-var class-string $class */
+ $this->init_context( $class, $model );
+ }
+ }
+
+ /**
+ * Polylang initialization.
+ * Setups the Polylang Context, loads the modules and init Polylang.
+ *
+ * @since 3.6
+ *
+ * @param string $class The class name.
+ * @param PLL_Model $model Instance of PLL_Model.
+ * @return PLL_Base
+ *
+ * @phpstan-param class-string $class
+ * @phpstan-return TPLLClass
+ */
+ public function init_context( string $class, PLL_Model $model ): PLL_Base {
+ global $polylang;
+
+ $links_model = $model->get_links_model();
+ $polylang = new $class( $links_model );
+
+ /**
+ * Fires after Polylang's model init.
+ * This is the best place to register a custom table (see `PLL_Model`'s constructor).
+ * /!\ This hook is fired *before* the $polylang object is available.
+ * /!\ The languages are also not available yet.
+ *
+ * @since 3.4
+ *
+ * @param PLL_Model $model Polylang model.
+ */
+ do_action( 'pll_model_init', $model );
+
+ $model->maybe_create_language_terms();
+
+ /**
+ * Fires after the $polylang object is created and before the API is loaded
+ *
+ * @since 2.0
+ *
+ * @param object $polylang
+ */
+ do_action_ref_array( 'pll_pre_init', array( &$polylang ) );
+
+ // Loads the API
+ require_once POLYLANG_DIR . '/include/api.php';
+
+ // Loads the modules.
+ $load_scripts = glob( POLYLANG_DIR . '/modules/*/load.php', GLOB_NOSORT );
+ if ( is_array( $load_scripts ) ) {
+ foreach ( $load_scripts as $load_script ) {
+ require_once $load_script; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable
+ }
+ }
+
+ $polylang->init();
+
+ /**
+ * Fires after the $polylang object and the API is loaded
+ *
+ * @since 1.7
+ *
+ * @param object $polylang
+ */
+ do_action_ref_array( 'pll_init', array( &$polylang ) );
+
+ return $polylang;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/cookie.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/cookie.php
new file mode 100644
index 000000000..0daac7886
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/cookie.php
@@ -0,0 +1,107 @@
+ 0 !== $expiration ? time() + $expiration : 0,
+ 'path' => COOKIEPATH,
+ 'domain' => COOKIE_DOMAIN, // Cookie domain must be set to false for localhost (default value for `COOKIE_DOMAIN`) thanks to Stephen Harris.
+ 'secure' => is_ssl(),
+ 'httponly' => false,
+ 'samesite' => 'Lax',
+ );
+
+ $args = wp_parse_args( $args, $defaults );
+
+ /**
+ * Filters the Polylang cookie arguments.
+ * /!\ This filter may be fired *before* the theme is loaded.
+ *
+ * @since 3.6
+ *
+ * @param array $args {
+ * Optional. Array of arguments for setting the cookie.
+ *
+ * @type int $expires Cookie duration.
+ * If a cookie duration of 0 is specified, a session cookie will be set.
+ * If a negative cookie duration is specified, the cookie is removed.
+ * @type string $path Cookie path.
+ * @type string $domain Cookie domain. Must be set to false for localhost (default value for `COOKIE_DOMAIN`).
+ * @type bool $secure Should the cookie be sent only over https?
+ * @type bool $httponly Should the cookie be accessed only over http protocol?.
+ * @type string $samesite Either 'Strict', 'Lax' or 'None'.
+ * }
+ */
+ return (array) apply_filters( 'pll_cookie_args', $args );
+ }
+
+ /**
+ * Sets the cookie.
+ *
+ * @since 2.9
+ *
+ * @param string $lang Language cookie value.
+ * @param array $args {
+ * Optional. Array of arguments for setting the cookie.
+ *
+ * @type string $path Cookie path, defaults to COOKIEPATH.
+ * @type string $domain Cookie domain, defaults to COOKIE_DOMAIN
+ * @type bool $secure Should the cookie be sent only over https?
+ * @type bool $httponly Should the cookie accessed only over http protocol? Defaults to false.
+ * @type string $samesite Either 'Strict', 'Lax' or 'None', defaults to 'Lax'.
+ * }
+ * @return void
+ */
+ public static function set( $lang, $args = array() ) {
+ $args = self::parse_args( $args );
+
+ if ( ! headers_sent() && PLL_COOKIE !== false && self::get() !== $lang ) {
+ if ( version_compare( PHP_VERSION, '7.3', '<' ) ) {
+ $args['path'] .= '; SameSite=' . $args['samesite']; // Hack to set SameSite value in PHP < 7.3. Doesn't work with newer versions.
+ setcookie( PLL_COOKIE, $lang, $args['expires'], $args['path'], $args['domain'], $args['secure'], $args['httponly'] );
+ } else {
+ setcookie( PLL_COOKIE, $lang, $args );
+ }
+ }
+ }
+
+ /**
+ * Returns the language cookie value.
+ *
+ * @since 2.9
+ *
+ * @return string
+ */
+ public static function get() {
+ return isset( $_COOKIE[ PLL_COOKIE ] ) ? sanitize_key( $_COOKIE[ PLL_COOKIE ] ) : '';
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/crud-posts.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/crud-posts.php
new file mode 100644
index 000000000..8ddc7577a
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/crud-posts.php
@@ -0,0 +1,484 @@
+options = &$polylang->options;
+ $this->model = &$polylang->model;
+ $this->pref_lang = &$polylang->pref_lang;
+ $this->curlang = &$polylang->curlang;
+
+ add_action( 'save_post', array( $this, 'save_post' ), 10, 2 );
+ add_action( 'set_object_terms', array( $this, 'set_object_terms' ), 10, 4 );
+ add_filter( 'wp_insert_post_parent', array( $this, 'wp_insert_post_parent' ), 10, 2 );
+ add_action( 'before_delete_post', array( $this, 'delete_post' ) );
+ add_action( 'post_updated', array( $this, 'force_tags_translation' ), 10, 3 );
+
+ // Specific for media
+ if ( $polylang->options['media_support'] ) {
+ add_action( 'add_attachment', array( $this, 'set_default_language' ) );
+ add_action( 'delete_attachment', array( $this, 'delete_post' ) );
+ add_filter( 'wp_delete_file', array( $this, 'wp_delete_file' ) );
+ }
+ }
+
+ /**
+ * Allows to set a language by default for posts if it has no language yet.
+ *
+ * @since 1.5
+ *
+ * @param int $post_id Post ID.
+ * @return void
+ */
+ public function set_default_language( $post_id ) {
+ if ( ! $this->model->post->get_language( $post_id ) ) {
+ if ( ! empty( $_GET['new_lang'] ) && $lang = $this->model->get_language( sanitize_key( $_GET['new_lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ // Defined only on admin.
+ $this->model->post->set_language( $post_id, $lang );
+ } elseif ( ! isset( $this->pref_lang ) && ! empty( $_REQUEST['lang'] ) && $lang = $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ // Testing $this->pref_lang makes this test pass only on admin.
+ $this->model->post->set_language( $post_id, $lang );
+ } elseif ( ( $parent_id = wp_get_post_parent_id( $post_id ) ) && $parent_lang = $this->model->post->get_language( $parent_id ) ) {
+ $this->model->post->set_language( $post_id, $parent_lang );
+ } elseif ( isset( $this->pref_lang ) ) {
+ // Always defined on admin, never defined on frontend.
+ $this->model->post->set_language( $post_id, $this->pref_lang );
+ } elseif ( ! empty( $this->curlang ) ) {
+ // Only on frontend due to the previous test always true on admin.
+ $this->model->post->set_language( $post_id, $this->curlang );
+ } else {
+ // In all other cases set to default language.
+ $this->model->post->set_language( $post_id, $this->options['default_lang'] );
+ }
+ }
+ }
+
+ /**
+ * Called when a post ( or page ) is saved, published or updated.
+ *
+ * @since 0.1
+ * @since 2.3 Does not save the language and translations anymore, unless the post has no language yet.
+ *
+ * @param int $post_id Post id of the post being saved.
+ * @param WP_Post $post The post being saved.
+ * @return void
+ */
+ public function save_post( $post_id, $post ) {
+ // Does nothing except on post types which are filterable.
+ if ( $this->model->is_translated_post_type( $post->post_type ) ) {
+ if ( $id = wp_is_post_revision( $post_id ) ) {
+ $post_id = $id;
+ }
+
+ $lang = $this->model->post->get_language( $post_id );
+
+ if ( empty( $lang ) ) {
+ $this->set_default_language( $post_id );
+ }
+
+ /**
+ * Fires after the post language and translations are saved.
+ *
+ * @since 1.2
+ *
+ * @param int $post_id Post id.
+ * @param WP_Post $post Post object.
+ * @param int[] $translations The list of translations post ids.
+ */
+ do_action( 'pll_save_post', $post_id, $post, $this->model->post->get_translations( $post_id ) );
+ }
+ }
+
+ /**
+ * Makes sure that saved terms are in the right language.
+ *
+ * @since 2.3
+ *
+ * @param int $object_id Object ID.
+ * @param int[]|string[] $terms An array of object term IDs or slugs.
+ * @param int[] $tt_ids An array of term taxonomy IDs.
+ * @param string $taxonomy Taxonomy slug.
+ * @return void
+ */
+ public function set_object_terms( $object_id, $terms, $tt_ids, $taxonomy ) {
+ static $avoid_recursion;
+
+ if ( $avoid_recursion || empty( $terms ) || ! is_array( $terms ) || ! $this->model->is_translated_taxonomy( $taxonomy ) ) {
+ return;
+ }
+
+ $lang = $this->model->post->get_language( $object_id );
+
+ if ( empty( $lang ) ) {
+ return;
+ }
+
+ // Use the term_taxonomy_ids to get all the requested terms in 1 query.
+ $new_terms = get_terms(
+ array(
+ 'taxonomy' => $taxonomy,
+ 'term_taxonomy_id' => array_map( 'intval', $tt_ids ),
+ 'lang' => '',
+ )
+ );
+
+ if ( empty( $new_terms ) || ! is_array( $new_terms ) ) {
+ // Terms not found.
+ return;
+ }
+
+ $new_term_ids_translated = $this->translate_terms( $new_terms, $taxonomy, $lang );
+
+ // Query the object's term.
+ $orig_terms = get_terms(
+ array(
+ 'taxonomy' => $taxonomy,
+ 'object_ids' => $object_id,
+ 'lang' => '',
+ )
+ );
+
+ if ( is_array( $orig_terms ) ) {
+ $orig_term_ids = wp_list_pluck( $orig_terms, 'term_id' );
+ $orig_term_ids_translated = $this->translate_terms( $orig_terms, $taxonomy, $lang );
+
+ // Terms that are not in the translated list.
+ $remove_term_ids = array_diff( $orig_term_ids, $orig_term_ids_translated );
+
+ if ( ! empty( $remove_term_ids ) ) {
+ wp_remove_object_terms( $object_id, $remove_term_ids, $taxonomy );
+ }
+ } else {
+ $orig_term_ids = array();
+ $orig_term_ids_translated = array();
+ }
+
+ // Terms to add.
+ $add_term_ids = array_unique( array_merge( $orig_term_ids_translated, $new_term_ids_translated ) );
+ $add_term_ids = array_diff( $add_term_ids, $orig_term_ids );
+
+ if ( ! empty( $add_term_ids ) ) {
+ $avoid_recursion = true;
+ wp_set_object_terms( $object_id, $add_term_ids, $taxonomy, true ); // Append.
+ $avoid_recursion = false;
+ }
+ }
+
+ /**
+ * Make sure that the post parent is in the correct language.
+ *
+ * @since 1.8
+ *
+ * @param int $post_parent Post parent ID.
+ * @param int $post_id Post ID.
+ * @return int
+ */
+ public function wp_insert_post_parent( $post_parent, $post_id ) {
+ $lang = $this->model->post->get_language( $post_id );
+ $parent_post_type = $post_parent > 0 ? get_post_type( $post_parent ) : null;
+ // Dont break the hierarchy in case the post has no language
+ if ( ! empty( $lang ) && ! empty( $parent_post_type ) && $this->model->is_translated_post_type( $parent_post_type ) ) {
+ $post_parent = $this->model->post->get_translation( $post_parent, $lang );
+ }
+
+ return $post_parent;
+ }
+
+ /**
+ * Called when a post, page or media is deleted
+ * Don't delete translations if this is a post revision thanks to AndyDeGroo who caught this bug
+ * http://wordpress.org/support/topic/plugin-polylang-quick-edit-still-breaks-translation-linking-of-pages-in-072
+ *
+ * @since 0.1
+ *
+ * @param int $post_id Post ID.
+ * @return void
+ */
+ public function delete_post( $post_id ) {
+ if ( ! wp_is_post_revision( $post_id ) ) {
+ $this->model->post->delete_translation( $post_id );
+ }
+ }
+
+ /**
+ * Prevents WP deleting files when there are still media using them.
+ *
+ * @since 0.9
+ *
+ * @param string $file Path to the file to delete.
+ * @return string Empty or unmodified path.
+ */
+ public function wp_delete_file( $file ) {
+ global $wpdb;
+
+ $uploadpath = wp_upload_dir();
+
+ // Get the main attached file.
+ $attached_file = substr_replace( $file, '', 0, strlen( trailingslashit( $uploadpath['basedir'] ) ) );
+ $attached_file = preg_replace( '#-\d+x\d+\.([a-z]+)$#', '.$1', $attached_file );
+
+ $ids = $wpdb->get_col(
+ $wpdb->prepare(
+ "SELECT post_id FROM $wpdb->postmeta
+ WHERE meta_key = '_wp_attached_file' AND meta_value = %s",
+ $attached_file
+ )
+ );
+
+ if ( ! empty( $ids ) ) {
+ return ''; // Prevent deleting the file.
+ }
+
+ return $file;
+ }
+
+ /**
+ * Creates a media translation
+ *
+ * @since 1.8
+ *
+ * @param int $post_id Original attachment id.
+ * @param string|object $lang New translation language.
+ * @return int Attachment id of the translated media.
+ */
+ public function create_media_translation( $post_id, $lang ) {
+ if ( empty( $post_id ) ) {
+ return 0;
+ }
+
+ $post = get_post( $post_id, ARRAY_A );
+
+ if ( empty( $post ) ) {
+ return 0;
+ }
+
+ $lang = $this->model->get_language( $lang ); // Make sure we get a valid language slug.
+
+ if ( empty( $lang ) ) {
+ return 0;
+ }
+
+ // Create a new attachment ( translate attachment parent if exists ).
+ add_filter( 'pll_enable_duplicate_media', '__return_false', 99 ); // Avoid a conflict with automatic duplicate at upload.
+ unset( $post['ID'] ); // Will force the creation.
+ if ( ! empty( $post['post_parent'] ) ) {
+ $post['post_parent'] = (int) $this->model->post->get_translation( $post['post_parent'], $lang->slug );
+ }
+ $post['tax_input'] = array( 'language' => array( $lang->slug ) ); // Assigns the language.
+ $tr_id = wp_insert_attachment( wp_slash( $post ) );
+ remove_filter( 'pll_enable_duplicate_media', '__return_false', 99 ); // Restore automatic duplicate at upload.
+
+ // Copy metadata.
+ $data = wp_get_attachment_metadata( $post_id, true ); // Unfiltered.
+ if ( is_array( $data ) ) {
+ wp_update_attachment_metadata( $tr_id, wp_slash( $data ) ); // Directly uses update_post_meta, so expects slashed.
+ }
+
+ // Copy attached file.
+ if ( $file = get_attached_file( $post_id, true ) ) { // Unfiltered.
+ update_attached_file( $tr_id, wp_slash( $file ) ); // Directly uses update_post_meta, so expects slashed.
+ }
+
+ // Copy alternative text. Direct use of the meta as there is no filtered wrapper to manipulate it.
+ if ( $text = get_post_meta( $post_id, '_wp_attachment_image_alt', true ) ) {
+ add_post_meta( $tr_id, '_wp_attachment_image_alt', wp_slash( $text ) );
+ }
+
+ $this->model->post->set_language( $tr_id, $lang );
+
+ $translations = $this->model->post->get_translations( $post_id );
+ $translations[ $lang->slug ] = $tr_id;
+ $this->model->post->save_translations( $tr_id, $translations );
+
+ /**
+ * Fires after a media translation is created
+ *
+ * @since 1.6.4
+ *
+ * @param int $post_id Post id of the source media.
+ * @param int $tr_id Post id of the new media translation.
+ * @param string $slug Language code of the new translation.
+ */
+ do_action( 'pll_translate_media', $post_id, $tr_id, $lang->slug );
+ return $tr_id;
+ }
+
+ /**
+ * Ensure that tags are in the correct language when a post is updated, due to `tags_input` parameter being removed in `wp_update_post()`.
+ *
+ * @since 3.4.5
+ *
+ * @param int $post_id Post ID, unused.
+ * @param WP_Post $post_after Post object following the update.
+ * @param WP_Post $post_before Post object before the update.
+ * @return void
+ */
+ public function force_tags_translation( $post_id, $post_after, $post_before ) {
+ if ( ! is_object_in_taxonomy( $post_before->post_type, 'post_tag' ) ) {
+ return;
+ }
+
+ $terms = get_the_terms( $post_before, 'post_tag' );
+
+ if ( empty( $terms ) || ! is_array( $terms ) ) {
+ return;
+ }
+
+ $term_ids = wp_list_pluck( $terms, 'term_id' );
+
+ // Let's ensure that `PLL_CRUD_Posts::set_object_terms()` will do its job.
+ wp_set_post_terms( $post_id, $term_ids, 'post_tag' );
+ }
+
+ /**
+ * Makes sure that all terms in the given list are in the given language.
+ * If not the case, the terms are translated or created (for a hierarchical taxonomy, terms are created recursively).
+ *
+ * @since 3.5
+ *
+ * @param WP_Term[] $terms List of terms to translate.
+ * @param string $taxonomy The terms' taxonomy.
+ * @param PLL_Language $language The language to translate the terms into.
+ * @return int[] List of `term_id`s.
+ *
+ * @phpstan-return array
+ */
+ private function translate_terms( array $terms, string $taxonomy, PLL_Language $language ): array {
+ $term_ids_translated = array();
+
+ foreach ( $terms as $term ) {
+ $term_ids_translated[] = $this->translate_term( $term, $taxonomy, $language );
+ }
+
+ return array_filter( $term_ids_translated );
+ }
+
+ /**
+ * Translates the given term into the given language.
+ * If the translation doesn't exist, it is created (for a hierarchical taxonomy, terms are created recursively).
+ *
+ * @since 3.5
+ *
+ * @param WP_Term $term The term to translate.
+ * @param string $taxonomy The term's taxonomy.
+ * @param PLL_Language $language The language to translate the term into.
+ * @return int A `term_id` on success, `0` on failure.
+ *
+ * @phpstan-return int<0, max>
+ */
+ private function translate_term( WP_Term $term, string $taxonomy, PLL_Language $language ): int {
+ // Check if the term is in the correct language or if a translation exists.
+ $tr_term_id = $this->model->term->get( $term->term_id, $language );
+
+ if ( ! empty( $tr_term_id ) ) {
+ // Already in the correct language.
+ return $tr_term_id;
+ }
+
+ // Or choose the correct language for tags (initially defined by name).
+ $tr_term_id = $this->model->term_exists( $term->name, $taxonomy, $term->parent, $language );
+
+ if ( ! empty( $tr_term_id ) ) {
+ return $tr_term_id;
+ }
+
+ // Or create the term in the correct language.
+ $tr_parent_term_id = 0;
+
+ if ( $term->parent > 0 && is_taxonomy_hierarchical( $taxonomy ) ) {
+ $parent = get_term( $term->parent, $taxonomy );
+
+ if ( $parent instanceof WP_Term ) {
+ // Translate the parent recursively.
+ $tr_parent_term_id = $this->translate_term( $parent, $taxonomy, $language );
+ }
+ }
+
+ $lang_callback = function ( $lang, $tax, $slug ) use ( $language, $term, $taxonomy ) {
+ if ( ! $lang instanceof PLL_Language && $tax === $taxonomy && $slug === $term->slug ) {
+ return $language;
+ }
+ return $lang;
+ };
+ $parent_callback = function ( $parent_id, $tax, $slug ) use ( $tr_parent_term_id, $term, $taxonomy ) {
+ if ( empty( $parent_id ) && $tax === $taxonomy && $slug === $term->slug ) {
+ return $tr_parent_term_id;
+ }
+ return $parent_id;
+ };
+ add_filter( 'pll_inserted_term_language', $lang_callback, 10, 3 );
+ add_filter( 'pll_inserted_term_parent', $parent_callback, 10, 3 );
+ $new_term_info = wp_insert_term(
+ $term->name,
+ $taxonomy,
+ array(
+ 'parent' => $tr_parent_term_id,
+ 'slug' => $term->slug, // Useless but prevents the use of `sanitize_title()` and for consistency with `$lang_callback`.
+ )
+ );
+ remove_filter( 'pll_inserted_term_language', $lang_callback );
+ remove_filter( 'pll_inserted_term_parent', $parent_callback );
+
+ if ( is_wp_error( $new_term_info ) ) {
+ // Term creation failed.
+ return 0;
+ }
+
+ $tr_term_id = max( 0, (int) $new_term_info['term_id'] );
+
+ if ( empty( $tr_term_id ) ) {
+ return 0;
+ }
+
+ $this->model->term->set_language( $tr_term_id, $language );
+
+ $trs = $this->model->term->get_translations( $term->term_id );
+
+ $trs[ $language->slug ] = $tr_term_id;
+
+ $this->model->term->save_translations( $term->term_id, $trs );
+
+ return $tr_term_id;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/crud-terms.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/crud-terms.php
new file mode 100644
index 000000000..85680b4a9
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/crud-terms.php
@@ -0,0 +1,346 @@
+options = &$polylang->options;
+ $this->model = &$polylang->model;
+ $this->curlang = &$polylang->curlang;
+ $this->filter_lang = &$polylang->filter_lang;
+ $this->pref_lang = &$polylang->pref_lang;
+
+ // Saving terms
+ add_action( 'create_term', array( $this, 'save_term' ), 999, 3 );
+ add_action( 'edit_term', array( $this, 'save_term' ), 999, 3 ); // After PLL_Admin_Filters_Term
+ add_filter( 'pre_term_name', array( $this, 'set_pre_term_name' ) );
+ add_filter( 'pre_term_slug', array( $this, 'set_pre_term_slug' ), 10, 2 );
+
+ // Adds cache domain when querying terms
+ add_filter( 'get_terms_args', array( $this, 'get_terms_args' ), 10, 2 );
+
+ // Filters terms by language
+ add_filter( 'terms_clauses', array( $this, 'terms_clauses' ), 10, 3 );
+ add_action( 'pre_get_posts', array( $this, 'set_tax_query_lang' ), 999 );
+ add_action( 'posts_selection', array( $this, 'unset_tax_query_lang' ), 0 );
+
+ // Deleting terms
+ add_action( 'pre_delete_term', array( $this, 'delete_term' ), 10, 2 );
+ }
+
+ /**
+ * Allows to set a language by default for terms if it has no language yet.
+ *
+ * @since 1.5.4
+ *
+ * @param int $term_id Term ID.
+ * @param string $taxonomy Taxonomy name.
+ * @return void
+ */
+ protected function set_default_language( $term_id, $taxonomy ) {
+ if ( ! $this->model->term->get_language( $term_id ) ) {
+ if ( ! isset( $this->pref_lang ) && ! empty( $_REQUEST['lang'] ) && $lang = $this->model->get_language( sanitize_key( $_REQUEST['lang'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ // Testing $this->pref_lang makes this test pass only on frontend.
+ $this->model->term->set_language( $term_id, $lang );
+ } elseif ( ( $term = get_term( $term_id, $taxonomy ) ) && ! empty( $term->parent ) && $parent_lang = $this->model->term->get_language( $term->parent ) ) {
+ // Sets language from term parent if exists thanks to Scott Kingsley Clark
+ $this->model->term->set_language( $term_id, $parent_lang );
+ } elseif ( isset( $this->pref_lang ) ) {
+ // Always defined on admin, never defined on frontend
+ $this->model->term->set_language( $term_id, $this->pref_lang );
+ } elseif ( ! empty( $this->curlang ) ) {
+ // Only on frontend due to the previous test always true on admin
+ $this->model->term->set_language( $term_id, $this->curlang );
+ } else {
+ // In all other cases set to default language.
+ $this->model->term->set_language( $term_id, $this->options['default_lang'] );
+ }
+ }
+ }
+
+ /**
+ * Called when a category or post tag is created or edited.
+ * Does nothing except on taxonomies which are filterable.
+ *
+ * @since 0.1
+ *
+ * @param int $term_id Term id of the term being saved.
+ * @param int $tt_id Term taxonomy id.
+ * @param string $taxonomy Taxonomy name.
+ * @return void
+ */
+ public function save_term( $term_id, $tt_id, $taxonomy ) {
+ if ( $this->model->is_translated_taxonomy( $taxonomy ) ) {
+
+ $lang = $this->model->term->get_language( $term_id );
+
+ if ( empty( $lang ) ) {
+ $this->set_default_language( $term_id, $taxonomy );
+ }
+
+ /**
+ * Fires after the term language and translations are saved.
+ *
+ * @since 1.2
+ *
+ * @param int $term_id Term id.
+ * @param string $taxonomy Taxonomy name.
+ * @param int[] $translations The list of translations term ids.
+ */
+ do_action( 'pll_save_term', $term_id, $taxonomy, $this->model->term->get_translations( $term_id ) );
+ }
+ }
+
+ /**
+ * Get the language(s) to filter WP_Term_Query.
+ *
+ * @since 1.7.6
+ *
+ * @param string[] $taxonomies Queried taxonomies.
+ * @param array $args WP_Term_Query arguments.
+ * @return PLL_Language|string|false The language(s) to use in the filter, false otherwise.
+ */
+ protected function get_queried_language( $taxonomies, $args ) {
+ global $pagenow;
+
+ // Does nothing except on taxonomies which are filterable
+ // Since WP 4.7, make sure not to filter wp_get_object_terms()
+ if ( ! $this->model->is_translated_taxonomy( $taxonomies ) || ! empty( $args['object_ids'] ) ) {
+ return false;
+ }
+
+ // If get_terms is queried with a 'lang' parameter
+ if ( isset( $args['lang'] ) ) {
+ return $args['lang'];
+ }
+
+ // On tags page, everything should be filtered according to the admin language filter except the parent dropdown
+ if ( 'edit-tags.php' === $pagenow && empty( $args['class'] ) ) {
+ return $this->filter_lang;
+ }
+
+ return $this->curlang;
+ }
+
+ /**
+ * Adds language dependent cache domain when querying terms.
+ * Useful as the 'lang' parameter is not included in cache key by WordPress.
+ *
+ * @since 1.3
+ *
+ * @param array $args WP_Term_Query arguments.
+ * @param string[] $taxonomies Queried taxonomies.
+ * @return array Modified arguments.
+ */
+ public function get_terms_args( $args, $taxonomies ) {
+ // Don't break _get_term_hierarchy().
+ if ( 'all' === $args['get'] && 'id' === $args['orderby'] && 'id=>parent' === $args['fields'] ) {
+ $args['lang'] = '';
+ }
+
+ if ( isset( $this->tax_query_lang ) ) {
+ $args['lang'] = empty( $this->tax_query_lang ) && ! empty( $this->curlang ) && ! empty( $args['slug'] ) ? $this->curlang->slug : $this->tax_query_lang;
+ }
+
+ if ( $lang = $this->get_queried_language( $taxonomies, $args ) ) {
+ $lang = is_string( $lang ) && strpos( $lang, ',' ) ? explode( ',', $lang ) : $lang;
+ $key = '_' . ( is_array( $lang ) ? implode( ',', $lang ) : $this->model->get_language( $lang )->slug );
+ $args['cache_domain'] = empty( $args['cache_domain'] ) ? 'pll' . $key : $args['cache_domain'] . $key;
+ }
+ return $args;
+ }
+
+ /**
+ * Filters categories and post tags by language(s) when needed on admin side
+ *
+ * @since 0.2
+ *
+ * @param string[] $clauses List of sql clauses.
+ * @param string[] $taxonomies List of taxonomies.
+ * @param array $args WP_Term_Query arguments.
+ * @return string[] Modified sql clauses.
+ */
+ public function terms_clauses( $clauses, $taxonomies, $args ) {
+ $lang = $this->get_queried_language( $taxonomies, $args );
+ return $this->model->terms_clauses( $clauses, $lang );
+ }
+
+ /**
+ * Sets the WP_Term_Query language when doing a WP_Query.
+ * Needed since WP 4.9.
+ *
+ * @since 2.3.2
+ *
+ * @param WP_Query $query WP_Query object.
+ * @return void
+ */
+ public function set_tax_query_lang( $query ) {
+ $this->tax_query_lang = isset( $query->query_vars['lang'] ) ? $query->query_vars['lang'] : '';
+ }
+
+ /**
+ * Removes the WP_Term_Query language filter for WP_Query.
+ * Needed since WP 4.9.
+ *
+ * @since 2.3.2
+ *
+ * @return void
+ */
+ public function unset_tax_query_lang() {
+ unset( $this->tax_query_lang );
+ }
+
+ /**
+ * Called when a category or post tag is deleted
+ * Deletes language and translations
+ *
+ * @since 0.1
+ *
+ * @param int $term_id Id of the term to delete.
+ * @param string $taxonomy Name of the taxonomy.
+ * @return void
+ */
+ public function delete_term( $term_id, $taxonomy ) {
+ if ( ! $this->model->is_translated_taxonomy( $taxonomy ) ) {
+ return;
+ }
+
+ // Delete translation and relationships only if the term is translatable.
+ $this->model->term->delete_translation( $term_id );
+ $this->model->term->delete_language( $term_id );
+ }
+
+ /**
+ * Stores the term name for use in pre_term_slug
+ *
+ * @since 0.9.5
+ *
+ * @param string $name term name
+ * @return string unmodified term name
+ */
+ public function set_pre_term_name( $name ) {
+ return $this->pre_term_name = $name;
+ }
+
+ /**
+ * Appends language slug to the term slug if needed.
+ *
+ * @since 3.3
+ *
+ * @param string $slug Term slug.
+ * @param string $taxonomy Term taxonomy.
+ * @return string Slug with a language suffix if found.
+ */
+ public function set_pre_term_slug( $slug, $taxonomy ) {
+ if ( ! $this->model->is_translated_taxonomy( $taxonomy ) ) {
+ return $slug;
+ }
+
+ if ( ! $slug ) {
+ $slug = sanitize_title( $this->pre_term_name );
+ }
+
+ if ( ! term_exists( $slug, $taxonomy ) ) {
+ return $slug;
+ }
+
+ /**
+ * Filters the subsequently inserted term language.
+ *
+ * @since 3.3
+ *
+ * @param PLL_Language|null $lang Found language object, null otherwise.
+ * @param string $taxonomy Term taonomy.
+ * @param string $slug Term slug
+ */
+ $lang = apply_filters( 'pll_inserted_term_language', null, $taxonomy, $slug );
+
+ if ( ! $lang instanceof PLL_Language ) {
+ return $slug;
+ }
+
+ $parent = 0;
+ if ( is_taxonomy_hierarchical( $taxonomy ) ) {
+ /**
+ * Filters the subsequently inserted term parent.
+ *
+ * @since 3.3
+ *
+ * @param int $parent Parent term ID, 0 if none.
+ * @param string $taxonomy Term taxonomy.
+ * @param string $slug Term slug
+ */
+ $parent = apply_filters( 'pll_inserted_term_parent', 0, $taxonomy, $slug );
+ }
+
+ $term_id = (int) $this->model->term_exists_by_slug( $slug, $lang, $taxonomy, $parent );
+
+ // If no term exist in the given language with that slug, it can be created.
+ if ( ! $term_id ) {
+ $slug .= '-' . $lang->slug;
+ }
+
+ return $slug;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/db-tools.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/db-tools.php
new file mode 100644
index 000000000..be1fc5d2b
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/db-tools.php
@@ -0,0 +1,48 @@
+prepare( '%s', $value );
+ }
+
+ return (int) $value;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filter-rest-routes.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filter-rest-routes.php
new file mode 100644
index 000000000..ca598a79e
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filter-rest-routes.php
@@ -0,0 +1,178 @@
+
+ */
+ private $filtered_entities = array();
+
+ /**
+ * Other REST routes filterable by language.
+ *
+ * @var string[]
+ * @phpstan-var array
+ */
+ private $filtered_routes = array();
+
+ /**
+ * @var PLL_Model
+ */
+ private $model;
+
+ /**
+ * Constructor.
+ *
+ * @since 3.5
+ *
+ * @param PLL_Model $model Shared instance of the current PLL_Model.
+ */
+ public function __construct( PLL_Model $model ) {
+ $this->model = $model;
+
+ // Adds search REST endpoint.
+ $this->filtered_routes['search'] = 'wp/v2/search';
+ }
+
+ /**
+ * Adds query parameters to preload paths.
+ *
+ * @since 3.5
+ *
+ * @param (string|string[])[] $preload_paths Array of paths to preload.
+ * @param array $args Array of query strings to add paired by key/value.
+ * @return (string|string[])[]
+ */
+ public function add_query_parameters( array $preload_paths, array $args ): array {
+ foreach ( $preload_paths as $k => $path ) {
+ if ( empty( $path ) ) {
+ continue;
+ }
+
+ $query_params = array();
+ // If the method request is OPTIONS, $path is an array and the first element is the path
+ if ( is_array( $path ) ) {
+ $temp_path = $path[0];
+ } else {
+ $temp_path = $path;
+ }
+
+ $path_parts = wp_parse_url( $temp_path );
+
+ if ( ! isset( $path_parts['path'] ) || ! $this->is_filtered( $path_parts['path'] ) ) {
+ continue;
+ }
+
+ if ( ! empty( $path_parts['query'] ) ) {
+ parse_str( $path_parts['query'], $query_params );
+ }
+
+ // Add params in query params
+ foreach ( $args as $key => $value ) {
+ $query_params[ $key ] = $value;
+ }
+
+ // Sort query params to put it in the same order as the preloading middleware does
+ ksort( $query_params );
+
+ // Replace the key by the correct path with query params reordered
+ $sorted_path = add_query_arg( urlencode_deep( $query_params ), $path_parts['path'] );
+
+ if ( is_array( $path ) ) {
+ $preload_paths[ $k ][0] = $sorted_path;
+ } else {
+ $preload_paths[ $k ] = $sorted_path;
+ }
+ }
+
+ return $preload_paths;
+ }
+
+ /**
+ * Adds inline script to declare filtered REST route on client side.
+ *
+ * @since 3.5
+ *
+ * @param string $script_handle Name of the script to add the inline script to.
+ * @return void
+ */
+ public function add_inline_script( string $script_handle ) {
+ $script_var = 'let pllFilteredRoutes = ' . (string) wp_json_encode( $this->get() );
+
+ wp_add_inline_script( $script_handle, $script_var, 'before' );
+ }
+
+ /**
+ * Returns filtered REST routes by entity type (e.g. post type or taxonomy).
+ *
+ * @since 3.5
+ *
+ * @return string[] REST routes.
+ * @phpstan-return array
+ */
+ private function get(): array {
+ if ( ! empty( $this->filtered_entities ) ) {
+ return array_merge( $this->filtered_entities, $this->filtered_routes );
+ }
+
+ $translatable_post_types = $this->model->get_translated_post_types();
+ $translatable_taxonomies = $this->model->get_translated_taxonomies();
+
+ $post_types = get_post_types( array( 'show_in_rest' => true ), 'objects' );
+ $taxonomies = get_taxonomies( array( 'show_in_rest' => true ), 'objects' );
+
+ $this->extract_filtered_rest_entities(
+ array_merge( $post_types, $taxonomies ),
+ array_merge( $translatable_post_types, $translatable_taxonomies )
+ );
+
+ return array_merge( $this->filtered_entities, $this->filtered_routes );
+ }
+
+ /**
+ * Tells if a given route is fileterable by language.
+ *
+ * @since 3.5
+ *
+ * @param string $rest_route Route to test.
+ * @return bool Whether the route is filterable or not.
+ */
+ private function is_filtered( string $rest_route ): bool {
+ $rest_route = trim( $rest_route );
+
+ return ! preg_match( '/\d+$/', $rest_route ) && in_array( trim( $rest_route, '/' ), $this->get(), true );
+ }
+
+ /**
+ * Extracts filterable REST route from an array of entity objects
+ * from a list of translatable entities (e.g. post types or taxonomies).
+ *
+ * @since 3.5
+ *
+ * @param object[] $rest_entities Array of post type or taxonomy objects.
+ * @param string[] $translatable_entities Array of translatable entity names.
+ * @return void
+ * @phpstan-param array $rest_entities
+ */
+ private function extract_filtered_rest_entities( array $rest_entities, array $translatable_entities ) {
+ $this->filtered_entities = array();
+ foreach ( $rest_entities as $rest_entity ) {
+ if ( in_array( $rest_entity->name, $translatable_entities, true ) ) {
+ $rest_base = empty( $rest_entity->rest_base ) ? $rest_entity->name : $rest_entity->rest_base;
+ $rest_namespace = empty( $rest_entity->rest_namespace ) ? 'wp/v2' : $rest_entity->rest_namespace;
+
+ $this->filtered_entities[ $rest_entity->name ] = "{$rest_namespace}/{$rest_base}";
+ }
+ }
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-links.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-links.php
new file mode 100644
index 000000000..b13d9f8cf
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-links.php
@@ -0,0 +1,202 @@
+links = &$polylang->links;
+ $this->links_model = &$polylang->links_model;
+ $this->model = &$polylang->model;
+ $this->options = &$polylang->options;
+ $this->curlang = &$polylang->curlang;
+
+ // Low priority on links filters to come after any other modifications.
+ if ( $this->options['force_lang'] ) {
+ add_filter( 'post_link', array( $this, 'post_type_link' ), 20, 2 );
+ add_filter( '_get_page_link', array( $this, '_get_page_link' ), 20, 2 );
+ }
+
+ add_filter( 'post_type_link', array( $this, 'post_type_link' ), 20, 2 );
+ add_filter( 'term_link', array( $this, 'term_link' ), 20, 3 );
+
+ if ( $this->options['force_lang'] > 0 ) {
+ add_filter( 'attachment_link', array( $this, 'attachment_link' ), 20, 2 );
+ }
+
+ // Keeps the preview post link on default domain when using multiple domains and SSO is not available.
+ if ( 3 === $this->options['force_lang'] && ! class_exists( 'PLL_Xdata_Domain' ) ) {
+ add_filter( 'preview_post_link', array( $this, 'preview_post_link' ), 20 );
+ }
+
+ // Rewrites post types archives links to filter them by language.
+ add_filter( 'post_type_archive_link', array( $this, 'post_type_archive_link' ), 20, 2 );
+ }
+
+ /**
+ * Modifies page links
+ *
+ * @since 1.7
+ *
+ * @param string $link post link
+ * @param int $post_id post ID
+ * @return string modified post link
+ */
+ public function _get_page_link( $link, $post_id ) {
+ // /!\ WP does not use pretty permalinks for preview
+ return false !== strpos( $link, 'preview=true' ) && false !== strpos( $link, 'page_id=' ) ? $link : $this->links_model->switch_language_in_link( $link, $this->model->post->get_language( $post_id ) );
+ }
+
+ /**
+ * Modifies attachment links
+ *
+ * @since 1.6.2
+ *
+ * @param string $link attachment link
+ * @param int $post_id attachment link
+ * @return string modified attachment link
+ */
+ public function attachment_link( $link, $post_id ) {
+ return wp_get_post_parent_id( $post_id ) ? $link : $this->links_model->switch_language_in_link( $link, $this->model->post->get_language( $post_id ) );
+ }
+
+ /**
+ * Modifies custom posts links.
+ *
+ * @since 1.6
+ *
+ * @param string $link Post link.
+ * @param WP_Post $post Post object.
+ * @return string Modified post link.
+ */
+ public function post_type_link( $link, $post ) {
+ // /!\ WP does not use pretty permalinks for preview
+ if ( ( false === strpos( $link, 'preview=true' ) || false === strpos( $link, 'p=' ) ) && $this->model->is_translated_post_type( $post->post_type ) ) {
+ $lang = $this->model->post->get_language( $post->ID );
+ $link = $this->options['force_lang'] ? $this->links_model->switch_language_in_link( $link, $lang ) : $link;
+
+ /**
+ * Filters a post or custom post type link.
+ *
+ * @since 1.6
+ *
+ * @param string $link The post link.
+ * @param PLL_Language $lang The current language.
+ * @param WP_Post $post The post object.
+ */
+ $link = apply_filters( 'pll_post_type_link', $link, $lang, $post );
+ }
+
+ return $link;
+ }
+
+ /**
+ * Modifies term links.
+ *
+ * @since 0.7
+ *
+ * @param string $link Term link.
+ * @param WP_Term $term Term object.
+ * @param string $tax Taxonomy name;
+ * @return string Modified term link.
+ */
+ public function term_link( $link, $term, $tax ) {
+ if ( $this->model->is_translated_taxonomy( $tax ) ) {
+ $lang = $this->model->term->get_language( $term->term_id );
+ $link = $this->options['force_lang'] ? $this->links_model->switch_language_in_link( $link, $lang ) : $link;
+
+ /**
+ * Filter a term link
+ *
+ * @since 1.6
+ *
+ * @param string $link The term link.
+ * @param PLL_Language $lang The current language.
+ * @param WP_Term $term The term object.
+ */
+ return apply_filters( 'pll_term_link', $link, $lang, $term );
+ }
+
+ // In case someone calls get_term_link for the 'language' taxonomy.
+ if ( 'language' === $tax ) {
+ $lang = $this->model->get_language( $term->term_id );
+ if ( $lang ) {
+ return $this->links_model->home_url( $lang );
+ }
+ }
+
+ return $link;
+ }
+
+ /**
+ * Keeps the preview post link on default domain when using multiple domains.
+ *
+ * @since 1.6.1
+ *
+ * @param string $url URL used for the post preview.
+ * @return string The modified url.
+ */
+ public function preview_post_link( $url ) {
+ return $this->links_model->remove_language_from_link( $url );
+ }
+
+ /**
+ * Modifies the post type archive links to add the language parameter
+ * only if the post type is translated.
+ *
+ * The filter was originally only on frontend but is needed on admin too for
+ * compatibility with the archive link of the ACF link field since ACF 5.4.0.
+ *
+ * @since 1.7.6
+ *
+ * @param string $link The post type archive permalink.
+ * @param string $post_type Post type name.
+ * @return string
+ */
+ public function post_type_archive_link( $link, $post_type ) {
+ return $this->model->is_translated_post_type( $post_type ) && 'post' !== $post_type ? $this->links_model->switch_language_in_link( $link, $this->curlang ) : $link;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-sanitization.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-sanitization.php
new file mode 100644
index 000000000..1bdd2a123
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-sanitization.php
@@ -0,0 +1,106 @@
+locale = $locale;
+
+ // We need specific filters for some languages like German and Danish
+ $specific_locales = array( 'da_DK', 'de_DE', 'de_DE_formal', 'de_CH', 'de_CH_informal', 'ca', 'sr_RS', 'bs_BA' );
+ if ( in_array( $locale, $specific_locales ) ) {
+ add_filter( 'sanitize_title', array( $this, 'sanitize_title' ), 10, 3 );
+ add_filter( 'sanitize_user', array( $this, 'sanitize_user' ), 10, 3 );
+ }
+ }
+
+ /**
+ * Retrieve the locale code of the language.
+ *
+ * @since 2.0
+ *
+ * @return string
+ */
+ public function get_locale() {
+ return $this->locale;
+ }
+
+ /**
+ * Maybe fix the result of sanitize_title() in case the languages include German or Danish
+ * Without this filter, if language of the title being sanitized is different from the language
+ * used for the admin interface and if one this language is German or Danish, some specific
+ * characters such as ä, ö, ü, ß are incorrectly sanitized.
+ *
+ * All the process is done by the remove_accents() WordPress function based on the locale value
+ *
+ * @link https://github.com/WordPress/WordPress/blob/5.5.1/wp-includes/formatting.php#L1920-L1944
+ *
+ * @since 2.0
+ *
+ * @param string $title Sanitized title.
+ * @param string $raw_title The title prior to sanitization.
+ * @param string $context The context for which the title is being sanitized.
+ * @return string
+ */
+ public function sanitize_title( $title, $raw_title, $context ) {
+ static $once = false;
+
+ if ( ! $once && 'save' == $context && ! empty( $title ) ) {
+ $once = true;
+ add_filter( 'locale', array( $this, 'get_locale' ), 20 ); // After the filter for the admin interface
+ $title = sanitize_title( $raw_title, '', $context );
+ remove_filter( 'locale', array( $this, 'get_locale' ), 20 );
+ $once = false;
+ }
+ return $title;
+ }
+
+ /**
+ * Maybe fix the result of sanitize_user() in case the languages include German or Danish
+ *
+ * All the process is done by the remove_accents() WordPress function based on the locale value
+ *
+ * @link https://github.com/WordPress/WordPress/blob/5.5-branch/wp-includes/formatting.php#L1920-L1944
+ *
+ * @since 2.0
+ *
+ * @param string $username Sanitized username.
+ * @param string $raw_username The username prior to sanitization.
+ * @param bool $strict Whether to limit the sanitization to specific characters. Default false.
+ * @return string
+ */
+ public function sanitize_user( $username, $raw_username, $strict ) {
+ static $once = false;
+
+ if ( ! $once ) {
+ $once = true;
+ add_filter( 'locale', array( $this, 'get_locale' ), 20 ); // After the filter for the admin interface
+ $username = sanitize_user( $raw_username, $strict );
+ remove_filter( 'locale', array( $this, 'get_locale' ), 20 );
+ $once = false;
+ }
+ return $username;
+ }
+}
diff --git a/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-widgets-options.php b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-widgets-options.php
new file mode 100644
index 000000000..52b9d3d01
--- /dev/null
+++ b/wp-content/plugins/polylang-pro/vendor/wpsyntex/polylang/include/filters-widgets-options.php
@@ -0,0 +1,92 @@
+model = $polylang->model;
+
+ add_action( 'in_widget_form', array( $this, 'in_widget_form' ), 10, 3 );
+ add_filter( 'widget_update_callback', array( $this, 'widget_update_callback' ), 10, 2 );
+ }
+
+ /**
+ * Add the language filter field to the widgets options form.
+ *
+ * @since 3.0 Moved PLL_Admin_Filters.
+ * @since 3.1 Rename lang_choice field name and id to pll_lang as the widget setting.
+ *
+ * @param WP_Widget $widget The widget instance (passed by reference).
+ * @param null $return Return null if new fields are added.
+ * @param array $instance An array of the widget's settings.
+ * @return void
+ */
+ public function in_widget_form( $widget, $return, $instance ) {
+ $dropdown = new PLL_Walker_Dropdown();
+
+ $dropdown_html = $dropdown->walk(
+ array_merge(
+ array( (object) array( 'slug' => 0, 'name' => __( 'All languages', 'polylang' ) ) ),
+ $this->model->get_languages_list()
+ ),
+ -1,
+ array(
+ 'id' => $widget->get_field_id( 'pll_lang' ),
+ 'name' => $widget->get_field_name( 'pll_lang' ),
+ 'class' => 'tags-input pll-lang-choice',
+ 'selected' => empty( $instance['pll_lang'] ) ? '' : $instance['pll_lang'],
+ )
+ );
+
+ printf(
+ '