Polylang Connect for Elementor – Templates Translation & Language Switcher - Version 1.0.0

Version Description

Just released into the wild.

=

Download this release

Release Info

Developer p4fbradjohnson
Plugin Icon 128x128 Polylang Connect for Elementor – Templates Translation & Language Switcher
Version 1.0.0
Comparing to
See all releases

Version 1.0.0

Files changed (43) hide show
  1. CHANGES.md +60 -0
  2. LICENSE +339 -0
  3. LICENSE.txt +339 -0
  4. README.md +355 -0
  5. assets/css/index.php +4 -0
  6. assets/css/plsfe-editor.css +264 -0
  7. assets/css/plsfe-editor.min.css +1 -0
  8. assets/css/plsfe-frontend.css +279 -0
  9. assets/css/plsfe-frontend.min.css +1 -0
  10. assets/index.php +4 -0
  11. composer.json +22 -0
  12. connect-polylang-elementor.php +153 -0
  13. includes/admin-extras.php +212 -0
  14. includes/functions-conditionals.php +84 -0
  15. includes/functions-global.php +196 -0
  16. includes/index.php +4 -0
  17. index.php +4 -0
  18. languages/README.md +34 -0
  19. languages/connect-polylang-elementor-de_DE.mo +0 -0
  20. languages/connect-polylang-elementor-de_DE.po +444 -0
  21. languages/connect-polylang-elementor-de_DE_formal.mo +0 -0
  22. languages/connect-polylang-elementor-de_DE_formal.po +444 -0
  23. languages/connect-polylang-elementor.pot +408 -0
  24. languages/index.php +4 -0
  25. languages/readme.txt +34 -0
  26. modules/connect/index.php +4 -0
  27. modules/connect/tweaks-polylang-elementor.php +129 -0
  28. modules/dynamic-tags/index.php +4 -0
  29. modules/dynamic-tags/manager.php +44 -0
  30. modules/dynamic-tags/polylang-current-language-code.php +103 -0
  31. modules/dynamic-tags/polylang-current-language-flag.php +108 -0
  32. modules/dynamic-tags/polylang-current-language-name.php +103 -0
  33. modules/dynamic-tags/polylang-current-language-url.php +119 -0
  34. modules/dynamic-tags/polylang-language-names.php +141 -0
  35. modules/finder/index.php +4 -0
  36. modules/finder/manager.php +37 -0
  37. modules/finder/plugin-cpel.php +113 -0
  38. modules/finder/plugin-polylang.php +184 -0
  39. modules/index.php +4 -0
  40. modules/widgets/index.php +4 -0
  41. modules/widgets/polylang-language-switcher.php +741 -0
  42. modules/widgets/register-widget.php +120 -0
  43. readme.txt +299 -0
CHANGES.md ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Polylang Connect for Elementor
2
+
3
+ **General Info**
4
+
5
+ * [Plugin page on WordPress.org: wordpress.org/plugins/connect-polylang-elementor/](https://wordpress.org/plugins/connect-polylang-elementor/)
6
+ * [Translate the plugin](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
7
+ * [**Join plugin's newsletter for insider info, tutorials and more**](https://eepurl.com/gbAUUn)
8
+ * [**Become a Patron**](https://www.patreon.com/deckerweb) and support ongoing development, maintenance and support of this plugin
9
+ * [**Donate** for the further development & support of the plugin](https://www.paypal.me/deckerweb)
10
+ * [Plugin's documentation & FAQ](https://wordpress.org/plugins/connect-polylang-elementor/#faq)
11
+ * [Polylang Users Facebook Group](https://www.facebook.com/groups/polylang.users/)
12
+ * [Facebook Community User Group Deckerweb Plugins](https://www.facebook.com/groups/deckerweb.wordpress.plugins/)
13
+ * [Facebook Info Page for Deckerweb Plugins](https://www.facebook.com/deckerweb.wordpress.plugins/)
14
+
15
+
16
+ ## Changelog of the Plugin
17
+
18
+
19
+ ### 1.0.0 - 2018-11-28
20
+
21
+ * Official public release on WordPress.org
22
+
23
+
24
+ ### 0.9.1 - 2018-11-27
25
+
26
+ * *First Release Candidate (RC) version*
27
+ * New: Automatic enabling of Elementor My Templates post type for Polylang support
28
+ * Tweak: Code improvements throughout
29
+ * Tweak: Inline documentation and PHP doc improvements
30
+
31
+
32
+ ### 0.9.0 - 2018-11-26
33
+
34
+ * *Second beta version*
35
+ * New: More settings for Polylang Switcher widget
36
+ * Tweak: Improved Dynamic Tags additions
37
+ * Tweak: Improved Elementor Finder integration
38
+
39
+
40
+ ### 0.8.0 - 2018-11-25
41
+
42
+ * *First beta version*
43
+ * New: Added native Elementor Widget - Polylang Language Switcher
44
+ * New: Added Dynamic Tags for Polylang (requires Elementor Pro)
45
+
46
+
47
+ ### 0.7.0 - 2018-11-24
48
+
49
+ * *Second alpha version*
50
+ * New: Added Elementor Finder integration for Polylang plugin links and resources
51
+ * New: Make plugin translateable - added full German translations
52
+ * New: Added Readme file, plus `composer.json`
53
+ * New: First public alpha release on GitHub
54
+
55
+
56
+ ### 0.5.0 - 2018-10-30
57
+
58
+ * *Plugin idea by Brad*
59
+ * *First alpha version by David*
60
+ * New: Template tweaks work in form of plugin code - coding standards improvements
LICENSE ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+
294
+ Copyright (C) 2018 David Decker
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ {signature of Ty Coon}, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
LICENSE.txt ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+
294
+ Copyright (C) 2018 David Decker
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ {signature of Ty Coon}, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
README.md ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Polylang Connect for Elementor - Language Switcher & Template Tweaks
2
+ **Contributors:** [daveshine](https://profiles.wordpress.org/daveshine), [p4fbradjohnson](https://profiles.wordpress.org/p4fbradjohnson), [deckerweb](https://profiles.wordpress.org/deckerweb), [wpautobahn](https://profiles.wordpress.org/wpautobahn)
3
+ **Donate link:** https://www.paypal.me/deckerweb
4
+ **Tags:** elementor, polylang, multilingual, language switcher, languages, templates, widget, finder, dynamic tags, deckerweb
5
+ **Requires at least:** 4.7
6
+ **Tested up to:** 5.3
7
+ **Requires PHP:** 5.6
8
+ **Stable tag:** 1.0.0
9
+ **License:** GPL-2.0-or-later
10
+ **License URI:** https://opensource.org/licenses/GPL-2.0
11
+
12
+ Connect Polylang with Elementor - show correct Templates, plus Elementor language switcher widget.
13
+
14
+ [<img src="https://raw.githubusercontent.com/deckerweb/connect-polylang-elementor/master/assets-repos/github-com/cpel-banner.png" data-canonical-src="https://raw.githubusercontent.com/deckerweb/connect-polylang-elementor/master/assets-repos/github-com/cpel-banner.png" width="772" height="250" />](https://wordpress.org/plugins/connect-polylang-elementor/)
15
+
16
+
17
+ ## Description
18
+
19
+
20
+ Connect the Polylang multilingual plugin with Elementor Page Builder: This plugin will make Elementor and Polylang **show the correct language templates**, especially with Elementor Pro Theme Builder. Plus: native **Polylang Language Switcher Elementor widget**, new Dynamic Tags, and Polylang links added to the **Elementor Finder** feature.
21
+
22
+ [![Video of Plugin's Live Demo and Walkthrough](https://img.youtube.com/vi/tMmJ6sdMdxw/0.jpg)](https://www.youtube.com/watch?v=tMmJ6sdMdxw)
23
+ [**original video link**](https://www.youtube.com/watch?v=tMmJ6sdMdxw) *by plugin developer David Decker*
24
+
25
+
26
+ ### What the Plugin Does
27
+ * **Shows the correct Template** (for different languages): Polylang Connect for Elementor allows Polylang to show the correct Elementor template to be displayed on the front end. Before this plugin, Elementor did not show the correct language (translated) template.
28
+ * Beyond enabling the Elementor post type in Polylang settings, plus assigning every post/page/template to a language, no further settings are needed for these template tweaks. It just works out of the box. All the heavy lifting happens under the hood.
29
+ * **Usage Example:**
30
+ * Make a header template in Elementor, set display conditions in Elementor panel, assign this to one language (English for example)
31
+ * Make a second header template in Elementor, set NO display conditions for this one (by assigning 2 of the same display conditions, you can create a conflict in Elementor), but assign to another Polylang language (Portuguese for example), meaning to link those languages/templates in Polylang.
32
+ * Result: when viewing in frontend the proper English content appears with the English header template, translated content in Portuguese appears with the Portuguese header template.
33
+ * Go on: The principle is always the same, now add German language, Spanish and so on ;-)
34
+ * [See **live demo** on co-author's own website](https://mariselaveludo.fashion/) // [Screenshot gallery](https://www.dropbox.com/sh/3i9tuh76etmhl1a/AADm_4L_aesp8Q9ss5NXuSiMa?dl=0)
35
+
36
+
37
+ ### Plus: Even More Features
38
+ * **Polylang Language Switcher Widget**: A native Elementor Widget to easily build a nice language switcher menu and have **more styling options** for non-coders at hand
39
+ * **Elementor Finder integration**: Adds Polylang languages, admin settings links, plus support resources as quick jump links to the Elementor Finder feature (Elementor v2.3.0+) - so you can navigate more quickly from whereever you are
40
+ * **Dynamic Tags** in Elementor Pro: Polylang Language Names (all registered/active) / Current Language Name / Current Language Code / Current Language Flag (image) / Current Language URL
41
+
42
+
43
+ ### Further Plugin Info
44
+ * More features might be added in the future.
45
+ * Community collaboration between David Decker and Brad Johnson, and more code coming from the Elementor/Polylang community
46
+
47
+
48
+ ### Where to Get Support?
49
+ * [**Polylang User Community Group at Facebook**](https://www.facebook.com/groups/polylang.users/) - highly recommended for all users of this plugin!
50
+ * We monitor [the plugin's support forum](https://wordpress.org/support/plugin/connect-polylang-elementor) here on WordPress.org as well - but our preferred support channel is the FB community group
51
+ * **What is covered by our support?** - All regarding THIS plugin ("Polyang Connect for Elementor"), plus the relation to *Polylang*, *Elementor* and *Elementor Pro* of course.
52
+ * **What is NOT covered by support?** - Anything general regarding multilingual topics and WordPress. Explicitely we **DO NOT** offer any "WPML", "WPBakery" or "Visual Composer" support, and also not for your theme etc.!!!
53
+
54
+
55
+ ### Translations
56
+ * English (default, `en_US`) - always included
57
+ * German (`de_DE`) - always included
58
+ * German formal (`de_DE_formal`) - always included
59
+ * `.pot` file (`connect-polylang-elementor.pot`) for translators is also always included :)
60
+ * Easy plugin translation platform with GlotPress tool: [Translate "Polylang Connect for Elementor"...](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
61
+
62
+
63
+ ### Feedback
64
+ * I am open for your suggestions and feedback - Thank you for using or trying out one of my plugins!
65
+ * Join our [**Facebook User Community Support Group**](https://www.facebook.com/groups/deckerweb.wordpress.plugins/)
66
+
67
+
68
+ ### My Other Plugins
69
+ * [**Toolbar Extras for Elementor - WordPress Admin Bar Enhanced**](https://wordpress.org/plugins/connect-polylang-elementor/)
70
+ * [**Toolbar Extras for Oxygen Builder - Add-On plugin**](https://wordpress.org/plugins/toolbar-extras-oxygen/)
71
+ * [**Toolbar Extras for MainWP Dashboard - Add-On plugin**](https://wordpress.org/plugins/toolbar-extras-mainwp/)
72
+ * [**Toolbar Extras for Give Donations (GiveWP) - Add-On plugin**](https://wordpress.org/plugins/toolbar-extras-givewp/)
73
+ * [**Builder Shortcode Extras – WordPress Shortcodes Collection to Save You Time**](https://wordpress.org/plugins/builder-shortcode-extras/)
74
+ * [**Builder Template Categories - for WordPress Page Builders**](https://wordpress.org/plugins/builder-template-categories/)
75
+ * [**Simple Download Manager for WP Document Revisions**](https://wordpress.org/plugins/wpdr-simple-downloads/)
76
+ * [Genesis What's New Info](https://wordpress.org/plugins/genesis-whats-new-info/)
77
+ * [Genesis Layout Extras](https://wordpress.org/plugins/genesis-layout-extras/)
78
+ * [Genesis Widgetized Not Found & 404](https://wordpress.org/plugins/genesis-widgetized-notfound/)
79
+ * [Genesis Extra Settings Transporter](https://wordpress.org/plugins/genesis-extra-settings-transporter/)
80
+ * [Genesis Widgetized Footer](https://wordpress.org/plugins/genesis-widgetized-footer/)
81
+ * [Genesis Widgetized Archive](https://wordpress.org/plugins/genesis-widgetized-archive/)
82
+ * [Multisite Toolbar Additions](https://wordpress.org/plugins/multisite-toolbar-additions/)
83
+ * [Cleaner Plugin Installer](https://wordpress.org/plugins/cleaner-plugin-installer/)
84
+ * [*My plugins newsletter*](https://eepurl.com/gbAUUn)
85
+
86
+
87
+
88
+ ## Installation
89
+
90
+
91
+ ### Minimum Requirements
92
+
93
+ * WordPress version 4.7 or higher
94
+ * [Elementor](https://wordpress.org/plugins/elementor/) and [Polylang](https://wordpress.org/plugins/polylang/) plugins - free versions from WordPress.org Plugin Directory
95
+ * **Optional:** *Elementor Pro* which is needed for Theme Building possibilities (Header templates etc.). This is a paid premium product by Elementor LTD, [available via elementor.com](https://toolbarextras.com/go/elementor-pro/)
96
+ * PHP version 5.6 or higher
97
+ * MySQL version 5.0 or higher
98
+
99
+
100
+ ### We Recommend Your Host Supports at least:
101
+
102
+ * PHP version 7.2 or higher
103
+ * MySQL version 5.6 or higher / or MariaDB 10 or higher
104
+
105
+
106
+ ### Installation
107
+
108
+ 1. Install using the WordPress built-in Plugin installer (via **Plugins > Add New** - search for `connect polylang elementor`), or extract the ZIP file and drop the contents in the `wp-content/plugins/` directory of your WordPress installation.
109
+ 2. Activate the plugin through the 'Plugins' menu in WordPress.
110
+ 3. Go to **Polylang > Settings > Custom post types and Taxonomies**, enable the "My Templates" post type (Elementor)
111
+ 4. Assign languages to your pages/ posts/ Elementor templates
112
+ 5. For Elementor templates: set display conditions in Elementor for one template only (your main language is recommended) - templates in the other languages will then get loaded via this plugin magically! :)
113
+ 6. Additionally use the native Elementor Widget: Polylang Switcher
114
+
115
+
116
+
117
+ ## Frequently Asked Questions
118
+
119
+
120
+ ### Where to get support?
121
+
122
+ At best in our [**Polylang User Community Group at Facebook**](https://www.facebook.com/groups/polylang.users/) - highly recommended for all users of this plugin!
123
+
124
+ Additionally, we also monitor [the plugin's support forum](https://wordpress.org/support/plugin/connect-polylang-elementor) here on WordPress.org as well - but our preferred support channel is the FB community group.
125
+
126
+ * **What is covered by our support?** - All things regarding THIS plugin ("Polyang Connect for Elementor"), plus the relation to *Polylang*, *Elementor* and *Elementor Pro* of course.
127
+ * **What is NOT covered by support?** - Anything general regarding multilingual topics and WordPress. Explicitely we **DO NOT** offer any "WPML", "WPBakery" or "Visual Composer" support, and also not for your theme etc.!!!
128
+
129
+
130
+
131
+ ### Is there a live demo?
132
+
133
+ Yes, there is.
134
+
135
+ [**See live demo on co-author's own website**](https://mariselaveludo.fashion/)
136
+
137
+ [Plus: *bigger* versions of the above screenshots are in this external gallery ;-)](https://www.dropbox.com/sh/3i9tuh76etmhl1a/AADm_4L_aesp8Q9ss5NXuSiMa?dl=0)
138
+
139
+
140
+
141
+ ### Recommended Workflow?
142
+
143
+ 1. Setup Polylang at first, add at least TWO languages, one of them make your default language (in Polylang)
144
+ 2. Add content to your default Polylang language - if Polylang asks you to apply existing content to it, you should most likely click "ok" and proceed - it works really fine :)
145
+ 3. After that setup an Elementor Theme Builder template - asign it to your Polylang default language, apply conditions in Elementor
146
+ 4. Next, setup a translation template for the template of 3.) -- asign your second Polylang language, DO NOT apply conditions in Elementor
147
+
148
+
149
+
150
+ ### Recommended Polylang settings?
151
+
152
+ If you have issues with proper display of your translated templates, pages, content it is recommended to check your settings:
153
+
154
+ In Polylang Settings at `Languages > Settings > URL Modificatons` set to the following option: "The language is set from the directory name in pretty permalinks"
155
+
156
+ And in the case, all is working well with your current settings then please do not touch them. The above recommendation can be necessary for some users/ installs but not necessarily for all.
157
+
158
+
159
+
160
+ ### Will this work with Elementor Popup Builder?
161
+
162
+ It most likely will work totally fine if you follow our recommended workflow (see above). If not, please ask in [our FB user group](https://www.facebook.com/groups/polylang.users/).
163
+
164
+
165
+
166
+ ### Correct Elementor template does not show up?
167
+
168
+ Every page/ post/ template must be assigned a language for this to work. This is standard Polylang procedure but it should be noted in case "it doesnt work".
169
+
170
+ Also, for Elementor Templates, the post type must be enabled for Polylang support: Go to **Polylang > Settings > Custom post types and Taxonomies**, enable the "My Templates" post type (Elementor).
171
+
172
+
173
+
174
+ ### Where is the Elementor Widget to be found?
175
+
176
+ It's in the widget category "General Elements". Plus, if Elementor Pro is active and you're editing a template, the widget additionally appears in the "Site" widget category.
177
+
178
+ *Always via search:* When searching for widgets type "polylang" or "languages" and it will show up immediately! ;-)
179
+
180
+
181
+
182
+ ### Where is the plugin's settings page?
183
+
184
+ This plugin has NO settings page, as it does not need one. All it does works just under the hood. Activate the plugin. Done.
185
+
186
+ (If there will be settings needed in the future, we might add options in later plugin versions.)
187
+
188
+
189
+
190
+ ### Is Polylang Pro supported?
191
+
192
+ Yes, it is! :)
193
+ All features of "Polylang Connect for Elementor" work with both, *Polylang* (free) AND *Polylang Pro* (Premium).
194
+
195
+
196
+
197
+ ### Are custom flags supported?
198
+
199
+ In general, [custom flags](https://polylang.pro/doc/can-i-use-my-own-flags-for-the-language-switcher/) are supported in the Polylang Switcher Elementor widget and in the Dynamic Tag (Current Language Flag).
200
+ However, the default flags in Polylang are sized `16px` wide and `11px` high, this automatically applies to custom flags - as it is fully handled internally by Polylang.
201
+
202
+ To use a different size for custom flags we are trying to find ways to implement this for Elementor in future versions of this plugin.
203
+
204
+
205
+
206
+ ### Typography and uppercase settings?
207
+
208
+ In the Polylang Switcher Elementor widget there are typography settings available for the Switcher menu items. These settings are CSS based of course, and applied "globally" to the various states they are for: normal, hover, active (current language). The available toggles for uppercase are done code-wise and therefore have a lower priority - this means the CSS always takes over, if wanted. That way you are most flexible with quick settings (toggles) but have all styling options at hand if needed.
209
+
210
+
211
+
212
+ ### Is Elementor plugin needed?
213
+
214
+ Yes, it is. Otherwise this connect plugin won't do anything. Elementor is available for free on WordPress.org.
215
+
216
+ The Elementor Pro Add-On plugin is needed for the Theme Builder capabilities (for example Header templates), plus the feature of "Dynamic Tags". So it is highly recommended. But if it is not installed/ activated, the depending features from the connect plugin won't even load. So it is all optional.
217
+
218
+ The language switcher widget only needs Elementor base plugin to work ;-)
219
+
220
+
221
+
222
+ ### Other recommended plugins for multilingual websites?
223
+
224
+ There are quite a few:
225
+
226
+ * [**Country Flags for Elementor**](https://wordpress.org/plugins/country-flags-for-elementor/) - Native Elementor widget
227
+ * [**Polylang Pro** (Premium)](https://polylang.pro/downloads/polylang-pro/) - The official premium version with more features, plus premium support
228
+ * [**Polylang for WooCommerce** (Premium)](https://polylang.pro/downloads/polylang-for-woocommerce/) - Makes WooCommerce multilingual - official Polylang Add-On
229
+ * [**Lingotek Translation**](https://wordpress.org/plugins/lingotek-translation/) - Native Polylang integration - Lingotek brings convenient cloud-based localization and translation for WordPress
230
+ * [**Integrate Gravity Forms + Polylang**](https://wordpress.org/plugins/integrate-gravity-forms-polylang/) - Add form titles, descriptions, field labels, etc. to Polylang string translations
231
+ * [**WPML to Polylang**](https://wordpress.org/plugins/wpml-to-polylang/) - From the Polylang developer himself
232
+
233
+
234
+
235
+ ### More info on Translations?
236
+
237
+ * English - default, always included
238
+ * German (de_DE): Deutsch - immer dabei! :-)
239
+ * For custom and update-safe language files please upload them to `/wp-content/languages/connect-polylang-elementor/` (just create this folder) - This enables you to use fully custom translations that won't be overridden on plugin updates. Also, complete custom English wording is possible with that as well, just use a language file like `connect-polylang-elementor-en_US.mo/.po` to achieve that (for creating one see the following tools).
240
+
241
+ **Easy WordPress.org plugin translation platform with GlotPress platform:** [**Translate "Polylang Connect for Elementor"...**](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
242
+
243
+ *Note:* All my plugins are internationalized/ translateable by default. This is very important for all users worldwide. So please contribute your language to the plugin to make it even more useful. For translating and validating I recommend the awesome ["Poedit Editor"](https://www.poedit.net/), which works fine on Windows, macOS and Linux.
244
+
245
+
246
+
247
+ ## Screenshots
248
+
249
+
250
+ ### 1. Ensure that my templates is ticked in Polylang post types and Taxonomies. Although the plugin will automatically tick this for you 😊
251
+ ![Ensure that my templates is ticked in Polylang post types and Taxonomies. Although the plugin will automatically tick this for you 😊](https://ps.w.org/connect-polylang-elementor/assets/screenshot-1.png)
252
+
253
+
254
+ ### 2. Header Template in Elementor showing that they have both been translated
255
+ ![Header Template in Elementor showing that they have both been translated](https://ps.w.org/connect-polylang-elementor/assets/screenshot-2.png)
256
+
257
+
258
+ ### 3. Polylang Widget in Elementor under Site
259
+ ![Polylang Widget in Elementor under Site](https://ps.w.org/connect-polylang-elementor/assets/screenshot-3.png)
260
+
261
+
262
+ ### 4. Polylang Widget options in Elementor
263
+ ![Polylang Widget options in Elementor](https://ps.w.org/connect-polylang-elementor/assets/screenshot-4.png)
264
+
265
+
266
+ ### 5. Polylang Widget Styling Options in Elementor
267
+ ![Polylang Widget Styling Options in Elementor](https://ps.w.org/connect-polylang-elementor/assets/screenshot-5.png)
268
+
269
+
270
+ ### 6. Set your primary language display conditions for your primary language
271
+ ![kkkk](https://ps.w.org/connect-polylang-elementor/assets/screenshot-6.png)
272
+
273
+
274
+ ### 7. DO NOT SET A DISPLAY CONDITION FOR ANY OTHER LANGUAGE ---> Polylang will do this for you. Save without conditions
275
+ ![Set your primary language display conditions for your primary language](https://ps.w.org/connect-polylang-elementor/assets/screenshot-7.png)
276
+
277
+
278
+ ### 8. (1/2) Working language header templates on the front end. Styled by the widget. Previously this was not an option in Polylang. (other than editing the menu options) Polylang users could not display language codes but now they can 😉. Thanks to Polylang Connect for Elementor.
279
+ ![(1/2) Working language header templates on the front end. Styled by the widget. Previously this was not an option in Polylang. (other than editing the menu options) Polylang users could not display language codes but now they can 😉. Thanks to Polylang Connect for Elementor.](https://ps.w.org/connect-polylang-elementor/assets/screenshot-8.png)
280
+
281
+
282
+ ### 9. (2/2) Working language header templates on the front end. Styled by the widget. Previously this was not an option in Polylang. (other than editing the menu options) Polylang users could not display language codes but now they can 😉. Thanks to Polylang Connect for Elementor.
283
+ ![(2/2) Working language header templates on the front end. Styled by the widget. Previously this was not an option in Polylang. (other than editing the menu options) Polylang users could not display language codes but now they can 😉. Thanks to Polylang Connect for Elementor.](https://ps.w.org/connect-polylang-elementor/assets/screenshot-9.png)
284
+
285
+
286
+ ### 10. Recommended Polylang URL settings if you have issues with translated templates/ templates
287
+ ![Recommended Polylang URL settings if you have issues with translated templates/ templates](https://ps.w.org/connect-polylang-elementor/assets/screenshot-10.png)
288
+
289
+
290
+
291
+
292
+ ## Changelog
293
+
294
+
295
+ ### 1.0.0 - 2018-11-28
296
+ * Official public release on WordPress.org
297
+
298
+
299
+ ### 0.9.1 - 2018-11-27
300
+ * *First Release Candidate (RC) version*
301
+ * New: Automatic enabling of Elementor My Templates post type for Polylang support
302
+ * Tweak: Code improvements throughout
303
+ * Tweak: Inline documentation and PHP doc improvements
304
+
305
+
306
+ ### 0.9.0 - 2018-11-26
307
+ * *Second beta version*
308
+ * New: More settings for Polylang Switcher widget
309
+ * Tweak: Improved Dynamic Tags additions
310
+ * Tweak: Improved Elementor Finder integration
311
+
312
+
313
+ ### 0.8.0 - 2018-11-25
314
+ * *First beta version*
315
+ * New: Added native Elementor Widget - Polylang Language Switcher
316
+ * New: Added Dynamic Tags for Polylang (requires Elementor Pro)
317
+
318
+
319
+ ### 0.7.0 - 2018-11-24
320
+ * *Second alpha version*
321
+ * New: Added Elementor Finder integration for Polylang plugin links and resources
322
+ * New: Make plugin translateable - added full German translations
323
+ * New: Added Readme file, plus `composer.json`
324
+ * New: First public alpha release on GitHub
325
+
326
+
327
+ ### 0.5.0 - 2018-10-30
328
+ * *Plugin idea by Brad*
329
+ * *First alpha version by David*
330
+ * New: Template tweaks work in form of plugin code - coding standards improvements
331
+
332
+
333
+
334
+ ## Upgrade Notice
335
+
336
+
337
+ ### 1.0.0
338
+ Just released into the wild.
339
+
340
+
341
+ ## Donate
342
+ Enjoy using *Polylang Connect for Elementor*? [**Please consider making a donation**](https://www.paypal.me/deckerweb) to support the project's continued development.
343
+
344
+
345
+ ## Credits
346
+ Credit where credit is due. The following code/ classes, all licensed under the GPL. Note: Credit is also referenced in the code doc block inline where used.
347
+
348
+ * Polylang Switcher class (Elementor Widget) and its CSS based on widget from plugin "Language Switcher for Elementor" by Solitweb (GPLv2 or later)
349
+
350
+
351
+ ## Plugin Links
352
+ * [Translations (WP GlotPress Platform)](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
353
+ * [User support forums](https://wordpress.org/support/plugin/connect-polylang-elementor)
354
+ * [Polylang Users Facebook Group](https://www.facebook.com/groups/polylang.users/)
355
+ * [DECKERWEB WordPress Plugins Facebook Group](https://www.facebook.com/groups/deckerweb.wordpress.plugins/)
assets/css/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
assets/css/plsfe-editor.css ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * // assets/css/plsfe-editor
3
+ * @package Polylang Connect for Elementor - Assets
4
+ * @since 1.0.0
5
+ *
6
+ * Note: Code based on Widget class of plugin "Language Switcher for Elementor",
7
+ * licensed under GPLv2 or later.
8
+ * @author Solitweb
9
+ * @link https://solitweb.be/
10
+ */
11
+
12
+ .plsfe-switcher .plsfe-menu {
13
+ list-style: none;
14
+ margin: 0;
15
+ padding: 0;
16
+ line-height: normal;
17
+ -webkit-tap-highlight-color: transparent;
18
+ }
19
+
20
+ .plsfe-layout-vertical .plsfe-switcher {
21
+ display: block;
22
+ }
23
+
24
+ .plsfe-layout-horizontal .plsfe-switcher {
25
+ display: -webkit-box;
26
+ display: -webkit-flex;
27
+ display: -ms-flexbox;
28
+ display: flex;
29
+ }
30
+
31
+ .plsfe-layout-vertical .plsfe-menu {
32
+ display: block;
33
+ }
34
+
35
+ .plsfe-layout-horizontal .plsfe-menu {
36
+ display: -webkit-box;
37
+ display: -webkit-flex;
38
+ display: -ms-flexbox;
39
+ display: flex;
40
+ -webkit-flex-wrap: wrap;
41
+ -ms-flex-wrap: wrap;
42
+ flex-wrap: wrap;
43
+ }
44
+
45
+
46
+ @media (max-width: 1024px) {
47
+
48
+ .plsfe-tablet-layout-vertical .plsfe-switcher {
49
+ display: block;
50
+ }
51
+ .plsfe-tablet-layout-horizontal .plsfe-switcher {
52
+ display: -webkit-box;
53
+ display: -webkit-flex;
54
+ display: -ms-flexbox;
55
+ display: flex;
56
+ }
57
+ .plsfe-tablet-layout-vertical .plsfe-menu {
58
+ display: block;
59
+ }
60
+ .plsfe-tablet-layout-horizontal .plsfe-menu {
61
+ display: -webkit-box;
62
+ display: -webkit-flex;
63
+ display: -ms-flexbox;
64
+ display: flex;
65
+ -webkit-flex-wrap: wrap;
66
+ -ms-flex-wrap: wrap;
67
+ flex-wrap: wrap;
68
+ }
69
+
70
+ }
71
+
72
+ @media (max-width: 767px) {
73
+
74
+ .plsfe-mobile-layout-vertical .plsfe-switcher {
75
+ display: block;
76
+ }
77
+
78
+ .plsfe-mobile-layout-horizontal .plsfe-switcher {
79
+ display: -webkit-box;
80
+ display: -webkit-flex;
81
+ display: -ms-flexbox;
82
+ display: flex;
83
+ }
84
+
85
+ .plsfe-mobile-layout-vertical .plsfe-menu {
86
+ display: block;
87
+ }
88
+
89
+ .plsfe-mobile-layout-horizontal .plsfe-menu {
90
+ display: -webkit-box;
91
+ display: -webkit-flex;
92
+ display: -ms-flexbox;
93
+ display: flex;
94
+ -webkit-flex-wrap: wrap;
95
+ -ms-flex-wrap: wrap;
96
+ flex-wrap: wrap;
97
+ }
98
+
99
+ }
100
+
101
+ .plsfe-switcher a {
102
+ display: -webkit-box;
103
+ display: -webkit-flex;
104
+ display: -ms-flexbox;
105
+ display: flex;
106
+ -webkit-box-align: center;
107
+ -webkit-align-items: center;
108
+ -ms-flex-align: center;
109
+ align-items: center;
110
+ }
111
+
112
+ .plsfe-align-right .plsfe-menu {
113
+ margin-left: auto;
114
+ margin-right: 0;
115
+ }
116
+
117
+ .plsfe-align-right .plsfe-menu > li > a {
118
+ -webkit-box-pack: end;
119
+ -webkit-justify-content: flex-end;
120
+ -ms-flex-pack: end;
121
+ justify-content: flex-end;
122
+ }
123
+
124
+ .plsfe-align-left .plsfe-menu {
125
+ margin-left: 0;
126
+ margin-right: auto;
127
+ }
128
+
129
+ .plsfe-align-left .plsfe-menu > li > a {
130
+ -webkit-box-pack: start;
131
+ -webkit-justify-content: flex-start;
132
+ -ms-flex-pack: start;
133
+ justify-content: flex-start;
134
+ }
135
+
136
+ .plsfe-align-center .plsfe-menu {
137
+ margin-left: auto;
138
+ margin-right: auto;
139
+ }
140
+
141
+ .plsfe-tablet-align-center.plsfe-tablet-layout-vertical .plsfe-menu > li > a {
142
+ -webkit-box-pack: center;
143
+ -webkit-justify-content: center;
144
+ -ms-flex-pack: center;
145
+ justify-content: center;
146
+ }
147
+
148
+ .plsfe-align-justify .plsfe-menu {
149
+ width: 100%;
150
+ }
151
+
152
+ .plsfe-align-justify .plsfe-menu > li {
153
+ -webkit-box-flex: 1;
154
+ -webkit-flex-grow: 1;
155
+ -ms-flex-positive: 1;
156
+ flex-grow: 1;
157
+ }
158
+
159
+ .plsfe-align-justify .plsfe-menu > li > a {
160
+ -webkit-box-pack: center;
161
+ -webkit-justify-content: center;
162
+ -ms-flex-pack: center;
163
+ justify-content: center;
164
+ }
165
+
166
+ @media (max-width: 1024px) {
167
+
168
+ .plsfe-tablet-align-right .plsfe-menu {
169
+ margin-left: auto;
170
+ margin-right: 0;
171
+ }
172
+ .plsfe-tablet-align-right .plsfe-menu > li > a {
173
+ -webkit-box-pack: end;
174
+ -webkit-justify-content: flex-end;
175
+ -ms-flex-pack: end;
176
+ justify-content: flex-end;
177
+ }
178
+ .plsfe-tablet-align-left .plsfe-menu {
179
+ margin-left: 0;
180
+ margin-right: auto;
181
+ }
182
+ .plsfe-tablet-align-left .plsfe-menu > li > a {
183
+ -webkit-box-pack: start;
184
+ -webkit-justify-content: flex-start;
185
+ -ms-flex-pack: start;
186
+ justify-content: flex-start;
187
+ }
188
+ .plsfe-tablet-align-center .plsfe-menu {
189
+ margin-left: auto;
190
+ margin-right: auto;
191
+ }
192
+ .plsfe-tablet-align-center .plsfe-menu > li > a {
193
+ -webkit-box-pack: center;
194
+ -webkit-justify-content: center;
195
+ -ms-flex-pack: center;
196
+ justify-content: center;
197
+ }
198
+ .plsfe-tablet-align-justify .plsfe-menu {
199
+ width: 100%;
200
+ }
201
+ .plsfe-tablet-align-justify .plsfe-menu > li {
202
+ -webkit-box-flex: 1;
203
+ -webkit-flex-grow: 1;
204
+ -ms-flex-positive: 1;
205
+ flex-grow: 1;
206
+ }
207
+ .plsfe-tablet-align-justify .plsfe-menu > li > a {
208
+ -webkit-box-pack: center;
209
+ -webkit-justify-content: center;
210
+ -ms-flex-pack: center;
211
+ justify-content: center;
212
+ }
213
+
214
+ }
215
+
216
+ @media (max-width: 767px) {
217
+
218
+ .plsfe-mobile-align-right .plsfe-menu {
219
+ margin-left: auto;
220
+ margin-right: 0;
221
+ }
222
+ .plsfe-mobile-align-right .plsfe-menu > li > a {
223
+ -webkit-box-pack: end;
224
+ -webkit-justify-content: flex-end;
225
+ -ms-flex-pack: end;
226
+ justify-content: flex-end;
227
+ }
228
+ .plsfe-mobile-align-left .plsfe-menu {
229
+ margin-left: 0;
230
+ margin-right: auto;
231
+ }
232
+ .plsfe-mobile-align-left .plsfe-menu > li > a {
233
+ -webkit-box-pack: start;
234
+ -webkit-justify-content: flex-start;
235
+ -ms-flex-pack: start;
236
+ justify-content: flex-start;
237
+ }
238
+ .plsfe-mobile-align-center .plsfe-menu {
239
+ margin-left: auto;
240
+ margin-right: auto;
241
+ }
242
+ .plsfe-mobile-align-center .plsfe-menu > li > a {
243
+ -webkit-box-pack: center;
244
+ -webkit-justify-content: center;
245
+ -ms-flex-pack: center;
246
+ justify-content: center;
247
+ }
248
+ .plsfe-mobile-align-justify .plsfe-menu {
249
+ width: 100%;
250
+ }
251
+ .plsfe-mobile-align-justify .plsfe-menu > li {
252
+ -webkit-box-flex: 1;
253
+ -webkit-flex-grow: 1;
254
+ -ms-flex-positive: 1;
255
+ flex-grow: 1;
256
+ }
257
+ .plsfe-mobile-align-justify .plsfe-menu > li > a {
258
+ -webkit-box-pack: center;
259
+ -webkit-justify-content: center;
260
+ -ms-flex-pack: center;
261
+ justify-content: center;
262
+ }
263
+
264
+ }
assets/css/plsfe-editor.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .plsfe-switcher .plsfe-menu{list-style:none;margin:0;padding:0;line-height:normal;-webkit-tap-highlight-color:transparent}.plsfe-layout-vertical .plsfe-switcher{display:block}.plsfe-layout-horizontal .plsfe-switcher{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.plsfe-layout-vertical .plsfe-menu{display:block}.plsfe-layout-horizontal .plsfe-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}@media (max-width:1024px){.plsfe-tablet-layout-vertical .plsfe-switcher{display:block}.plsfe-tablet-layout-horizontal .plsfe-switcher{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.plsfe-tablet-layout-vertical .plsfe-menu{display:block}.plsfe-tablet-layout-horizontal .plsfe-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}@media (max-width:767px){.plsfe-mobile-layout-vertical .plsfe-switcher{display:block}.plsfe-mobile-layout-horizontal .plsfe-switcher{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.plsfe-mobile-layout-vertical .plsfe-menu{display:block}.plsfe-mobile-layout-horizontal .plsfe-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.plsfe-switcher a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.plsfe-align-right .plsfe-menu{margin-left:auto;margin-right:0}.plsfe-align-right .plsfe-menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.plsfe-align-left .plsfe-menu{margin-left:0;margin-right:auto}.plsfe-align-left .plsfe-menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.plsfe-align-center .plsfe-menu{margin-left:auto;margin-right:auto}.plsfe-tablet-align-center.plsfe-tablet-layout-vertical .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.plsfe-align-justify .plsfe-menu{width:100%}.plsfe-align-justify .plsfe-menu>li{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.plsfe-align-justify .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}@media (max-width:1024px){.plsfe-tablet-align-right .plsfe-menu{margin-left:auto;margin-right:0}.plsfe-tablet-align-right .plsfe-menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.plsfe-tablet-align-left .plsfe-menu{margin-left:0;margin-right:auto}.plsfe-tablet-align-left .plsfe-menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.plsfe-tablet-align-center .plsfe-menu{margin-left:auto;margin-right:auto}.plsfe-tablet-align-center .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.plsfe-tablet-align-justify .plsfe-menu{width:100%}.plsfe-tablet-align-justify .plsfe-menu>li{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.plsfe-tablet-align-justify .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}@media (max-width:767px){.plsfe-mobile-align-right .plsfe-menu{margin-left:auto;margin-right:0}.plsfe-mobile-align-right .plsfe-menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.plsfe-mobile-align-left .plsfe-menu{margin-left:0;margin-right:auto}.plsfe-mobile-align-left .plsfe-menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.plsfe-mobile-align-center .plsfe-menu{margin-left:auto;margin-right:auto}.plsfe-mobile-align-center .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.plsfe-mobile-align-justify .plsfe-menu{width:100%}.plsfe-mobile-align-justify .plsfe-menu>li{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.plsfe-mobile-align-justify .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}
assets/css/plsfe-frontend.css ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * // assets/css/plsfe-frontend
3
+ * @package Polylang Connect for Elementor - Assets
4
+ * @since 1.0.0
5
+ *
6
+ * Note: Code based on Widget class of plugin "Language Switcher for Elementor",
7
+ * licensed under GPLv2 or later.
8
+ * @author Solitweb
9
+ * @link https://solitweb.be/
10
+ */
11
+
12
+ .plsfe-switcher .plsfe-menu {
13
+ list-style: none;
14
+ margin: 0;
15
+ padding: 0;
16
+ line-height: normal;
17
+ -webkit-tap-highlight-color: transparent;
18
+ }
19
+
20
+ .plsfe-layout-vertical .plsfe-switcher {
21
+ display: block;
22
+ }
23
+
24
+ .plsfe-layout-horizontal .plsfe-switcher {
25
+ display: -webkit-box;
26
+ display: -webkit-flex;
27
+ display: -ms-flexbox;
28
+ display: flex;
29
+ }
30
+
31
+ .plsfe-layout-vertical .plsfe-menu {
32
+ display: block;
33
+ }
34
+
35
+ .plsfe-layout-horizontal .plsfe-menu {
36
+ display: -webkit-box;
37
+ display: -webkit-flex;
38
+ display: -ms-flexbox;
39
+ display: flex;
40
+ -webkit-flex-wrap: wrap;
41
+ -ms-flex-wrap: wrap;
42
+ flex-wrap: wrap;
43
+ }
44
+
45
+ @media (max-width: 1024px) {
46
+
47
+ .plsfe-tablet-layout-vertical .plsfe-switcher {
48
+ display: block;
49
+ }
50
+
51
+ .plsfe-tablet-layout-horizontal .plsfe-switcher {
52
+ display: -webkit-box;
53
+ display: -webkit-flex;
54
+ display: -ms-flexbox;
55
+ display: flex;
56
+ }
57
+
58
+ .plsfe-tablet-layout-vertical .plsfe-menu {
59
+ display: block;
60
+ }
61
+
62
+ .plsfe-tablet-layout-horizontal .plsfe-menu {
63
+ display: -webkit-box;
64
+ display: -webkit-flex;
65
+ display: -ms-flexbox;
66
+ display: flex;
67
+ -webkit-flex-wrap: wrap;
68
+ -ms-flex-wrap: wrap;
69
+ flex-wrap: wrap;
70
+ }
71
+
72
+ }
73
+
74
+ @media (max-width: 767px) {
75
+
76
+ .plsfe-mobile-layout-vertical .plsfe-switcher {
77
+ display: block;
78
+ }
79
+ .plsfe-mobile-layout-horizontal .plsfe-switcher {
80
+ display: -webkit-box;
81
+ display: -webkit-flex;
82
+ display: -ms-flexbox;
83
+ display: flex;
84
+ }
85
+ .plsfe-mobile-layout-vertical .plsfe-menu {
86
+ display: block;
87
+ }
88
+ .plsfe-mobile-layout-horizontal .plsfe-menu {
89
+ display: -webkit-box;
90
+ display: -webkit-flex;
91
+ display: -ms-flexbox;
92
+ display: flex;
93
+ -webkit-flex-wrap: wrap;
94
+ -ms-flex-wrap: wrap;
95
+ flex-wrap: wrap;
96
+ }
97
+
98
+ }
99
+
100
+ .plsfe-switcher a {
101
+ display: -webkit-box;
102
+ display: -webkit-flex;
103
+ display: -ms-flexbox;
104
+ display: flex;
105
+ -webkit-box-align: center;
106
+ -webkit-align-items: center;
107
+ -ms-flex-align: center;
108
+ align-items: center;
109
+ }
110
+
111
+ .plsfe-align-right .plsfe-menu {
112
+ margin-left: auto;
113
+ margin-right: 0;
114
+ }
115
+
116
+ .plsfe-align-right .plsfe-menu > li > a {
117
+ -webkit-box-pack: end;
118
+ -webkit-justify-content: flex-end;
119
+ -ms-flex-pack: end;
120
+ justify-content: flex-end;
121
+ }
122
+
123
+ .plsfe-align-left .plsfe-menu {
124
+ margin-left: 0;
125
+ margin-right: auto;
126
+ }
127
+
128
+ .plsfe-align-left .plsfe-menu > li > a {
129
+ -webkit-box-pack: start;
130
+ -webkit-justify-content: flex-start;
131
+ -ms-flex-pack: start;
132
+ justify-content: flex-start;
133
+ }
134
+
135
+ .plsfe-align-center .plsfe-menu {
136
+ margin-left: auto;
137
+ margin-right: auto;
138
+ }
139
+
140
+ .plsfe-tablet-align-center.plsfe-tablet-layout-vertical .plsfe-menu > li > a {
141
+ -webkit-box-pack: center;
142
+ -webkit-justify-content: center;
143
+ -ms-flex-pack: center;
144
+ justify-content: center;
145
+ }
146
+
147
+ .plsfe-align-justify .plsfe-menu {
148
+ width: 100%;
149
+ }
150
+
151
+ .plsfe-align-justify .plsfe-menu > li {
152
+ -webkit-box-flex: 1;
153
+ -webkit-flex-grow: 1;
154
+ -ms-flex-positive: 1;
155
+ flex-grow: 1;
156
+ }
157
+
158
+ .plsfe-align-justify .plsfe-menu > li > a {
159
+ -webkit-box-pack: center;
160
+ -webkit-justify-content: center;
161
+ -ms-flex-pack: center;
162
+ justify-content: center;
163
+ }
164
+
165
+ @media (max-width: 1024px) {
166
+
167
+ .plsfe-tablet-align-right .plsfe-menu {
168
+ margin-left: auto;
169
+ margin-right: 0;
170
+ }
171
+
172
+ .plsfe-tablet-align-right .plsfe-menu > li > a {
173
+ -webkit-box-pack: end;
174
+ -webkit-justify-content: flex-end;
175
+ -ms-flex-pack: end;
176
+ justify-content: flex-end;
177
+ }
178
+
179
+ .plsfe-tablet-align-left .plsfe-menu {
180
+ margin-left: 0;
181
+ margin-right: auto;
182
+ }
183
+
184
+ .plsfe-tablet-align-left .plsfe-menu > li > a {
185
+ -webkit-box-pack: start;
186
+ -webkit-justify-content: flex-start;
187
+ -ms-flex-pack: start;
188
+ justify-content: flex-start;
189
+ }
190
+
191
+ .plsfe-tablet-align-center .plsfe-menu {
192
+ margin-left: auto;
193
+ margin-right: auto;
194
+ }
195
+
196
+ .plsfe-tablet-align-center .plsfe-menu > li > a {
197
+ -webkit-box-pack: center;
198
+ -webkit-justify-content: center;
199
+ -ms-flex-pack: center;
200
+ justify-content: center;
201
+ }
202
+
203
+ .plsfe-tablet-align-justify .plsfe-menu {
204
+ width: 100%;
205
+ }
206
+
207
+ .plsfe-tablet-align-justify .plsfe-menu > li {
208
+ -webkit-box-flex: 1;
209
+ -webkit-flex-grow: 1;
210
+ -ms-flex-positive: 1;
211
+ flex-grow: 1;
212
+ }
213
+
214
+ .plsfe-tablet-align-justify .plsfe-menu > li > a {
215
+ -webkit-box-pack: center;
216
+ -webkit-justify-content: center;
217
+ -ms-flex-pack: center;
218
+ justify-content: center;
219
+ }
220
+
221
+ }
222
+
223
+ @media (max-width: 767px) {
224
+
225
+ .plsfe-mobile-align-right .plsfe-menu {
226
+ margin-left: auto;
227
+ margin-right: 0;
228
+ }
229
+
230
+ .plsfe-mobile-align-right .plsfe-menu > li > a {
231
+ -webkit-box-pack: end;
232
+ -webkit-justify-content: flex-end;
233
+ -ms-flex-pack: end;
234
+ justify-content: flex-end;
235
+ }
236
+
237
+ .plsfe-mobile-align-left .plsfe-menu {
238
+ margin-left: 0;
239
+ margin-right: auto;
240
+ }
241
+
242
+ .plsfe-mobile-align-left .plsfe-menu > li > a {
243
+ -webkit-box-pack: start;
244
+ -webkit-justify-content: flex-start;
245
+ -ms-flex-pack: start;
246
+ justify-content: flex-start;
247
+ }
248
+
249
+ .plsfe-mobile-align-center .plsfe-menu {
250
+ margin-left: auto;
251
+ margin-right: auto;
252
+ }
253
+
254
+ .plsfe-mobile-align-center .plsfe-menu > li > a {
255
+ -webkit-box-pack: center;
256
+ -webkit-justify-content: center;
257
+ -ms-flex-pack: center;
258
+ justify-content: center;
259
+ }
260
+
261
+ .plsfe-mobile-align-justify .plsfe-menu {
262
+ width: 100%;
263
+ }
264
+
265
+ .plsfe-mobile-align-justify .plsfe-menu > li {
266
+ -webkit-box-flex: 1;
267
+ -webkit-flex-grow: 1;
268
+ -ms-flex-positive: 1;
269
+ flex-grow: 1;
270
+ }
271
+
272
+ .plsfe-mobile-align-justify .plsfe-menu > li > a {
273
+ -webkit-box-pack: center;
274
+ -webkit-justify-content: center;
275
+ -ms-flex-pack: center;
276
+ justify-content: center;
277
+ }
278
+
279
+ }
assets/css/plsfe-frontend.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .plsfe-switcher .plsfe-menu{list-style:none;margin:0;padding:0;line-height:normal;-webkit-tap-highlight-color:transparent}.plsfe-layout-vertical .plsfe-switcher{display:block}.plsfe-layout-horizontal .plsfe-switcher{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.plsfe-layout-vertical .plsfe-menu{display:block}.plsfe-layout-horizontal .plsfe-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}@media (max-width:1024px){.plsfe-tablet-layout-vertical .plsfe-switcher{display:block}.plsfe-tablet-layout-horizontal .plsfe-switcher{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.plsfe-tablet-layout-vertical .plsfe-menu{display:block}.plsfe-tablet-layout-horizontal .plsfe-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}@media (max-width:767px){.plsfe-mobile-layout-vertical .plsfe-switcher{display:block}.plsfe-mobile-layout-horizontal .plsfe-switcher{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.plsfe-mobile-layout-vertical .plsfe-menu{display:block}.plsfe-mobile-layout-horizontal .plsfe-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.plsfe-switcher a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.plsfe-align-right .plsfe-menu{margin-left:auto;margin-right:0}.plsfe-align-right .plsfe-menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.plsfe-align-left .plsfe-menu{margin-left:0;margin-right:auto}.plsfe-align-left .plsfe-menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.plsfe-align-center .plsfe-menu{margin-left:auto;margin-right:auto}.plsfe-tablet-align-center.plsfe-tablet-layout-vertical .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.plsfe-align-justify .plsfe-menu{width:100%}.plsfe-align-justify .plsfe-menu>li{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.plsfe-align-justify .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}@media (max-width:1024px){.plsfe-tablet-align-right .plsfe-menu{margin-left:auto;margin-right:0}.plsfe-tablet-align-right .plsfe-menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.plsfe-tablet-align-left .plsfe-menu{margin-left:0;margin-right:auto}.plsfe-tablet-align-left .plsfe-menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.plsfe-tablet-align-center .plsfe-menu{margin-left:auto;margin-right:auto}.plsfe-tablet-align-center .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.plsfe-tablet-align-justify .plsfe-menu{width:100%}.plsfe-tablet-align-justify .plsfe-menu>li{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.plsfe-tablet-align-justify .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}@media (max-width:767px){.plsfe-mobile-align-right .plsfe-menu{margin-left:auto;margin-right:0}.plsfe-mobile-align-right .plsfe-menu>li>a{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.plsfe-mobile-align-left .plsfe-menu{margin-left:0;margin-right:auto}.plsfe-mobile-align-left .plsfe-menu>li>a{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.plsfe-mobile-align-center .plsfe-menu{margin-left:auto;margin-right:auto}.plsfe-mobile-align-center .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.plsfe-mobile-align-justify .plsfe-menu{width:100%}.plsfe-mobile-align-justify .plsfe-menu>li{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.plsfe-mobile-align-justify .plsfe-menu>li>a{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}
assets/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
composer.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "deckerweb/connect-polylang-elementor",
3
+ "description": "WordPress plugin that connects the Polylang multilingual plugin with Elementor Page Builder: It helps showing the correct language templates, especially with Elementor Pro Theme Builder. Plus: native Polylang Language Switcher Elementor widget, new Dynamic Tags, and Polylang links added to the Elementor Finder feature.",
4
+ "keywords": ["elementor", "polylang", "multilingual", "languages", "templates", "conditions"],
5
+ "type": "wordpress-plugin",
6
+ "homepage": "https://github.com/deckerweb/connect-polylang-elementor",
7
+ "license": "GPL-2.0-or-later",
8
+ "authors": [
9
+ {
10
+ "name": "David Decker",
11
+ "homepage": "https://deckerweb.de/",
12
+ "role": "Developer"
13
+ }
14
+ ],
15
+ "support": {
16
+ "issues": "https://github.com/deckerweb/connect-polylang-elementor/issues",
17
+ "source": "https://github.com/deckerweb/connect-polylang-elementor"
18
+ },
19
+ "require": {
20
+ "php": ">=5.6"
21
+ }
22
+ }
connect-polylang-elementor.php ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php # -*- coding: utf-8 -*-
2
+ /**
3
+ * Main plugin file.
4
+ * @package Polylang Connect for Elementor
5
+ * @author David Decker
6
+ * @copyright Copyright (c) 2018-2019, David Decker - DECKERWEB
7
+ * @license GPL-2.0-or-later
8
+ * @link https://deckerweb.de/twitter
9
+ *
10
+ * @wordpress-plugin
11
+ * Plugin Name: Polylang Connect for Elementor
12
+ * Plugin URI: https://github.com/deckerweb/connect-polylang-elementor
13
+ * Description: Connect the Polylang multilingual plugin with Elementor Page Builder: This plugin will make Elementor and Polylang show the correct language templates, especially with Elementor Pro Theme Builder. Plus: native Polylang Language Switcher Elementor widget, new Dynamic Tags, and Polylang links added to the Elementor Finder feature.
14
+ * Version: 1.0.0
15
+ * Author: David Decker - DECKERWEB
16
+ * Author URI: https://polyglotwp.com/
17
+ * License: GPL-2.0-or-later
18
+ * License URI: https://opensource.org/licenses/GPL-2.0
19
+ * Text Domain: connect-polylang-elementor
20
+ * Domain Path: /languages/
21
+ * Requires WP: 4.7
22
+ * Requires PHP: 5.6
23
+ * GitHub Plugin URI: https://github.com/deckerweb/connect-polylang-elementor
24
+ * GitHub Branch: master
25
+ *
26
+ * Copyright (c) 2018-2019 David Decker - DECKERWEB
27
+ */
28
+
29
+ /**
30
+ * Exit if called directly.
31
+ */
32
+ if ( ! defined( 'ABSPATH' ) ) {
33
+ exit( 'Sorry, you are not allowed to access this file directly.' );
34
+ }
35
+
36
+
37
+ /**
38
+ * Setting constants.
39
+ *
40
+ * @since 1.0.0
41
+ */
42
+ /** Plugin version */
43
+ define( 'CPEL_PLUGIN_VERSION', '1.0.0' );
44
+
45
+ /** File */
46
+ define( 'CPEL__FILE__', __FILE__ );
47
+
48
+ /** Plugin directory */
49
+ define( 'CPEL_PLUGIN_DIR', trailingslashit( dirname( __FILE__ ) ) );
50
+
51
+ /** Plugin base directory */
52
+ define( 'CPEL_PLUGIN_BASEDIR', trailingslashit( dirname( plugin_basename( __FILE__ ) ) ) );
53
+
54
+
55
+ add_action( 'plugins_loaded', 'ddw_cpel_load_translations', 10 );
56
+ /**
57
+ * Load the text domain for translation of the plugin.
58
+ *
59
+ * @since 1.0.0
60
+ *
61
+ * @uses get_user_locale()
62
+ * @uses load_textdomain() Load translations first from WP_LANG_DIR sub folder.
63
+ * @uses load_plugin_textdomain() Additionally load default translations from
64
+ * plugin folder (default).
65
+ */
66
+ function ddw_cpel_load_translations() {
67
+
68
+ /** Set unique textdomain string */
69
+ $cpel_textdomain = 'connect-polylang-elementor';
70
+
71
+ /** The 'plugin_locale' filter is also used by default in load_plugin_textdomain() */
72
+ $locale = esc_attr(
73
+ apply_filters(
74
+ 'plugin_locale',
75
+ get_user_locale(),
76
+ $cpel_textdomain
77
+ )
78
+ );
79
+
80
+ /**
81
+ * WordPress languages directory
82
+ * Will default to: wp-content/languages/connect-polylang-elementor/connect-polylang-elementor-{locale}.mo
83
+ */
84
+ $cpel_wp_lang_dir = trailingslashit( WP_LANG_DIR ) . trailingslashit( $cpel_textdomain ) . $cpel_textdomain . '-' . $locale . '.mo';
85
+
86
+ /** Translations: First, look in WordPress' "languages" folder = custom & update-safe! */
87
+ load_textdomain(
88
+ $cpel_textdomain,
89
+ $cpel_wp_lang_dir
90
+ );
91
+
92
+ /** Translations: Secondly, look in 'wp-content/languages/plugins/' for the proper .mo file (= default) */
93
+ load_plugin_textdomain(
94
+ $cpel_textdomain,
95
+ FALSE,
96
+ CPEL_PLUGIN_BASEDIR . 'languages'
97
+ );
98
+
99
+ } // end function
100
+
101
+
102
+ /** Include global functions */
103
+ require_once( CPEL_PLUGIN_DIR . 'includes/functions-global.php' );
104
+
105
+ /** Include (global) conditionals functions */
106
+ require_once( CPEL_PLUGIN_DIR . 'includes/functions-conditionals.php' );
107
+
108
+
109
+ add_action( 'plugins_loaded', 'ddw_cpel_setup_plugin', 20 );
110
+ /**
111
+ * Finally setup the plugin for the main tasks.
112
+ *
113
+ * @since 1.0.0
114
+ */
115
+ function ddw_cpel_setup_plugin() {
116
+
117
+ /** Load features that require Polylang & Elementor active */
118
+ if ( ddw_cpel_is_polylang_active() && ddw_cpel_is_elementor_active() ) {
119
+
120
+ require_once( CPEL_PLUGIN_DIR . 'modules/finder/manager.php' );
121
+ require_once( CPEL_PLUGIN_DIR . 'modules/widgets/register-widget.php' );
122
+
123
+ new \DDW_Connect_Polylang_Elementor\Register_Widget();
124
+
125
+ /** Load features that require Elementor Pro */
126
+ if ( ddw_cpel_is_elementor_pro_active() ) {
127
+ require_once( CPEL_PLUGIN_DIR . 'modules/connect/tweaks-polylang-elementor.php' );
128
+ require_once( CPEL_PLUGIN_DIR . 'modules/dynamic-tags/manager.php' );
129
+ }
130
+
131
+ } // end if
132
+
133
+ /** Include admin helper functions */
134
+ if ( is_admin() ) {
135
+ require_once( CPEL_PLUGIN_DIR . 'includes/admin-extras.php' );
136
+ }
137
+
138
+ /** Add links to Settings and Menu pages to Plugins page */
139
+ if ( ( is_admin() || is_network_admin() ) ) {
140
+
141
+ add_filter(
142
+ 'plugin_action_links_' . plugin_basename( __FILE__ ),
143
+ 'ddw_cpel_custom_settings_links'
144
+ );
145
+
146
+ add_filter(
147
+ 'network_admin_plugin_action_links_' . plugin_basename( __FILE__ ),
148
+ 'ddw_cpel_custom_settings_links'
149
+ );
150
+
151
+ } // end if
152
+
153
+ } // end function
includes/admin-extras.php ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // includes/admin-extras
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ /**
16
+ * Add custom settings link to Plugins page.
17
+ *
18
+ * @since 1.0.0
19
+ *
20
+ * @param array $cpel_links (Default) Array of plugin action links.
21
+ * @return strings $cpel_links Settings & Menu Admin links.
22
+ */
23
+ function ddw_cpel_custom_settings_links( $cpel_links ) {
24
+
25
+ $link_polylang = '';
26
+ $templates_link = '';
27
+
28
+ /** Add settings link only if user has permission */
29
+ if ( current_user_can( 'edit_theme_options' ) ) {
30
+
31
+ /** Polylang settings link */
32
+ if ( ddw_cpel_is_polylang_active() ) {
33
+
34
+ $link_polylang = sprintf(
35
+ '<a class="dashicons-before dashicons-translation" href="%1$s" title="%2$s">%3$s</a>',
36
+ esc_url( admin_url( 'admin.php?page=mlang' ) ),
37
+ /* translators: Title attribute for Polylang settings link */
38
+ esc_html__( 'Polylang Languages Setup', 'connect-polylang-elementor' ),
39
+ esc_attr_x( 'Languages', 'Link title attribute for Polylang settings', 'connect-polylang-elementor' )
40
+ );
41
+
42
+ } // end if
43
+
44
+ /** Elementor My Templates link */
45
+ if ( ddw_cpel_is_elementor_active() ) {
46
+
47
+ $link_elementor = sprintf(
48
+ '<a class="dashicons-before dashicons-admin-page" href="%1$s" title="%2$s">%3$s</a>',
49
+ esc_url( admin_url( 'edit.php?post_type=elementor_library' ) ),
50
+ /* translators: Title attribute for Elementor My Templates link */
51
+ esc_html__( 'Elementor My Templates', 'connect-polylang-elementor' ),
52
+ esc_attr_x( 'Templates', 'Link title attribute for Elementor My Templates', 'connect-polylang-elementor' )
53
+ );
54
+
55
+ } // end if
56
+
57
+ } // end if
58
+
59
+ /** Set the order of the links */
60
+ if ( ! empty( $link_polylang ) && ! empty( $link_elementor ) ) {
61
+ array_unshift( $cpel_links, $link_polylang, $link_elementor );
62
+ }
63
+
64
+ /** Display plugin settings links */
65
+ return apply_filters(
66
+ 'cpel/filter/plugins_page/settings_links',
67
+ $cpel_links,
68
+ $link_polylang, // additional param
69
+ $link_elementor // additional param
70
+ );
71
+
72
+ } // end function
73
+
74
+
75
+ add_filter( 'plugin_row_meta', 'ddw_cpel_plugin_links', 10, 2 );
76
+ /**
77
+ * Add various support links to Plugins page.
78
+ *
79
+ * @since 1.0.0
80
+ *
81
+ * @uses ddw_cpel_get_info_link()
82
+ *
83
+ * @param array $cpel_links (Default) Array of plugin meta links
84
+ * @param string $cpel_file Path of base plugin file
85
+ * @return array $cpel_links Array of plugin link strings to build HTML markup.
86
+ */
87
+ function ddw_cpel_plugin_links( $cpel_links, $cpel_file ) {
88
+
89
+ /** Capability check */
90
+ if ( ! current_user_can( 'install_plugins' ) ) {
91
+ return $cpel_links;
92
+ }
93
+
94
+ /** List additional links only for this plugin */
95
+ if ( $cpel_file === CPEL_PLUGIN_BASEDIR . 'connect-polylang-elementor.php' ) {
96
+
97
+ ?>
98
+ <style type="text/css">
99
+ tr[data-plugin="<?php echo $cpel_file; ?>"] .plugin-version-author-uri a.dashicons-before:before {
100
+ font-size: 17px;
101
+ margin-right: 2px;
102
+ opacity: .85;
103
+ vertical-align: sub;
104
+ }
105
+ </style>
106
+ <?php
107
+
108
+ /* translators: Plugins page listing */
109
+ $cpel_links[] = ddw_cpel_get_info_link( 'url_wporg_forum', esc_html_x( 'Support', 'Plugins page listing', 'connect-polylang-elementor' ), 'dashicons-before dashicons-sos' );
110
+
111
+ /* translators: Plugins page listing */
112
+ $cpel_links[] = ddw_cpel_get_info_link( 'url_fb_group', esc_html_x( 'Facebook Group', 'Plugins page listing', 'connect-polylang-elementor' ), 'dashicons-before dashicons-facebook' );
113
+
114
+ /* translators: Plugins page listing */
115
+ $cpel_links[] = ddw_cpel_get_info_link( 'url_translate', esc_html_x( 'Translations', 'Plugins page listing', 'connect-polylang-elementor' ), 'dashicons-before dashicons-translation' );
116
+
117
+ /* translators: Plugins page listing */
118
+ $cpel_links[] = ddw_cpel_get_info_link( 'url_donate', esc_html_x( 'Donate', 'Plugins page listing', 'connect-polylang-elementor' ), 'button-primary dashicons-before dashicons-thumbs-up' );
119
+
120
+ } // end if plugin links
121
+
122
+ /** Output the links */
123
+ return apply_filters(
124
+ 'cpel/filter/plugins_page/more_links',
125
+ $cpel_links
126
+ );
127
+
128
+ } // end function
129
+
130
+
131
+ /**
132
+ * Inline CSS fix for Plugins page update messages.
133
+ *
134
+ * @since 1.0.0
135
+ *
136
+ * @see ddw_cpel_plugin_update_message()
137
+ * @see ddw_cpel_multisite_subsite_plugin_update_message()
138
+ */
139
+ function ddw_cpel_plugin_update_message_style_tweak() {
140
+
141
+ ?>
142
+ <style type="text/css">
143
+ .cpel-update-message p:before,
144
+ .update-message.notice p:empty {
145
+ display: none !important;
146
+ }
147
+ </style>
148
+ <?php
149
+
150
+ } // end function
151
+
152
+
153
+ add_action( 'in_plugin_update_message-' . CPEL_PLUGIN_BASEDIR . 'connect-polylang-elementor.php', 'ddw_cpel_plugin_update_message', 10, 2 );
154
+ /**
155
+ * On Plugins page add visible upgrade/update notice in the overview table.
156
+ * Note: This action fires for regular single site installs, and for Multisite
157
+ * installs where the plugin is activated Network-wide.
158
+ *
159
+ * @since 1.0.0
160
+ *
161
+ * @param object $data
162
+ * @param object $response
163
+ * @return string Echoed string and markup for the plugin's upgrade/update
164
+ * notice.
165
+ */
166
+ function ddw_cpel_plugin_update_message( $data, $response ) {
167
+
168
+ if ( isset( $data[ 'upgrade_notice' ] ) ) {
169
+
170
+ ddw_cpel_plugin_update_message_style_tweak();
171
+
172
+ printf(
173
+ '<div class="update-message cpel-update-message">%s</div>',
174
+ wpautop( $data[ 'upgrade_notice' ] )
175
+ );
176
+
177
+ } // end if
178
+
179
+ } // end function
180
+
181
+
182
+ add_action( 'after_plugin_row_wp-' . CPEL_PLUGIN_BASEDIR . 'connect-polylang-elementor.php', 'ddw_cpel_multisite_subsite_plugin_update_message', 10, 2 );
183
+ /**
184
+ * On Plugins page add visible upgrade/update notice in the overview table.
185
+ * Note: This action fires for Multisite installs where the plugin is
186
+ * activated on a per site basis.
187
+ *
188
+ * @since 1.0.0
189
+ *
190
+ * @param string $file
191
+ * @param object $plugin
192
+ * @return string Echoed string and markup for the plugin's upgrade/update
193
+ * notice.
194
+ */
195
+ function ddw_cpel_multisite_subsite_plugin_update_message( $file, $plugin ) {
196
+
197
+ if ( is_multisite() && version_compare( $plugin[ 'Version' ], $plugin[ 'new_version' ], '<' ) ) {
198
+
199
+ $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
200
+
201
+ ddw_cpel_plugin_update_message_style_tweak();
202
+
203
+ printf(
204
+ '<tr class="plugin-update-tr"><td colspan="%s" class="plugin-update update-message notice inline notice-warning notice-alt"><div class="update-message cpel-update-message"><h4 style="margin: 0; font-size: 14px;">%s</h4>%s</div></td></tr>',
205
+ $wp_list_table->get_column_count(),
206
+ $plugin[ 'Name' ],
207
+ wpautop( $plugin[ 'upgrade_notice' ] )
208
+ );
209
+
210
+ } // end if
211
+
212
+ } // end function
includes/functions-conditionals.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // includes/functions-conditionals
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ /**
16
+ * Is Elementor (free) plugin active or not?
17
+ *
18
+ * @since 1.0.0
19
+ *
20
+ * @return bool TRUE if plugin is active, FALSE otherwise.
21
+ */
22
+ function ddw_cpel_is_elementor_active() {
23
+
24
+ return defined( 'ELEMENTOR_VERSION' );
25
+
26
+ } // end function
27
+
28
+
29
+ /**
30
+ * Is Elementor Pro plugin active or not?
31
+ *
32
+ * @since 1.0.0
33
+ *
34
+ * @return bool TRUE if plugin is active, FALSE otherwise.
35
+ */
36
+ function ddw_cpel_is_elementor_pro_active() {
37
+
38
+ return defined( 'ELEMENTOR_PRO_VERSION' );
39
+
40
+ } // end function
41
+
42
+
43
+ /**
44
+ * Is Polylang (free) OR Polylang Pro (Premium) plugin active or not?
45
+ * Note: This is for checking the base Polylang functionality which is
46
+ * identical in free and Pro version.
47
+ *
48
+ * @since 1.0.0
49
+ *
50
+ * @return bool TRUE if plugin is active, FALSE otherwise.
51
+ */
52
+ function ddw_cpel_is_polylang_active() {
53
+
54
+ return defined( 'POLYLANG_BASENAME' );
55
+
56
+ } // end function
57
+
58
+
59
+ /**
60
+ * Is Polylang Pro (Premium) plugin active or not?
61
+ *
62
+ * @since 1.0.0
63
+ *
64
+ * @return bool TRUE if plugin is active, FALSE otherwise.
65
+ */
66
+ function ddw_cpel_is_polylang_pro_active() {
67
+
68
+ return defined( 'POLYLANG_PRO' );
69
+
70
+ } // end function
71
+
72
+
73
+ /**
74
+ * Is Polylang (free) plugin active or not?
75
+ *
76
+ * @since 1.0.0
77
+ *
78
+ * @return bool TRUE if plugin is active, FALSE otherwise.
79
+ */
80
+ function ddw_cpel_is_polylang_free_active() {
81
+
82
+ return ddw_cpel_is_polylang_active() && ! ddw_cpel_is_polylang_pro_active();
83
+
84
+ } // end function
includes/functions-global.php ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // includes/functions-global
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ add_action( 'wp_head', 'ddw_cpel_prepare_render_polylang_switcher' );
16
+ /**
17
+ * Prepare for tweaks to the rendering of the Polylang Switcher widget.
18
+ * Note: Using in-between step via action hook 'wp_head' to enforce the
19
+ * rendering tweaks only on frontend - where only we want them to happen.
20
+ *
21
+ * @since 1.0.0
22
+ *
23
+ * @see ddw_cpel_render_polylang_switcher()
24
+ */
25
+ function ddw_cpel_prepare_render_polylang_switcher() {
26
+
27
+ if ( function_exists( 'pll_current_language' ) ) {
28
+ add_filter( 'elementor/widget/render_content', 'ddw_cpel_render_polylang_switcher', 10, 2 );
29
+ }
30
+
31
+ } // end function
32
+
33
+
34
+ //add_filter( 'elementor/widget/render_content', 'ddw_cpel_render_polylang_switcher', 10, 2 );
35
+ /**
36
+ * Render the Polylang Switcher widget only on the frontend when the display
37
+ * conditions of the widget's settings are met:
38
+ * 1) Display for "All languages"
39
+ * or
40
+ * 2) Display only for the chosen language (which then must also the be current
41
+ * language of the browser content)
42
+ *
43
+ * @since 1.0.0
44
+ *
45
+ * @uses pll_current_language() Provides slug current language.
46
+ *
47
+ * @param string $widget_content The content of the widget.
48
+ * @param \Elementor\Widget_Base $widget_instance The instance of the widget.
49
+ * @return string Tweaked content of the widget.
50
+ */
51
+ function ddw_cpel_render_polylang_switcher( $widget_content, $widget_instance ) {
52
+
53
+ /** Bail early if no rendering tweaks wanted */
54
+ if ( 'polylang-language-switcher' !== $widget_instance->get_name()
55
+ || \Elementor\Plugin::$instance->editor->is_edit_mode()
56
+ || is_admin()
57
+ ) {
58
+ return $widget_content;
59
+ }
60
+
61
+ /** Get the widget settings */
62
+ $display = sanitize_key( $widget_instance->get_settings_for_display( 'plsfe_widget_display' ) );
63
+
64
+ /** Get current language */
65
+ $current_lang = sanitize_key( pll_current_language( 'slug' ) );
66
+
67
+ /**
68
+ * Only render the widget on the frontend if "All languages" is set, or if
69
+ * the current language matches the chosen language from the setting.
70
+ */
71
+ if ( 'all' === $display || $current_lang === $display ) {
72
+
73
+ return $widget_content;
74
+
75
+ } elseif ( $current_lang !== $display ) {
76
+
77
+ return '<!-- hidden widget -->';
78
+
79
+ } // end if
80
+
81
+ } // end function
82
+
83
+
84
+ /**
85
+ * Setting internal plugin helper values.
86
+ *
87
+ * @since 1.0.0
88
+ *
89
+ * @return array $cpel_info Array of info values.
90
+ */
91
+ function ddw_cpel_info_values() {
92
+
93
+ $cpel_info = array(
94
+
95
+ 'url_translate' => 'https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor',
96
+ 'url_wporg_faq' => 'https://wordpress.org/plugins/connect-polylang-elementor/#faq',
97
+ 'url_wporg_forum' => 'https://wordpress.org/support/plugin/connect-polylang-elementor',
98
+ 'url_wporg_review' => 'https://wordpress.org/support/plugin/connect-polylang-elementor/reviews/?filter=5/#new-post',
99
+ 'url_wporg_profile' => 'https://profiles.wordpress.org/daveshine/',
100
+ 'url_fb_group' => 'https://www.facebook.com/groups/deckerweb.wordpress.plugins/',
101
+ //'url_snippets' => 'https://github.com/deckerweb/connect-polylang-elementor/wiki/Code-Snippets',
102
+ 'author' => __( 'David Decker - DECKERWEB', 'connect-polylang-elementor' ),
103
+ 'author_uri' => 'https://deckerweb.de/',
104
+ 'license' => 'GPL-2.0-or-later',
105
+ 'url_license' => 'https://opensource.org/licenses/GPL-2.0',
106
+ 'first_code' => '2018',
107
+ 'url_donate' => 'https://www.paypal.me/deckerweb',
108
+ 'url_plugin' => 'https://github.com/deckerweb/connect-polylang-elementor',
109
+ //'url_plugin_docs' => 'https://github.com/deckerweb/connect-polylang-elementor/wiki',
110
+ //'url_plugin_faq' => 'https://wordpress.org/plugins/connect-polylang-elementor/#faq',
111
+ 'url_github' => 'https://github.com/deckerweb/connect-polylang-elementor',
112
+ 'url_github_issues' => 'https://github.com/deckerweb/connect-polylang-elementor/issues',
113
+ 'url_twitter' => 'https://twitter.com/deckerweb',
114
+ 'url_github_follow' => 'https://github.com/deckerweb',
115
+
116
+ ); // end of array
117
+
118
+ return $cpel_info;
119
+
120
+ } // end function
121
+
122
+
123
+ /**
124
+ * Get URL of specific BTC info value.
125
+ *
126
+ * @since 1.0.0
127
+ *
128
+ * @uses ddw_cpel_info_values()
129
+ *
130
+ * @param string $url_key String of value key from array of ddw_cpel_info_values()
131
+ * @param bool $raw If raw escaping or regular escaping of URL gets used
132
+ * @return string URL for info value.
133
+ */
134
+ function ddw_cpel_get_info_url( $url_key = '', $raw = FALSE ) {
135
+
136
+ $cpel_info = (array) ddw_cpel_info_values();
137
+
138
+ $output = esc_url( $cpel_info[ sanitize_key( $url_key ) ] );
139
+
140
+ if ( TRUE === $raw ) {
141
+ $output = esc_url_raw( $cpel_info[ esc_attr( $url_key ) ] );
142
+ }
143
+
144
+ return $output;
145
+
146
+ } // end function
147
+
148
+
149
+ /**
150
+ * Get link with complete markup for a specific BTC info value.
151
+ *
152
+ * @since 1.0.0
153
+ *
154
+ * @uses ddw_cpel_get_info_url()
155
+ *
156
+ * @param string $url_key String of value key
157
+ * @param string $text String of text and link attribute
158
+ * @param string $class String of CSS class
159
+ * @return string HTML markup for linked URL.
160
+ */
161
+ function ddw_cpel_get_info_link( $url_key = '', $text = '', $class = '' ) {
162
+
163
+ $link = sprintf(
164
+ '<a class="%1$s" href="%2$s" target="_blank" rel="nofollow noopener noreferrer" title="%3$s">%3$s</a>',
165
+ strtolower( esc_attr( $class ) ), //sanitize_html_class( $class ),
166
+ ddw_cpel_get_info_url( $url_key ),
167
+ esc_html( $text )
168
+ );
169
+
170
+ return $link;
171
+
172
+ } // end function
173
+
174
+
175
+ /**
176
+ * Get timespan of coding years for this plugin.
177
+ *
178
+ * @since 1.0.0
179
+ *
180
+ * @uses ddw_cpel_info_values()
181
+ *
182
+ * @param int $first_year Integer number of first year
183
+ * @return string Timespan of years.
184
+ */
185
+ function ddw_cpel_coding_years( $first_year = '' ) {
186
+
187
+ $cpel_info = (array) ddw_cpel_info_values();
188
+
189
+ $first_year = ( empty( $first_year ) ) ? absint( $cpel_info[ 'first_code' ] ) : absint( $first_year );
190
+
191
+ /** Set year of first released code */
192
+ $code_first_year = ( date( 'Y' ) == $first_year || 0 === $first_year ) ? '' : $first_year . '&#x02013;';
193
+
194
+ return $code_first_year . date( 'Y' );
195
+
196
+ } // end function
includes/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
languages/README.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # .pot File
2
+
3
+ The .pot file is always included in:
4
+ `/connect-polylang-elementor/languages/connect-polylang-elementor.pot`
5
+
6
+ --------------------------------------------------------------------------------
7
+
8
+ # Language Packs
9
+
10
+ Community Translations for this plugin are handled via:
11
+ https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor
12
+
13
+ * You are invited to contribute there for your language
14
+ * Translations there which are 95% or more complete will be automatically loaded
15
+ in WordPress as language pack for the plugin and are also updateable
16
+
17
+ Thank you for your contribution!
18
+
19
+ --------------------------------------------------------------------------------
20
+
21
+ # Custom Translations
22
+
23
+ If you want or need custom translations different from the Community
24
+ translations above, you can do that easily:
25
+ Create your translation with "Poedit" (https://poedit.net/wordpress)
26
+ or "Loco Translate" plugin (https://wordpress.org/plugins/loco-translate/)
27
+ and upload the translation file there:
28
+ `/wp-content/languages/connect-polylang-elementor/`
29
+
30
+ for example the German version would looke like that:
31
+ `/wp-content/languages/connect-polylang-elementor/connect-polylang-elementor-de_DE.mo`
32
+
33
+ Note: The location `/wp-content/languages/` is the global translation folder -
34
+ if it does not exist yet in your installation just create it.
languages/connect-polylang-elementor-de_DE.mo ADDED
Binary file
languages/connect-polylang-elementor-de_DE.po ADDED
@@ -0,0 +1,444 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Connect Polylang to Elementor\n"
4
+ "POT-Creation-Date: 2018-11-28 09:33+0100\n"
5
+ "PO-Revision-Date: 2018-11-28 09:34+0100\n"
6
+ "Last-Translator: David Decker DECKERWEB.de -- https://deckerweb.de/\n"
7
+ "Language-Team: David Decker DECKERWEB.de -- https://deckerweb.de/\n"
8
+ "Language: de_DE\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.2\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
+ "X-Poedit-WPHeader: connect-polylang-elementor.php\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
19
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
20
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
23
+
24
+ #. translators: Title attribute for Polylang settings link
25
+ #: includes/admin-extras.php:38
26
+ msgid "Polylang Languages Setup"
27
+ msgstr "Sprachen in Polylang einrichten"
28
+
29
+ #: includes/admin-extras.php:39
30
+ msgctxt "Link title attribute for Polylang settings"
31
+ msgid "Languages"
32
+ msgstr "Sprachen"
33
+
34
+ #. translators: Title attribute for Elementor My Templates link
35
+ #: includes/admin-extras.php:51
36
+ msgid "Elementor My Templates"
37
+ msgstr "Elementor Meine Templates"
38
+
39
+ #: includes/admin-extras.php:52
40
+ msgctxt "Link title attribute for Elementor My Templates"
41
+ msgid "Templates"
42
+ msgstr "Templates"
43
+
44
+ #. translators: Plugins page listing
45
+ #: includes/admin-extras.php:109
46
+ msgctxt "Plugins page listing"
47
+ msgid "Support"
48
+ msgstr "Support"
49
+
50
+ #. translators: Plugins page listing
51
+ #: includes/admin-extras.php:112
52
+ msgctxt "Plugins page listing"
53
+ msgid "Facebook Group"
54
+ msgstr "Facebook-Gruppe"
55
+
56
+ #. translators: Plugins page listing
57
+ #: includes/admin-extras.php:115
58
+ msgctxt "Plugins page listing"
59
+ msgid "Translations"
60
+ msgstr "Übersetzungen"
61
+
62
+ #. translators: Plugins page listing
63
+ #: includes/admin-extras.php:118
64
+ msgctxt "Plugins page listing"
65
+ msgid "Donate"
66
+ msgstr "Spenden"
67
+
68
+ #. Author of the plugin/theme
69
+ #: includes/functions-global.php:102
70
+ msgid "David Decker - DECKERWEB"
71
+ msgstr "David Decker - DECKERWEB"
72
+
73
+ #: modules/dynamic-tags/manager.php:27
74
+ msgctxt "Elementor Dynamic Tags group title"
75
+ msgid "Polylang Languages"
76
+ msgstr "Polylang Sprachen"
77
+
78
+ #: modules/dynamic-tags/polylang-current-language-code.php:46
79
+ msgctxt "Elementor Dynamic Tag title"
80
+ msgid "Current Language Code"
81
+ msgstr "Aktuelle Sprache: Sprachcode"
82
+
83
+ #: modules/dynamic-tags/polylang-current-language-flag.php:46
84
+ msgctxt "Elementor Dynamic Tag title"
85
+ msgid "Current Language Flag"
86
+ msgstr "Aktuelle Sprache: Flagge"
87
+
88
+ #: modules/dynamic-tags/polylang-current-language-name.php:46
89
+ msgctxt "Elementor Dynamic Tag title"
90
+ msgid "Current Language Name"
91
+ msgstr "Aktuelle Sprache: Name der Sprache"
92
+
93
+ #: modules/dynamic-tags/polylang-current-language-url.php:46
94
+ msgctxt "Elementor Dynamic Tag title"
95
+ msgid "Current Language URL"
96
+ msgstr "Aktuelle Sprache: URL"
97
+
98
+ #: modules/dynamic-tags/polylang-language-names.php:46
99
+ msgctxt "Elementor Dynamic Tag title"
100
+ msgid "Language Names"
101
+ msgstr "Sprachnamen"
102
+
103
+ #: modules/dynamic-tags/polylang-language-names.php:110
104
+ #: modules/widgets/polylang-language-switcher.php:527
105
+ msgid "Language Name"
106
+ msgstr "Name der Sprache"
107
+
108
+ #: modules/finder/plugin-cpel.php:34
109
+ msgctxt "Category title in Elementor Finder"
110
+ msgid "Add-On: Polylang Connect for Elementor"
111
+ msgstr "Add-On: Polylang mit Elementor verbinden"
112
+
113
+ #: modules/finder/plugin-cpel.php:59
114
+ msgctxt "Title in Elementor Finder"
115
+ msgid "Plugin FAQ"
116
+ msgstr "Plugin-FAQ"
117
+
118
+ #: modules/finder/plugin-cpel.php:63
119
+ msgid "FAQ and Documentation"
120
+ msgstr "FAQ und Dokumentation"
121
+
122
+ #: modules/finder/plugin-cpel.php:75
123
+ msgctxt "Title in Elementor Finder"
124
+ msgid "Plugin Support Forum"
125
+ msgstr "Plugin-Support-Forum"
126
+
127
+ #: modules/finder/plugin-cpel.php:79 modules/finder/plugin-polylang.php:166
128
+ msgid "Free support on WordPress.org"
129
+ msgstr "Kostenloser Support auf WordPress.org"
130
+
131
+ #: modules/finder/plugin-cpel.php:91
132
+ msgctxt "Title in Elementor Finder"
133
+ msgid "Plugin Translations"
134
+ msgstr "Plugin-Übersetzungen"
135
+
136
+ #: modules/finder/plugin-cpel.php:95
137
+ msgid "Translate this plugin on WordPress.org"
138
+ msgstr "Dieses Plugin bei WordPress.org übersetzen"
139
+
140
+ #: modules/finder/plugin-polylang.php:35
141
+ msgctxt "Category title in Elementor Finder"
142
+ msgid "Polylang - Multilingual Plugin"
143
+ msgstr "Polylang - Mehrsprachigkeits-Plugin"
144
+
145
+ #: modules/finder/plugin-polylang.php:56
146
+ msgctxt "Item title part in Elementor Finder"
147
+ msgid "Polylang"
148
+ msgstr "Polylang"
149
+
150
+ #: modules/finder/plugin-polylang.php:59
151
+ msgctxt "Item title part in Elementor Finder"
152
+ msgid "Polylang Pro"
153
+ msgstr "Polylang Pro"
154
+
155
+ #: modules/finder/plugin-polylang.php:63
156
+ msgctxt "Item title part in Elementor Finder"
157
+ msgid "Website Language"
158
+ msgstr "Sprache der Webseite"
159
+
160
+ #: modules/finder/plugin-polylang.php:66
161
+ msgctxt "Item title part in Elementor Finder"
162
+ msgid "Polylang Language"
163
+ msgstr "Polylang Sprache"
164
+
165
+ #: modules/finder/plugin-polylang.php:69
166
+ msgctxt "Item title part in Elementor Finder"
167
+ msgid "Polylang Pro Language"
168
+ msgstr "Polylang Pro Sprache"
169
+
170
+ #: modules/finder/plugin-polylang.php:86
171
+ msgid "View website in this language"
172
+ msgstr "Website in dieser Sprache anzeigen"
173
+
174
+ #: modules/finder/plugin-polylang.php:105
175
+ msgid "Edit this language"
176
+ msgstr "Diese Sprache bearbeiten"
177
+
178
+ #: modules/finder/plugin-polylang.php:119
179
+ msgctxt "Title in Elementor Finder"
180
+ msgid "Setup languages"
181
+ msgstr "Sprachen einrichten"
182
+
183
+ #: modules/finder/plugin-polylang.php:123
184
+ msgid "All languages your website appears in"
185
+ msgstr "Alle Sprachen, in denen deine Website erscheint"
186
+
187
+ #: modules/finder/plugin-polylang.php:128
188
+ msgctxt "Title in Elementor Finder"
189
+ msgid "String Translations"
190
+ msgstr "Zeichenketten übersetzen"
191
+
192
+ #: modules/finder/plugin-polylang.php:132
193
+ msgid "From Widgets and other website parts"
194
+ msgstr "Von Widgets und anderen Website-Bereichen"
195
+
196
+ #: modules/finder/plugin-polylang.php:137
197
+ msgctxt "Title in Elementor Finder"
198
+ msgid "Settings"
199
+ msgstr "Einstellungen"
200
+
201
+ #: modules/finder/plugin-polylang.php:141
202
+ msgid "Plugin's settings, enable/ disable modules"
203
+ msgstr "Plugin-Einstellungen, Aktivieren/ Deaktivieren von Modulen"
204
+
205
+ #: modules/finder/plugin-polylang.php:146
206
+ msgctxt "Title in Elementor Finder"
207
+ msgid "Plugin Documentation"
208
+ msgstr "Plugin-Dokumentation"
209
+
210
+ #: modules/finder/plugin-polylang.php:150
211
+ msgid "FAQ, Knowledge Base and Documentation"
212
+ msgstr "FAQ, Wissensdatenbank und Dokumentation"
213
+
214
+ #: modules/finder/plugin-polylang.php:162
215
+ msgctxt "Title in Elementor Finder"
216
+ msgid "Support Forum"
217
+ msgstr "Support-Forum"
218
+
219
+ #: modules/widgets/polylang-language-switcher.php:66
220
+ msgctxt "Elementor widget title"
221
+ msgid "Polylang Switcher"
222
+ msgstr "Polylang Sprachwähler"
223
+
224
+ #: modules/widgets/polylang-language-switcher.php:174
225
+ msgid "Content"
226
+ msgstr "Inhalt"
227
+
228
+ #: modules/widgets/polylang-language-switcher.php:181
229
+ msgid "Layout"
230
+ msgstr "Layout"
231
+
232
+ #: modules/widgets/polylang-language-switcher.php:185
233
+ msgid "Horizontal"
234
+ msgstr "Horizontal"
235
+
236
+ #: modules/widgets/polylang-language-switcher.php:186
237
+ msgid "Vertical"
238
+ msgstr "Vertikal"
239
+
240
+ #: modules/widgets/polylang-language-switcher.php:196
241
+ msgid "Align"
242
+ msgstr "Ausrichtung"
243
+
244
+ #: modules/widgets/polylang-language-switcher.php:200
245
+ msgid "Left"
246
+ msgstr "Links"
247
+
248
+ #: modules/widgets/polylang-language-switcher.php:204
249
+ msgid "Center"
250
+ msgstr "Zentriert"
251
+
252
+ #: modules/widgets/polylang-language-switcher.php:208
253
+ msgid "Right"
254
+ msgstr "Rechts"
255
+
256
+ #: modules/widgets/polylang-language-switcher.php:212
257
+ msgid "Stretch"
258
+ msgstr "Strecken"
259
+
260
+ #: modules/widgets/polylang-language-switcher.php:224
261
+ msgid "Hide the current language"
262
+ msgstr "Aktuelle Sprache ausblenden"
263
+
264
+ #: modules/widgets/polylang-language-switcher.php:235
265
+ msgid "Hide languages with no translation"
266
+ msgstr "Sprachen ohne Übersetzungen ausblenden"
267
+
268
+ #: modules/widgets/polylang-language-switcher.php:245
269
+ msgid "Show Country Flag"
270
+ msgstr "Landesflagge anzeigen"
271
+
272
+ #: modules/widgets/polylang-language-switcher.php:255
273
+ msgid "Show Language Name"
274
+ msgstr "Sprachname anzeigen"
275
+
276
+ #: modules/widgets/polylang-language-switcher.php:265
277
+ msgid "Show Language Code"
278
+ msgstr "Sprachcode anzeigen"
279
+
280
+ #: modules/widgets/polylang-language-switcher.php:280
281
+ msgid "All languages"
282
+ msgstr "Alle Sprachen"
283
+
284
+ #: modules/widgets/polylang-language-switcher.php:287
285
+ msgid "Display widget for:"
286
+ msgstr "Widget anzeigen für:"
287
+
288
+ #: modules/widgets/polylang-language-switcher.php:301
289
+ #: modules/widgets/polylang-language-switcher.php:635
290
+ msgid "Main Menu"
291
+ msgstr "Hauptmenü"
292
+
293
+ #: modules/widgets/polylang-language-switcher.php:311
294
+ msgid "Normal"
295
+ msgstr "Normal"
296
+
297
+ #: modules/widgets/polylang-language-switcher.php:327
298
+ #: modules/widgets/polylang-language-switcher.php:364
299
+ #: modules/widgets/polylang-language-switcher.php:408
300
+ msgid "Text Color"
301
+ msgstr "Textfarbe"
302
+
303
+ #: modules/widgets/polylang-language-switcher.php:345
304
+ msgid "Hover"
305
+ msgstr "Hover"
306
+
307
+ #: modules/widgets/polylang-language-switcher.php:383
308
+ msgid "Active"
309
+ msgstr "Aktiv"
310
+
311
+ #: modules/widgets/polylang-language-switcher.php:391
312
+ msgid "This controls the item in the Switcher for the current active language"
313
+ msgstr "Dies steuert das Element im Switcher für die aktuell aktive Sprache"
314
+
315
+ #: modules/widgets/polylang-language-switcher.php:420
316
+ msgid "Text Hover Color"
317
+ msgstr "Textfarbe bei Hover"
318
+
319
+ #: modules/widgets/polylang-language-switcher.php:436
320
+ msgid "Horizontal Padding"
321
+ msgstr "Horizontaler Innenabstand"
322
+
323
+ #: modules/widgets/polylang-language-switcher.php:453
324
+ msgid "Vertical Padding"
325
+ msgstr "Vertikaler Innenabstand"
326
+
327
+ #: modules/widgets/polylang-language-switcher.php:469
328
+ msgid "Space Between"
329
+ msgstr "Abstand dazwischen"
330
+
331
+ #: modules/widgets/polylang-language-switcher.php:500
332
+ msgid "Country Flag"
333
+ msgstr "Landesflagge"
334
+
335
+ #: modules/widgets/polylang-language-switcher.php:511
336
+ #: modules/widgets/polylang-language-switcher.php:548
337
+ #: modules/widgets/polylang-language-switcher.php:585
338
+ msgid "Margin"
339
+ msgstr "Außenabstand"
340
+
341
+ #: modules/widgets/polylang-language-switcher.php:538
342
+ #: modules/widgets/polylang-language-switcher.php:575
343
+ msgid "Uppercase"
344
+ msgstr "Großbuchstaben"
345
+
346
+ #: modules/widgets/polylang-language-switcher.php:564
347
+ msgid "Language Code"
348
+ msgstr "Sprachcode"
349
+
350
+ #: modules/widgets/polylang-language-switcher.php:597
351
+ msgid "Text before"
352
+ msgstr "Text davor"
353
+
354
+ #: modules/widgets/polylang-language-switcher.php:605
355
+ msgid "Text after"
356
+ msgstr "Text danach"
357
+
358
+ #: modules/widgets/polylang-language-switcher.php:617
359
+ msgid "Helpful Information"
360
+ msgstr "Hilfreiche Informationen"
361
+
362
+ #: modules/widgets/polylang-language-switcher.php:624
363
+ msgid "Country Flags"
364
+ msgstr "Landesflaggen"
365
+
366
+ #. translators: %1$s - <code>16px</code> (width 16px) / %2$s - <code>11px</code> (height 11px)
367
+ #: modules/widgets/polylang-language-switcher.php:627
368
+ #, php-format
369
+ msgid ""
370
+ "Country flags are by default used from Polylang plugin and have the static "
371
+ "size of %1$s wide and %2$s high."
372
+ msgstr ""
373
+ "Länderflaggen werden standardmäßig vom Polylang-Plugin verwendet und haben "
374
+ "die statische Größe von %1$s breit und %2$s hoch."
375
+
376
+ #: modules/widgets/polylang-language-switcher.php:634
377
+ msgid "Style"
378
+ msgstr "Stile"
379
+
380
+ #: modules/widgets/polylang-language-switcher.php:636
381
+ msgid "Tab: \"Active\""
382
+ msgstr "Tab: „Aktiv“"
383
+
384
+ #: modules/widgets/polylang-language-switcher.php:637
385
+ msgid ""
386
+ "This marks the language of currently viewed content - on the frontend. In "
387
+ "Elementor Editor Panel this could be different."
388
+ msgstr ""
389
+ "Dies markiert die Sprache des aktuell angezeigten Inhalts - im Frontend. Im "
390
+ "Elementor Editor-Panel kann dies anders sein."
391
+
392
+ #. Plugin Name of the plugin/theme
393
+ msgid "Polylang Connect for Elementor"
394
+ msgstr "Add-On: Polylang mit Elementor verbinden"
395
+
396
+ #. Plugin URI of the plugin/theme
397
+ msgid "https://github.com/deckerweb/connect-polylang-elementor"
398
+ msgstr "https://github.com/deckerweb/connect-polylang-elementor"
399
+
400
+ #. Description of the plugin/theme
401
+ msgid ""
402
+ "Connect the Polylang multilingual plugin with Elementor Page Builder: This "
403
+ "plugin will make Elementor and Polylang show the correct language templates, "
404
+ "especially with Elementor Pro Theme Builder. Plus: native Polylang Language "
405
+ "Switcher Elementor widget, new Dynamic Tags, and Polylang links added to the "
406
+ "Elementor Finder feature."
407
+ msgstr ""
408
+ "Verbinde das Polylang mehrsprachigkeits-Plugin mit Elementor Page Builder: "
409
+ "Dieses Plugin hilft dabei, dass Elementor und Polylang die richtigen "
410
+ "Templates für Sprachen anzeigen, insbesondere in Verbindung mit dem "
411
+ "Elementor Pro Theme Builder. Plus: natives Polylang Language Switcher "
412
+ "Elementor Widget, neue Dynamic Tags und Polylang Links, die der Elementor "
413
+ "Finder Funktion hinzugefügt wurden."
414
+
415
+ #. Author URI of the plugin/theme
416
+ msgid "https://deckerweb.de/"
417
+ msgstr "https://deckerweb.de/"
418
+
419
+ #~ msgid "Connect Polylang Elementor"
420
+ #~ msgstr "Polylang mit Elementor verbinden"
421
+
422
+ #~ msgid "Polylang Language Names"
423
+ #~ msgstr "Polylang Sprachnamen"
424
+
425
+ #~ msgid "Before"
426
+ #~ msgstr "Davor"
427
+
428
+ #~ msgid "After"
429
+ #~ msgstr "Danach"
430
+
431
+ #~ msgctxt "Category title in Elementor Finder"
432
+ #~ msgid "Polylang"
433
+ #~ msgstr "Polylang"
434
+
435
+ #~ msgid ""
436
+ #~ "Connect Polylang with Elementor - some internal tweaks to make it work "
437
+ #~ "better."
438
+ #~ msgstr ""
439
+ #~ "Polylang mit Elementor verbinden - einige interne Tweaks, damit es besser "
440
+ #~ "läuft."
441
+
442
+ #~ msgctxt "Title in Elementor Finder"
443
+ #~ msgid "Polylang"
444
+ #~ msgstr "Polylang"
languages/connect-polylang-elementor-de_DE_formal.mo ADDED
Binary file
languages/connect-polylang-elementor-de_DE_formal.po ADDED
@@ -0,0 +1,444 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Connect Polylang to Elementor\n"
4
+ "POT-Creation-Date: 2018-11-28 09:32+0100\n"
5
+ "PO-Revision-Date: 2018-11-28 09:33+0100\n"
6
+ "Last-Translator: David Decker DECKERWEB.de -- https://deckerweb.de/\n"
7
+ "Language-Team: David Decker DECKERWEB.de -- https://deckerweb.de/\n"
8
+ "Language: de_DE\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.2\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
+ "X-Poedit-WPHeader: connect-polylang-elementor.php\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
19
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
20
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
23
+
24
+ #. translators: Title attribute for Polylang settings link
25
+ #: includes/admin-extras.php:38
26
+ msgid "Polylang Languages Setup"
27
+ msgstr "Sprachen in Polylang einrichten"
28
+
29
+ #: includes/admin-extras.php:39
30
+ msgctxt "Link title attribute for Polylang settings"
31
+ msgid "Languages"
32
+ msgstr "Sprachen"
33
+
34
+ #. translators: Title attribute for Elementor My Templates link
35
+ #: includes/admin-extras.php:51
36
+ msgid "Elementor My Templates"
37
+ msgstr "Elementor Meine Templates"
38
+
39
+ #: includes/admin-extras.php:52
40
+ msgctxt "Link title attribute for Elementor My Templates"
41
+ msgid "Templates"
42
+ msgstr "Templates"
43
+
44
+ #. translators: Plugins page listing
45
+ #: includes/admin-extras.php:109
46
+ msgctxt "Plugins page listing"
47
+ msgid "Support"
48
+ msgstr "Support"
49
+
50
+ #. translators: Plugins page listing
51
+ #: includes/admin-extras.php:112
52
+ msgctxt "Plugins page listing"
53
+ msgid "Facebook Group"
54
+ msgstr "Facebook-Gruppe"
55
+
56
+ #. translators: Plugins page listing
57
+ #: includes/admin-extras.php:115
58
+ msgctxt "Plugins page listing"
59
+ msgid "Translations"
60
+ msgstr "Übersetzungen"
61
+
62
+ #. translators: Plugins page listing
63
+ #: includes/admin-extras.php:118
64
+ msgctxt "Plugins page listing"
65
+ msgid "Donate"
66
+ msgstr "Spenden"
67
+
68
+ #. Author of the plugin/theme
69
+ #: includes/functions-global.php:102
70
+ msgid "David Decker - DECKERWEB"
71
+ msgstr "David Decker - DECKERWEB"
72
+
73
+ #: modules/dynamic-tags/manager.php:27
74
+ msgctxt "Elementor Dynamic Tags group title"
75
+ msgid "Polylang Languages"
76
+ msgstr "Polylang Sprachen"
77
+
78
+ #: modules/dynamic-tags/polylang-current-language-code.php:46
79
+ msgctxt "Elementor Dynamic Tag title"
80
+ msgid "Current Language Code"
81
+ msgstr "Aktuelle Sprache: Sprachcode"
82
+
83
+ #: modules/dynamic-tags/polylang-current-language-flag.php:46
84
+ msgctxt "Elementor Dynamic Tag title"
85
+ msgid "Current Language Flag"
86
+ msgstr "Aktuelle Sprache: Flagge"
87
+
88
+ #: modules/dynamic-tags/polylang-current-language-name.php:46
89
+ msgctxt "Elementor Dynamic Tag title"
90
+ msgid "Current Language Name"
91
+ msgstr "Aktuelle Sprache: Name der Sprache"
92
+
93
+ #: modules/dynamic-tags/polylang-current-language-url.php:46
94
+ msgctxt "Elementor Dynamic Tag title"
95
+ msgid "Current Language URL"
96
+ msgstr "Aktuelle Sprache: URL"
97
+
98
+ #: modules/dynamic-tags/polylang-language-names.php:46
99
+ msgctxt "Elementor Dynamic Tag title"
100
+ msgid "Language Names"
101
+ msgstr "Sprachnamen"
102
+
103
+ #: modules/dynamic-tags/polylang-language-names.php:110
104
+ #: modules/widgets/polylang-language-switcher.php:527
105
+ msgid "Language Name"
106
+ msgstr "Name der Sprache"
107
+
108
+ #: modules/finder/plugin-cpel.php:34
109
+ msgctxt "Category title in Elementor Finder"
110
+ msgid "Add-On: Polylang Connect for Elementor"
111
+ msgstr "Add-On: Polylang mit Elementor verbinden"
112
+
113
+ #: modules/finder/plugin-cpel.php:59
114
+ msgctxt "Title in Elementor Finder"
115
+ msgid "Plugin FAQ"
116
+ msgstr "Plugin-FAQ"
117
+
118
+ #: modules/finder/plugin-cpel.php:63
119
+ msgid "FAQ and Documentation"
120
+ msgstr "FAQ und Dokumentation"
121
+
122
+ #: modules/finder/plugin-cpel.php:75
123
+ msgctxt "Title in Elementor Finder"
124
+ msgid "Plugin Support Forum"
125
+ msgstr "Plugin-Support-Forum"
126
+
127
+ #: modules/finder/plugin-cpel.php:79 modules/finder/plugin-polylang.php:166
128
+ msgid "Free support on WordPress.org"
129
+ msgstr "Kostenloser Support auf WordPress.org"
130
+
131
+ #: modules/finder/plugin-cpel.php:91
132
+ msgctxt "Title in Elementor Finder"
133
+ msgid "Plugin Translations"
134
+ msgstr "Plugin-Übersetzungen"
135
+
136
+ #: modules/finder/plugin-cpel.php:95
137
+ msgid "Translate this plugin on WordPress.org"
138
+ msgstr "Dieses Plugin bei WordPress.org übersetzen"
139
+
140
+ #: modules/finder/plugin-polylang.php:35
141
+ msgctxt "Category title in Elementor Finder"
142
+ msgid "Polylang - Multilingual Plugin"
143
+ msgstr "Polylang - Mehrsprachigkeits-Plugin"
144
+
145
+ #: modules/finder/plugin-polylang.php:56
146
+ msgctxt "Item title part in Elementor Finder"
147
+ msgid "Polylang"
148
+ msgstr "Polylang"
149
+
150
+ #: modules/finder/plugin-polylang.php:59
151
+ msgctxt "Item title part in Elementor Finder"
152
+ msgid "Polylang Pro"
153
+ msgstr "Polylang Pro"
154
+
155
+ #: modules/finder/plugin-polylang.php:63
156
+ msgctxt "Item title part in Elementor Finder"
157
+ msgid "Website Language"
158
+ msgstr "Sprache der Webseite"
159
+
160
+ #: modules/finder/plugin-polylang.php:66
161
+ msgctxt "Item title part in Elementor Finder"
162
+ msgid "Polylang Language"
163
+ msgstr "Polylang Sprache"
164
+
165
+ #: modules/finder/plugin-polylang.php:69
166
+ msgctxt "Item title part in Elementor Finder"
167
+ msgid "Polylang Pro Language"
168
+ msgstr "Polylang Pro Sprache"
169
+
170
+ #: modules/finder/plugin-polylang.php:86
171
+ msgid "View website in this language"
172
+ msgstr "Website in dieser Sprache anzeigen"
173
+
174
+ #: modules/finder/plugin-polylang.php:105
175
+ msgid "Edit this language"
176
+ msgstr "Diese Sprache bearbeiten"
177
+
178
+ #: modules/finder/plugin-polylang.php:119
179
+ msgctxt "Title in Elementor Finder"
180
+ msgid "Setup languages"
181
+ msgstr "Sprachen einrichten"
182
+
183
+ #: modules/finder/plugin-polylang.php:123
184
+ msgid "All languages your website appears in"
185
+ msgstr "Alle Sprachen, in denen Ihre Website erscheint"
186
+
187
+ #: modules/finder/plugin-polylang.php:128
188
+ msgctxt "Title in Elementor Finder"
189
+ msgid "String Translations"
190
+ msgstr "Zeichenketten übersetzen"
191
+
192
+ #: modules/finder/plugin-polylang.php:132
193
+ msgid "From Widgets and other website parts"
194
+ msgstr "Von Widgets und anderen Website-Bereichen"
195
+
196
+ #: modules/finder/plugin-polylang.php:137
197
+ msgctxt "Title in Elementor Finder"
198
+ msgid "Settings"
199
+ msgstr "Einstellungen"
200
+
201
+ #: modules/finder/plugin-polylang.php:141
202
+ msgid "Plugin's settings, enable/ disable modules"
203
+ msgstr "Plugin-Einstellungen, Aktivieren/ Deaktivieren von Modulen"
204
+
205
+ #: modules/finder/plugin-polylang.php:146
206
+ msgctxt "Title in Elementor Finder"
207
+ msgid "Plugin Documentation"
208
+ msgstr "Plugin-Dokumentation"
209
+
210
+ #: modules/finder/plugin-polylang.php:150
211
+ msgid "FAQ, Knowledge Base and Documentation"
212
+ msgstr "FAQ, Wissensdatenbank und Dokumentation"
213
+
214
+ #: modules/finder/plugin-polylang.php:162
215
+ msgctxt "Title in Elementor Finder"
216
+ msgid "Support Forum"
217
+ msgstr "Support-Forum"
218
+
219
+ #: modules/widgets/polylang-language-switcher.php:66
220
+ msgctxt "Elementor widget title"
221
+ msgid "Polylang Switcher"
222
+ msgstr "Polylang Sprachwähler"
223
+
224
+ #: modules/widgets/polylang-language-switcher.php:174
225
+ msgid "Content"
226
+ msgstr "Inhalt"
227
+
228
+ #: modules/widgets/polylang-language-switcher.php:181
229
+ msgid "Layout"
230
+ msgstr "Layout"
231
+
232
+ #: modules/widgets/polylang-language-switcher.php:185
233
+ msgid "Horizontal"
234
+ msgstr "Horizontal"
235
+
236
+ #: modules/widgets/polylang-language-switcher.php:186
237
+ msgid "Vertical"
238
+ msgstr "Vertikal"
239
+
240
+ #: modules/widgets/polylang-language-switcher.php:196
241
+ msgid "Align"
242
+ msgstr "Ausrichtung"
243
+
244
+ #: modules/widgets/polylang-language-switcher.php:200
245
+ msgid "Left"
246
+ msgstr "Links"
247
+
248
+ #: modules/widgets/polylang-language-switcher.php:204
249
+ msgid "Center"
250
+ msgstr "Zentriert"
251
+
252
+ #: modules/widgets/polylang-language-switcher.php:208
253
+ msgid "Right"
254
+ msgstr "Rechts"
255
+
256
+ #: modules/widgets/polylang-language-switcher.php:212
257
+ msgid "Stretch"
258
+ msgstr "Strecken"
259
+
260
+ #: modules/widgets/polylang-language-switcher.php:224
261
+ msgid "Hide the current language"
262
+ msgstr "Aktuelle Sprache ausblenden"
263
+
264
+ #: modules/widgets/polylang-language-switcher.php:235
265
+ msgid "Hide languages with no translation"
266
+ msgstr "Sprachen ohne Übersetzungen ausblenden"
267
+
268
+ #: modules/widgets/polylang-language-switcher.php:245
269
+ msgid "Show Country Flag"
270
+ msgstr "Landesflagge anzeigen"
271
+
272
+ #: modules/widgets/polylang-language-switcher.php:255
273
+ msgid "Show Language Name"
274
+ msgstr "Sprachname anzeigen"
275
+
276
+ #: modules/widgets/polylang-language-switcher.php:265
277
+ msgid "Show Language Code"
278
+ msgstr "Sprachcode anzeigen"
279
+
280
+ #: modules/widgets/polylang-language-switcher.php:280
281
+ msgid "All languages"
282
+ msgstr "Alle Sprachen"
283
+
284
+ #: modules/widgets/polylang-language-switcher.php:287
285
+ msgid "Display widget for:"
286
+ msgstr "Widget anzeigen für:"
287
+
288
+ #: modules/widgets/polylang-language-switcher.php:301
289
+ #: modules/widgets/polylang-language-switcher.php:635
290
+ msgid "Main Menu"
291
+ msgstr "Hauptmenü"
292
+
293
+ #: modules/widgets/polylang-language-switcher.php:311
294
+ msgid "Normal"
295
+ msgstr "Normal"
296
+
297
+ #: modules/widgets/polylang-language-switcher.php:327
298
+ #: modules/widgets/polylang-language-switcher.php:364
299
+ #: modules/widgets/polylang-language-switcher.php:408
300
+ msgid "Text Color"
301
+ msgstr "Textfarbe"
302
+
303
+ #: modules/widgets/polylang-language-switcher.php:345
304
+ msgid "Hover"
305
+ msgstr "Hover"
306
+
307
+ #: modules/widgets/polylang-language-switcher.php:383
308
+ msgid "Active"
309
+ msgstr "Aktiv"
310
+
311
+ #: modules/widgets/polylang-language-switcher.php:391
312
+ msgid "This controls the item in the Switcher for the current active language"
313
+ msgstr "Dies steuert das Element im Switcher für die aktuell aktive Sprache"
314
+
315
+ #: modules/widgets/polylang-language-switcher.php:420
316
+ msgid "Text Hover Color"
317
+ msgstr "Textfarbe bei Hover"
318
+
319
+ #: modules/widgets/polylang-language-switcher.php:436
320
+ msgid "Horizontal Padding"
321
+ msgstr "Horizontaler Innenabstand"
322
+
323
+ #: modules/widgets/polylang-language-switcher.php:453
324
+ msgid "Vertical Padding"
325
+ msgstr "Vertikaler Innenabstand"
326
+
327
+ #: modules/widgets/polylang-language-switcher.php:469
328
+ msgid "Space Between"
329
+ msgstr "Abstand dazwischen"
330
+
331
+ #: modules/widgets/polylang-language-switcher.php:500
332
+ msgid "Country Flag"
333
+ msgstr "Landesflagge"
334
+
335
+ #: modules/widgets/polylang-language-switcher.php:511
336
+ #: modules/widgets/polylang-language-switcher.php:548
337
+ #: modules/widgets/polylang-language-switcher.php:585
338
+ msgid "Margin"
339
+ msgstr "Außenabstand"
340
+
341
+ #: modules/widgets/polylang-language-switcher.php:538
342
+ #: modules/widgets/polylang-language-switcher.php:575
343
+ msgid "Uppercase"
344
+ msgstr "Großbuchstaben"
345
+
346
+ #: modules/widgets/polylang-language-switcher.php:564
347
+ msgid "Language Code"
348
+ msgstr "Sprachcode"
349
+
350
+ #: modules/widgets/polylang-language-switcher.php:597
351
+ msgid "Text before"
352
+ msgstr "Text davor"
353
+
354
+ #: modules/widgets/polylang-language-switcher.php:605
355
+ msgid "Text after"
356
+ msgstr "Text danach"
357
+
358
+ #: modules/widgets/polylang-language-switcher.php:617
359
+ msgid "Helpful Information"
360
+ msgstr "Hilfreiche Informationen"
361
+
362
+ #: modules/widgets/polylang-language-switcher.php:624
363
+ msgid "Country Flags"
364
+ msgstr "Landesflaggen"
365
+
366
+ #. translators: %1$s - <code>16px</code> (width 16px) / %2$s - <code>11px</code> (height 11px)
367
+ #: modules/widgets/polylang-language-switcher.php:627
368
+ #, php-format
369
+ msgid ""
370
+ "Country flags are by default used from Polylang plugin and have the static "
371
+ "size of %1$s wide and %2$s high."
372
+ msgstr ""
373
+ "Länderflaggen werden standardmäßig vom Polylang-Plugin verwendet und haben "
374
+ "die statische Größe von %1$s breit und %2$s hoch."
375
+
376
+ #: modules/widgets/polylang-language-switcher.php:634
377
+ msgid "Style"
378
+ msgstr "Stile"
379
+
380
+ #: modules/widgets/polylang-language-switcher.php:636
381
+ msgid "Tab: \"Active\""
382
+ msgstr "Tab: „Aktiv“"
383
+
384
+ #: modules/widgets/polylang-language-switcher.php:637
385
+ msgid ""
386
+ "This marks the language of currently viewed content - on the frontend. In "
387
+ "Elementor Editor Panel this could be different."
388
+ msgstr ""
389
+ "Dies markiert die Sprache des aktuell angezeigten Inhalts - im Frontend. Im "
390
+ "Elementor Editor-Panel kann dies anders sein."
391
+
392
+ #. Plugin Name of the plugin/theme
393
+ msgid "Polylang Connect for Elementor"
394
+ msgstr "Add-On: Polylang mit Elementor verbinden"
395
+
396
+ #. Plugin URI of the plugin/theme
397
+ msgid "https://github.com/deckerweb/connect-polylang-elementor"
398
+ msgstr "https://github.com/deckerweb/connect-polylang-elementor"
399
+
400
+ #. Description of the plugin/theme
401
+ msgid ""
402
+ "Connect the Polylang multilingual plugin with Elementor Page Builder: This "
403
+ "plugin will make Elementor and Polylang show the correct language templates, "
404
+ "especially with Elementor Pro Theme Builder. Plus: native Polylang Language "
405
+ "Switcher Elementor widget, new Dynamic Tags, and Polylang links added to the "
406
+ "Elementor Finder feature."
407
+ msgstr ""
408
+ "Verbinden Sie das Polylang mehrsprachigkeits-Plugin mit Elementor Page "
409
+ "Builder: Dieses Plugin hilft dabei, dass Elementor und Polylang die "
410
+ "richtigen Templates für Sprachen anzeigen, insbesondere in Verbindung mit "
411
+ "dem Elementor Pro Theme Builder. Plus: natives Polylang Language Switcher "
412
+ "Elementor Widget, neue Dynamic Tags und Polylang Links, die der Elementor "
413
+ "Finder Funktion hinzugefügt wurden."
414
+
415
+ #. Author URI of the plugin/theme
416
+ msgid "https://deckerweb.de/"
417
+ msgstr "https://deckerweb.de/"
418
+
419
+ #~ msgid "Connect Polylang Elementor"
420
+ #~ msgstr "Polylang mit Elementor verbinden"
421
+
422
+ #~ msgid "Polylang Language Names"
423
+ #~ msgstr "Polylang Sprachnamen"
424
+
425
+ #~ msgid "Before"
426
+ #~ msgstr "Davor"
427
+
428
+ #~ msgid "After"
429
+ #~ msgstr "Danach"
430
+
431
+ #~ msgctxt "Category title in Elementor Finder"
432
+ #~ msgid "Polylang"
433
+ #~ msgstr "Polylang"
434
+
435
+ #~ msgid ""
436
+ #~ "Connect Polylang with Elementor - some internal tweaks to make it work "
437
+ #~ "better."
438
+ #~ msgstr ""
439
+ #~ "Polylang mit Elementor verbinden - einige interne Tweaks, damit es besser "
440
+ #~ "läuft."
441
+
442
+ #~ msgctxt "Title in Elementor Finder"
443
+ #~ msgid "Polylang"
444
+ #~ msgstr "Polylang"
languages/connect-polylang-elementor.pot ADDED
@@ -0,0 +1,408 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #, fuzzy
2
+ msgid ""
3
+ msgstr ""
4
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
5
+ "Project-Id-Version: Connect Polylang to Elementor\n"
6
+ "POT-Creation-Date: 2018-11-28 09:34+0100\n"
7
+ "PO-Revision-Date: 2018-11-23 22:17+0100\n"
8
+ "Last-Translator: David Decker DECKERWEB.de -- https://deckerweb.de/\n"
9
+ "Language-Team: David Decker DECKERWEB.de -- https://deckerweb.de/\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "X-Generator: Poedit 2.2\n"
14
+ "X-Poedit-Basepath: ..\n"
15
+ "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
+ "X-Poedit-WPHeader: connect-polylang-elementor.php\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
19
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;"
20
+ "_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
23
+
24
+ #. translators: Title attribute for Polylang settings link
25
+ #: includes/admin-extras.php:38
26
+ msgid "Polylang Languages Setup"
27
+ msgstr ""
28
+
29
+ #: includes/admin-extras.php:39
30
+ msgctxt "Link title attribute for Polylang settings"
31
+ msgid "Languages"
32
+ msgstr ""
33
+
34
+ #. translators: Title attribute for Elementor My Templates link
35
+ #: includes/admin-extras.php:51
36
+ msgid "Elementor My Templates"
37
+ msgstr ""
38
+
39
+ #: includes/admin-extras.php:52
40
+ msgctxt "Link title attribute for Elementor My Templates"
41
+ msgid "Templates"
42
+ msgstr ""
43
+
44
+ #. translators: Plugins page listing
45
+ #: includes/admin-extras.php:109
46
+ msgctxt "Plugins page listing"
47
+ msgid "Support"
48
+ msgstr ""
49
+
50
+ #. translators: Plugins page listing
51
+ #: includes/admin-extras.php:112
52
+ msgctxt "Plugins page listing"
53
+ msgid "Facebook Group"
54
+ msgstr ""
55
+
56
+ #. translators: Plugins page listing
57
+ #: includes/admin-extras.php:115
58
+ msgctxt "Plugins page listing"
59
+ msgid "Translations"
60
+ msgstr ""
61
+
62
+ #. translators: Plugins page listing
63
+ #: includes/admin-extras.php:118
64
+ msgctxt "Plugins page listing"
65
+ msgid "Donate"
66
+ msgstr ""
67
+
68
+ #. Author of the plugin/theme
69
+ #: includes/functions-global.php:102
70
+ msgid "David Decker - DECKERWEB"
71
+ msgstr ""
72
+
73
+ #: modules/dynamic-tags/manager.php:27
74
+ msgctxt "Elementor Dynamic Tags group title"
75
+ msgid "Polylang Languages"
76
+ msgstr ""
77
+
78
+ #: modules/dynamic-tags/polylang-current-language-code.php:46
79
+ msgctxt "Elementor Dynamic Tag title"
80
+ msgid "Current Language Code"
81
+ msgstr ""
82
+
83
+ #: modules/dynamic-tags/polylang-current-language-flag.php:46
84
+ msgctxt "Elementor Dynamic Tag title"
85
+ msgid "Current Language Flag"
86
+ msgstr ""
87
+
88
+ #: modules/dynamic-tags/polylang-current-language-name.php:46
89
+ msgctxt "Elementor Dynamic Tag title"
90
+ msgid "Current Language Name"
91
+ msgstr ""
92
+
93
+ #: modules/dynamic-tags/polylang-current-language-url.php:46
94
+ msgctxt "Elementor Dynamic Tag title"
95
+ msgid "Current Language URL"
96
+ msgstr ""
97
+
98
+ #: modules/dynamic-tags/polylang-language-names.php:46
99
+ msgctxt "Elementor Dynamic Tag title"
100
+ msgid "Language Names"
101
+ msgstr ""
102
+
103
+ #: modules/dynamic-tags/polylang-language-names.php:110
104
+ #: modules/widgets/polylang-language-switcher.php:527
105
+ msgid "Language Name"
106
+ msgstr ""
107
+
108
+ #: modules/finder/plugin-cpel.php:34
109
+ msgctxt "Category title in Elementor Finder"
110
+ msgid "Add-On: Polylang Connect for Elementor"
111
+ msgstr ""
112
+
113
+ #: modules/finder/plugin-cpel.php:59
114
+ msgctxt "Title in Elementor Finder"
115
+ msgid "Plugin FAQ"
116
+ msgstr ""
117
+
118
+ #: modules/finder/plugin-cpel.php:63
119
+ msgid "FAQ and Documentation"
120
+ msgstr ""
121
+
122
+ #: modules/finder/plugin-cpel.php:75
123
+ msgctxt "Title in Elementor Finder"
124
+ msgid "Plugin Support Forum"
125
+ msgstr ""
126
+
127
+ #: modules/finder/plugin-cpel.php:79 modules/finder/plugin-polylang.php:166
128
+ msgid "Free support on WordPress.org"
129
+ msgstr ""
130
+
131
+ #: modules/finder/plugin-cpel.php:91
132
+ msgctxt "Title in Elementor Finder"
133
+ msgid "Plugin Translations"
134
+ msgstr ""
135
+
136
+ #: modules/finder/plugin-cpel.php:95
137
+ msgid "Translate this plugin on WordPress.org"
138
+ msgstr ""
139
+
140
+ #: modules/finder/plugin-polylang.php:35
141
+ msgctxt "Category title in Elementor Finder"
142
+ msgid "Polylang - Multilingual Plugin"
143
+ msgstr ""
144
+
145
+ #: modules/finder/plugin-polylang.php:56
146
+ msgctxt "Item title part in Elementor Finder"
147
+ msgid "Polylang"
148
+ msgstr ""
149
+
150
+ #: modules/finder/plugin-polylang.php:59
151
+ msgctxt "Item title part in Elementor Finder"
152
+ msgid "Polylang Pro"
153
+ msgstr ""
154
+
155
+ #: modules/finder/plugin-polylang.php:63
156
+ msgctxt "Item title part in Elementor Finder"
157
+ msgid "Website Language"
158
+ msgstr ""
159
+
160
+ #: modules/finder/plugin-polylang.php:66
161
+ msgctxt "Item title part in Elementor Finder"
162
+ msgid "Polylang Language"
163
+ msgstr ""
164
+
165
+ #: modules/finder/plugin-polylang.php:69
166
+ msgctxt "Item title part in Elementor Finder"
167
+ msgid "Polylang Pro Language"
168
+ msgstr ""
169
+
170
+ #: modules/finder/plugin-polylang.php:86
171
+ msgid "View website in this language"
172
+ msgstr ""
173
+
174
+ #: modules/finder/plugin-polylang.php:105
175
+ msgid "Edit this language"
176
+ msgstr ""
177
+
178
+ #: modules/finder/plugin-polylang.php:119
179
+ msgctxt "Title in Elementor Finder"
180
+ msgid "Setup languages"
181
+ msgstr ""
182
+
183
+ #: modules/finder/plugin-polylang.php:123
184
+ msgid "All languages your website appears in"
185
+ msgstr ""
186
+
187
+ #: modules/finder/plugin-polylang.php:128
188
+ msgctxt "Title in Elementor Finder"
189
+ msgid "String Translations"
190
+ msgstr ""
191
+
192
+ #: modules/finder/plugin-polylang.php:132
193
+ msgid "From Widgets and other website parts"
194
+ msgstr ""
195
+
196
+ #: modules/finder/plugin-polylang.php:137
197
+ msgctxt "Title in Elementor Finder"
198
+ msgid "Settings"
199
+ msgstr ""
200
+
201
+ #: modules/finder/plugin-polylang.php:141
202
+ msgid "Plugin's settings, enable/ disable modules"
203
+ msgstr ""
204
+
205
+ #: modules/finder/plugin-polylang.php:146
206
+ msgctxt "Title in Elementor Finder"
207
+ msgid "Plugin Documentation"
208
+ msgstr ""
209
+
210
+ #: modules/finder/plugin-polylang.php:150
211
+ msgid "FAQ, Knowledge Base and Documentation"
212
+ msgstr ""
213
+
214
+ #: modules/finder/plugin-polylang.php:162
215
+ msgctxt "Title in Elementor Finder"
216
+ msgid "Support Forum"
217
+ msgstr ""
218
+
219
+ #: modules/widgets/polylang-language-switcher.php:66
220
+ msgctxt "Elementor widget title"
221
+ msgid "Polylang Switcher"
222
+ msgstr ""
223
+
224
+ #: modules/widgets/polylang-language-switcher.php:174
225
+ msgid "Content"
226
+ msgstr ""
227
+
228
+ #: modules/widgets/polylang-language-switcher.php:181
229
+ msgid "Layout"
230
+ msgstr ""
231
+
232
+ #: modules/widgets/polylang-language-switcher.php:185
233
+ msgid "Horizontal"
234
+ msgstr ""
235
+
236
+ #: modules/widgets/polylang-language-switcher.php:186
237
+ msgid "Vertical"
238
+ msgstr ""
239
+
240
+ #: modules/widgets/polylang-language-switcher.php:196
241
+ msgid "Align"
242
+ msgstr ""
243
+
244
+ #: modules/widgets/polylang-language-switcher.php:200
245
+ msgid "Left"
246
+ msgstr ""
247
+
248
+ #: modules/widgets/polylang-language-switcher.php:204
249
+ msgid "Center"
250
+ msgstr ""
251
+
252
+ #: modules/widgets/polylang-language-switcher.php:208
253
+ msgid "Right"
254
+ msgstr ""
255
+
256
+ #: modules/widgets/polylang-language-switcher.php:212
257
+ msgid "Stretch"
258
+ msgstr ""
259
+
260
+ #: modules/widgets/polylang-language-switcher.php:224
261
+ msgid "Hide the current language"
262
+ msgstr ""
263
+
264
+ #: modules/widgets/polylang-language-switcher.php:235
265
+ msgid "Hide languages with no translation"
266
+ msgstr ""
267
+
268
+ #: modules/widgets/polylang-language-switcher.php:245
269
+ msgid "Show Country Flag"
270
+ msgstr ""
271
+
272
+ #: modules/widgets/polylang-language-switcher.php:255
273
+ msgid "Show Language Name"
274
+ msgstr ""
275
+
276
+ #: modules/widgets/polylang-language-switcher.php:265
277
+ msgid "Show Language Code"
278
+ msgstr ""
279
+
280
+ #: modules/widgets/polylang-language-switcher.php:280
281
+ msgid "All languages"
282
+ msgstr ""
283
+
284
+ #: modules/widgets/polylang-language-switcher.php:287
285
+ msgid "Display widget for:"
286
+ msgstr ""
287
+
288
+ #: modules/widgets/polylang-language-switcher.php:301
289
+ #: modules/widgets/polylang-language-switcher.php:635
290
+ msgid "Main Menu"
291
+ msgstr ""
292
+
293
+ #: modules/widgets/polylang-language-switcher.php:311
294
+ msgid "Normal"
295
+ msgstr ""
296
+
297
+ #: modules/widgets/polylang-language-switcher.php:327
298
+ #: modules/widgets/polylang-language-switcher.php:364
299
+ #: modules/widgets/polylang-language-switcher.php:408
300
+ msgid "Text Color"
301
+ msgstr ""
302
+
303
+ #: modules/widgets/polylang-language-switcher.php:345
304
+ msgid "Hover"
305
+ msgstr ""
306
+
307
+ #: modules/widgets/polylang-language-switcher.php:383
308
+ msgid "Active"
309
+ msgstr ""
310
+
311
+ #: modules/widgets/polylang-language-switcher.php:391
312
+ msgid ""
313
+ "This controls the item in the Switcher for the current active language"
314
+ msgstr ""
315
+
316
+ #: modules/widgets/polylang-language-switcher.php:420
317
+ msgid "Text Hover Color"
318
+ msgstr ""
319
+
320
+ #: modules/widgets/polylang-language-switcher.php:436
321
+ msgid "Horizontal Padding"
322
+ msgstr ""
323
+
324
+ #: modules/widgets/polylang-language-switcher.php:453
325
+ msgid "Vertical Padding"
326
+ msgstr ""
327
+
328
+ #: modules/widgets/polylang-language-switcher.php:469
329
+ msgid "Space Between"
330
+ msgstr ""
331
+
332
+ #: modules/widgets/polylang-language-switcher.php:500
333
+ msgid "Country Flag"
334
+ msgstr ""
335
+
336
+ #: modules/widgets/polylang-language-switcher.php:511
337
+ #: modules/widgets/polylang-language-switcher.php:548
338
+ #: modules/widgets/polylang-language-switcher.php:585
339
+ msgid "Margin"
340
+ msgstr ""
341
+
342
+ #: modules/widgets/polylang-language-switcher.php:538
343
+ #: modules/widgets/polylang-language-switcher.php:575
344
+ msgid "Uppercase"
345
+ msgstr ""
346
+
347
+ #: modules/widgets/polylang-language-switcher.php:564
348
+ msgid "Language Code"
349
+ msgstr ""
350
+
351
+ #: modules/widgets/polylang-language-switcher.php:597
352
+ msgid "Text before"
353
+ msgstr ""
354
+
355
+ #: modules/widgets/polylang-language-switcher.php:605
356
+ msgid "Text after"
357
+ msgstr ""
358
+
359
+ #: modules/widgets/polylang-language-switcher.php:617
360
+ msgid "Helpful Information"
361
+ msgstr ""
362
+
363
+ #: modules/widgets/polylang-language-switcher.php:624
364
+ msgid "Country Flags"
365
+ msgstr ""
366
+
367
+ #. translators: %1$s - <code>16px</code> (width 16px) / %2$s - <code>11px</code> (height 11px)
368
+ #: modules/widgets/polylang-language-switcher.php:627
369
+ #, php-format
370
+ msgid ""
371
+ "Country flags are by default used from Polylang plugin and have the static "
372
+ "size of %1$s wide and %2$s high."
373
+ msgstr ""
374
+
375
+ #: modules/widgets/polylang-language-switcher.php:634
376
+ msgid "Style"
377
+ msgstr ""
378
+
379
+ #: modules/widgets/polylang-language-switcher.php:636
380
+ msgid "Tab: \"Active\""
381
+ msgstr ""
382
+
383
+ #: modules/widgets/polylang-language-switcher.php:637
384
+ msgid ""
385
+ "This marks the language of currently viewed content - on the frontend. In "
386
+ "Elementor Editor Panel this could be different."
387
+ msgstr ""
388
+
389
+ #. Plugin Name of the plugin/theme
390
+ msgid "Polylang Connect for Elementor"
391
+ msgstr ""
392
+
393
+ #. Plugin URI of the plugin/theme
394
+ msgid "https://github.com/deckerweb/connect-polylang-elementor"
395
+ msgstr ""
396
+
397
+ #. Description of the plugin/theme
398
+ msgid ""
399
+ "Connect the Polylang multilingual plugin with Elementor Page Builder: This "
400
+ "plugin will make Elementor and Polylang show the correct language "
401
+ "templates, especially with Elementor Pro Theme Builder. Plus: native "
402
+ "Polylang Language Switcher Elementor widget, new Dynamic Tags, and "
403
+ "Polylang links added to the Elementor Finder feature."
404
+ msgstr ""
405
+
406
+ #. Author URI of the plugin/theme
407
+ msgid "https://deckerweb.de/"
408
+ msgstr ""
languages/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
languages/readme.txt ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # .pot File
2
+
3
+ The .pot file is always included in:
4
+ `/connect-polylang-elementor/languages/connect-polylang-elementor.pot`
5
+
6
+ --------------------------------------------------------------------------------
7
+
8
+ # Language Packs
9
+
10
+ Community Translations for this plugin are handled via:
11
+ https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor
12
+
13
+ * You are invited to contribute there for your language
14
+ * Translations there which are 95% or more complete will be automatically loaded
15
+ in WordPress as language pack for the plugin and are also updateable
16
+
17
+ Thank you for your contribution!
18
+
19
+ --------------------------------------------------------------------------------
20
+
21
+ # Custom Translations
22
+
23
+ If you want or need custom translations different from the Community
24
+ translations above, you can do that easily:
25
+ Create your translation with "Poedit" (https://poedit.net/wordpress)
26
+ or "Loco Translate" plugin (https://wordpress.org/plugins/loco-translate/)
27
+ and upload the translation file there:
28
+ `/wp-content/languages/connect-polylang-elementor/`
29
+
30
+ for example the German version would looke like that:
31
+ `/wp-content/languages/connect-polylang-elementor/connect-polylang-elementor-de_DE.mo`
32
+
33
+ Note: The location `/wp-content/languages/` is the global translation folder -
34
+ if it does not exist yet in your installation just create it.
modules/connect/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
modules/connect/tweaks-polylang-elementor.php ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/connect/tweaks-polylang-elementor
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ add_filter( 'pll_get_post_types', 'ddw_cpel_add_cpts_to_polylang', 10, 2 );
16
+ /**
17
+ * Enable Elementor-specific post types automatically for Polylang support.
18
+ *
19
+ * @link https://polylang.pro/doc/filter-reference/
20
+ *
21
+ * @since 1.0.0
22
+ *
23
+ * @param bool $is_settings Whether a post type is already added to Polylang
24
+ * or not.
25
+ * @param array $post_types Holds all Polylang-added post types.
26
+ * @return array Modified array of post types.
27
+ */
28
+ function ddw_cpel_add_cpts_to_polylang( $post_types, $is_settings ) {
29
+
30
+ /** Bail early if integration not wanted */
31
+ if ( ! apply_filters( 'cpel/filter/polylang/posttypes_automatic', TRUE ) ) {
32
+ return;
33
+ }
34
+
35
+ /** Set Elementor-relevant post types */
36
+ $relevant_types = apply_filters(
37
+ 'cpel/filter/polylang/post_types',
38
+ array(
39
+ 'elementor_library', // Elementor
40
+ 'oceanwp_library', // OceanWP Library
41
+ 'astra-advanced-hook', // Astra Custom Layouts (Astra Pro)
42
+ 'gp_elements', // GeneratePress Elements (GP Premium)
43
+ 'jet-theme-core', // JetThemeCore (Kava Pro/ CrocoBlock)
44
+ 'customify_hook', // Customify (Customify Pro)
45
+ 'wpbf_hooks', // Page Builder Framework Sections (WPBF Premium)
46
+ 'ae_global_templates', // AnyWhere Elementor plugin
47
+ )
48
+ );
49
+
50
+ /** Add all post types to Polylang */
51
+ foreach ( $relevant_types as $relevant_type ) {
52
+ $post_types[ $relevant_type ] = $relevant_type;
53
+ }
54
+
55
+ /** Return modified post types list for Polylang */
56
+ return $post_types;
57
+
58
+ } // end function
59
+
60
+
61
+ add_action( 'parse_query', 'ddw_cpel_polylang_elementor_library_conditions_parse_query', 1 );
62
+ /**
63
+ * Fix for Elementor template conditions not compatible with Polylang (you need
64
+ * to save again one of your templates conditions to make it work, after
65
+ * putting this function in your plugin/theme).
66
+ * Note: Needs to be priority 1, since Polylang uses the action parse_query
67
+ * which is fired before 'pre_get_posts'.
68
+ *
69
+ * @link https://github.com/polylang/polylang/issues/152#issuecomment-320602328
70
+ * @link https://github.com/pojome/elementor/issues/4839
71
+ *
72
+ * @since 1.0.0
73
+ *
74
+ * @param WP_Query $query
75
+ */
76
+ function ddw_cpel_polylang_elementor_library_conditions_parse_query( $query ) {
77
+
78
+ if ( is_admin() && ! empty( $query->query_vars[ 'post_type' ] ) && 'elementor_library' === $query->query_vars[ 'post_type' ]
79
+ && ! empty( $query->query_vars[ 'meta_key' ] )
80
+ && '_elementor_conditions' === $query->query_vars[ 'meta_key' ]
81
+ ) {
82
+ $query->set( 'lang', '' );
83
+ }
84
+
85
+ } // end function
86
+
87
+
88
+ add_filter( 'elementor/theme/get_location_templates/template_id', 'ddw_cpel_change_template_based_on_language' );
89
+ /**
90
+ * Filter Elementor conditions system: Change Elementor template based on an
91
+ * assigned language in Polylang plugin.
92
+ *
93
+ * @link https://github.com/pojome/elementor/issues/4839
94
+ *
95
+ * @since 1.0.0
96
+ *
97
+ * @uses pll_get_post()
98
+ *
99
+ * @param int $post_id ID of the current post.
100
+ * @return string Based translation, the translation ID, or the original Post ID.
101
+ */
102
+ function ddw_cpel_change_template_based_on_language( $post_id ) {
103
+
104
+ if ( function_exists( 'pll_get_post' ) ) {
105
+
106
+ $translation_post_id = pll_get_post( $post_id );
107
+
108
+ if ( null === $translation_post_id ) {
109
+
110
+ /** The current language is not defined yet */
111
+ return $post_id;
112
+
113
+ } elseif ( false === $translation_post_id ) {
114
+
115
+ /** No translation yet */
116
+ return $post_id;
117
+
118
+ } elseif ( $translation_post_id > 0 ) {
119
+
120
+ /** Return translated post ID */
121
+ return $translation_post_id;
122
+
123
+ } // end if
124
+
125
+ } // end if
126
+
127
+ return $post_id;
128
+
129
+ } // end function
modules/dynamic-tags/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
modules/dynamic-tags/manager.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/dynamic-tags/manager
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ add_action( 'elementor/dynamic_tags/register_tags', 'ddw_cpel_register_dynamic_tags_polylang_languages', 10, 1 );
16
+ /**
17
+ * Register new Dynamic Tags for Elementor, including a new Tag Group.
18
+ *
19
+ * @since 1.0.0
20
+ *
21
+ * @uses \Elementor\Plugin()
22
+ */
23
+ function ddw_cpel_register_dynamic_tags_polylang_languages( $dynamic_tags ) {
24
+
25
+ /** Register our tag groups before the tags */
26
+ \Elementor\Plugin::$instance->dynamic_tags->register_group( 'polylang-languages', [
27
+ 'title' => _x( 'Polylang Languages', 'Elementor Dynamic Tags group title', 'connect-polylang-elementor' )
28
+ ] );
29
+
30
+ /** Load the Dynamic tags class files */
31
+ require_once( CPEL_PLUGIN_DIR . 'modules/dynamic-tags/polylang-language-names.php' );
32
+ require_once( CPEL_PLUGIN_DIR . 'modules/dynamic-tags/polylang-current-language-name.php' );
33
+ require_once( CPEL_PLUGIN_DIR . 'modules/dynamic-tags/polylang-current-language-code.php' );
34
+ require_once( CPEL_PLUGIN_DIR . 'modules/dynamic-tags/polylang-current-language-url.php' );
35
+ require_once( CPEL_PLUGIN_DIR . 'modules/dynamic-tags/polylang-current-language-flag.php' );
36
+
37
+ /** Register the tags */
38
+ $dynamic_tags->register_tag( 'DDW_Polylang_Language_Names_Elementor_Dynamic_Tag' );
39
+ $dynamic_tags->register_tag( 'DDW_Polylang_Current_Language_Name_Elementor_Dynamic_Tag' );
40
+ $dynamic_tags->register_tag( 'DDW_Polylang_Current_Language_Code_Elementor_Dynamic_Tag' );
41
+ $dynamic_tags->register_tag( 'DDW_Polylang_Current_Language_URL_Elementor_Dynamic_Tag' );
42
+ $dynamic_tags->register_tag( 'DDW_Polylang_Current_Language_Flag_Elementor_Dynamic_Tag' );
43
+
44
+ } // end function
modules/dynamic-tags/polylang-current-language-code.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/dynamic-tags/polylang-current-language-code
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ class DDW_Polylang_Current_Language_Code_Elementor_Dynamic_Tag extends \Elementor\Core\DynamicTags\Tag {
16
+
17
+ /**
18
+ * Get Name
19
+ *
20
+ * Returns the Name of the tag
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ *
25
+ * @return string
26
+ */
27
+ public function get_name() {
28
+
29
+ return 'current-language-code';
30
+
31
+ } // end method
32
+
33
+
34
+ /**
35
+ * Get Title
36
+ *
37
+ * Returns the title of the Tag
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ *
42
+ * @return string
43
+ */
44
+ public function get_title() {
45
+
46
+ return _x( 'Current Language Code', 'Elementor Dynamic Tag title', 'connect-polylang-elementor' );
47
+
48
+ } // end method
49
+
50
+
51
+ /**
52
+ * Get Group
53
+ *
54
+ * Returns the Group of the tag
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ *
59
+ * @return string
60
+ */
61
+ public function get_group() {
62
+
63
+ return 'polylang-languages';
64
+
65
+ } // end method
66
+
67
+
68
+ /**
69
+ * Get Categories
70
+ *
71
+ * Returns an array of tag categories
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ *
76
+ * @return array
77
+ */
78
+ public function get_categories() {
79
+
80
+ return [ \Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY ];
81
+
82
+ } // end method
83
+
84
+
85
+ /**
86
+ * Render
87
+ *
88
+ * Prints out the value of the Dynamic tag
89
+ *
90
+ * @since 1.0.0
91
+ * @access public
92
+ *
93
+ * @uses pll_current_language()
94
+ *
95
+ * @return void
96
+ */
97
+ public function render() {
98
+
99
+ echo wp_kses_post( pll_current_language( $field = 'slug' ) );
100
+
101
+ } // end method
102
+
103
+ } // end of class
modules/dynamic-tags/polylang-current-language-flag.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/dynamic-tags/polylang-current-language-flag
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ class DDW_Polylang_Current_Language_Flag_Elementor_Dynamic_Tag extends \Elementor\Core\DynamicTags\Data_Tag {
16
+
17
+ /**
18
+ * Get Name
19
+ *
20
+ * Returns the Name of the tag
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ *
25
+ * @return string
26
+ */
27
+ public function get_name() {
28
+
29
+ return 'current-language-flag';
30
+
31
+ } // end method
32
+
33
+
34
+ /**
35
+ * Get Title
36
+ *
37
+ * Returns the title of the Tag
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ *
42
+ * @return string
43
+ */
44
+ public function get_title() {
45
+
46
+ return _x( 'Current Language Flag', 'Elementor Dynamic Tag title', 'connect-polylang-elementor' );
47
+
48
+ } // end method
49
+
50
+
51
+ /**
52
+ * Get Group
53
+ *
54
+ * Returns the Group of the tag
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ *
59
+ * @return string
60
+ */
61
+ public function get_group() {
62
+
63
+ return 'polylang-languages';
64
+
65
+ } // end method
66
+
67
+
68
+ /**
69
+ * Get Categories
70
+ *
71
+ * Returns an array of tag categories
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ *
76
+ * @return array
77
+ */
78
+ public function get_categories() {
79
+
80
+ return [ \Elementor\Modules\DynamicTags\Module::IMAGE_CATEGORY ];
81
+
82
+ } // end method
83
+
84
+
85
+ /**
86
+ * Render
87
+ *
88
+ * Prints out the value of the Dynamic tag
89
+ *
90
+ * @since 1.0.0
91
+ * @access public
92
+ *
93
+ * @uses pll_current_language()
94
+ *
95
+ * @return void
96
+ */
97
+ public function get_value( array $options = [] ) {
98
+
99
+ $image_data = [
100
+ 'id' => (int) pll_current_language( $field = 'term_id' ),
101
+ 'url' => pll_current_language( $field = 'flag_url' ),
102
+ ];
103
+
104
+ return $image_data;
105
+
106
+ } // end method
107
+
108
+ } // end of class
modules/dynamic-tags/polylang-current-language-name.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/dynamic-tags/polylang-current-language-name
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ class DDW_Polylang_Current_Language_Name_Elementor_Dynamic_Tag extends \Elementor\Core\DynamicTags\Tag {
16
+
17
+ /**
18
+ * Get Name
19
+ *
20
+ * Returns the Name of the tag
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ *
25
+ * @return string
26
+ */
27
+ public function get_name() {
28
+
29
+ return 'current-language-name';
30
+
31
+ } // end method
32
+
33
+
34
+ /**
35
+ * Get Title
36
+ *
37
+ * Returns the title of the Tag
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ *
42
+ * @return string
43
+ */
44
+ public function get_title() {
45
+
46
+ return _x( 'Current Language Name', 'Elementor Dynamic Tag title', 'connect-polylang-elementor' );
47
+
48
+ } // end method
49
+
50
+
51
+ /**
52
+ * Get Group
53
+ *
54
+ * Returns the Group of the tag
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ *
59
+ * @return string
60
+ */
61
+ public function get_group() {
62
+
63
+ return 'polylang-languages';
64
+
65
+ } // end method
66
+
67
+
68
+ /**
69
+ * Get Categories
70
+ *
71
+ * Returns an array of tag categories
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ *
76
+ * @return array
77
+ */
78
+ public function get_categories() {
79
+
80
+ return [ \Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY ];
81
+
82
+ } // end method
83
+
84
+
85
+ /**
86
+ * Render
87
+ *
88
+ * Prints out the value of the Dynamic tag
89
+ *
90
+ * @since 1.0.0
91
+ * @access public
92
+ *
93
+ * @uses pll_current_language()
94
+ *
95
+ * @return void
96
+ */
97
+ public function render() {
98
+
99
+ echo wp_kses_post( pll_current_language( $field = 'name' ) );
100
+
101
+ } // end method
102
+
103
+ } // end of class
modules/dynamic-tags/polylang-current-language-url.php ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/dynamic-tags/polylang-current-language-url
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ class DDW_Polylang_Current_Language_URL_Elementor_Dynamic_Tag extends \Elementor\Core\DynamicTags\Data_Tag {
16
+
17
+ /**
18
+ * Get Name
19
+ *
20
+ * Returns the Name of the tag
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ *
25
+ * @return string
26
+ */
27
+ public function get_name() {
28
+
29
+ return 'current-language-url';
30
+
31
+ } // end method
32
+
33
+
34
+ /**
35
+ * Get Title
36
+ *
37
+ * Returns the title of the Tag
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ *
42
+ * @return string
43
+ */
44
+ public function get_title() {
45
+
46
+ return _x( 'Current Language URL', 'Elementor Dynamic Tag title', 'connect-polylang-elementor' );
47
+
48
+ } // end method
49
+
50
+
51
+ /**
52
+ * Get Group
53
+ *
54
+ * Returns the Group of the tag
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ *
59
+ * @return string
60
+ */
61
+ public function get_group() {
62
+
63
+ return 'polylang-languages';
64
+
65
+ } // end method
66
+
67
+
68
+ /**
69
+ * Get Categories
70
+ *
71
+ * Returns an array of tag categories
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ *
76
+ * @return array
77
+ */
78
+ public function get_categories() {
79
+
80
+ return [ \Elementor\Modules\DynamicTags\Module::URL_CATEGORY ];
81
+
82
+ } // end method
83
+
84
+
85
+ /**
86
+ * Render
87
+ *
88
+ * Prints out the value of the Dynamic tag
89
+ *
90
+ * @since 1.0.0
91
+ * @access public
92
+ *
93
+ * @uses pll_the_languages()
94
+ *
95
+ * @return void
96
+ */
97
+ public function get_value( array $options = [] ) {
98
+
99
+ /** Get all Polylang languages */
100
+ $languages = pll_the_languages( array( 'raw' => 1 ) );
101
+
102
+ if ( ! empty( $languages ) ) {
103
+
104
+ foreach ( $languages as $language ) {
105
+
106
+ /** If current language found, stop the loop */
107
+ if ( $language[ 'current_lang' ] ) {
108
+ break;
109
+ }
110
+
111
+ } // end foreach
112
+
113
+ } // end if
114
+
115
+ return esc_url_raw( $language[ 'url' ] );
116
+
117
+ } // end method
118
+
119
+ } // end of class
modules/dynamic-tags/polylang-language-names.php ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/dynamic-tags/polylang-language-names
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ class DDW_Polylang_Language_Names_Elementor_Dynamic_Tag extends \Elementor\Core\DynamicTags\Tag {
16
+
17
+ /**
18
+ * Get Name
19
+ *
20
+ * Returns the Name of the tag
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ *
25
+ * @return string
26
+ */
27
+ public function get_name() {
28
+
29
+ return 'language-names';
30
+
31
+ } // end method
32
+
33
+
34
+ /**
35
+ * Get Title
36
+ *
37
+ * Returns the title of the Tag
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ *
42
+ * @return string
43
+ */
44
+ public function get_title() {
45
+
46
+ return _x( 'Language Names', 'Elementor Dynamic Tag title', 'connect-polylang-elementor' );
47
+
48
+ } // end method
49
+
50
+
51
+ /**
52
+ * Get Group
53
+ *
54
+ * Returns the Group of the tag
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ *
59
+ * @return string
60
+ */
61
+ public function get_group() {
62
+
63
+ return 'polylang-languages';
64
+
65
+ } // end method
66
+
67
+
68
+ /**
69
+ * Get Categories
70
+ *
71
+ * Returns an array of tag categories
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ *
76
+ * @return array
77
+ */
78
+ public function get_categories() {
79
+
80
+ return [ \Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY ];
81
+
82
+ } // end method
83
+
84
+
85
+ /**
86
+ * Register Controls
87
+ *
88
+ * Registers the Dynamic tag controls
89
+ *
90
+ * @since 1.0.0
91
+ * @access protected
92
+ *
93
+ * @uses pll_languages_list()
94
+ *
95
+ * @return void
96
+ */
97
+ protected function _register_controls() {
98
+
99
+ $languages = pll_languages_list( array( 'fields' => FALSE ) );
100
+
101
+ $lang_names = [];
102
+
103
+ foreach ( $languages as $language ) {
104
+ $lang_names[ $language->name ] = $language->name;
105
+ }
106
+
107
+ $this->add_control(
108
+ 'polylang_language_name',
109
+ [
110
+ 'label' => __( 'Language Name', 'connect-polylang-elementor' ),
111
+ 'type' => \Elementor\Controls_Manager::SELECT,
112
+ 'options' => $lang_names,
113
+ ]
114
+ );
115
+
116
+ } // end method
117
+
118
+
119
+ /**
120
+ * Render
121
+ *
122
+ * Prints out the value of the Dynamic tag
123
+ *
124
+ * @since 1.0.0
125
+ * @access public
126
+ *
127
+ * @return void
128
+ */
129
+ public function render() {
130
+
131
+ $lang_name = $this->get_settings( 'polylang_language_name' );
132
+
133
+ if ( ! $lang_name ) {
134
+ return;
135
+ }
136
+
137
+ echo esc_attr( $lang_name );
138
+
139
+ } // end method
140
+
141
+ } // end of class
modules/finder/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
modules/finder/manager.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/finder/manager
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ add_action( 'elementor/finder/categories/init', 'ddw_cpel_elementor_finder_add_items' );
16
+ /**
17
+ * Add categories to the Elementor Finder (Elementor v2.3.0+).
18
+ * - Polylang Plugin
19
+ * - CPEL (this plugin)
20
+ *
21
+ * @since 1.0.0
22
+ *
23
+ * @param object $categories_manager
24
+ */
25
+ function ddw_cpel_elementor_finder_add_items( $categories_manager ) {
26
+
27
+ /** Include the Finder Category class files */
28
+ require_once( CPEL_PLUGIN_DIR . 'modules/finder/plugin-polylang.php' );
29
+ require_once( CPEL_PLUGIN_DIR . 'modules/finder/plugin-cpel.php' );
30
+
31
+ /** Add the Polyang Plugin category */
32
+ $categories_manager->add_category( 'polylang-plugin', new DDW_Polylang_Plugin_Finder_Category() );
33
+
34
+ /** Add the our own CPEL Plugin category */
35
+ $categories_manager->add_category( 'connect-polylang-elementor', new DDW_CPEL_Plugin_Finder_Category() );
36
+
37
+ } // end function
modules/finder/plugin-cpel.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/finder/plugin-cpel
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ /**
16
+ * Add the "Polylang Connect for Elementor" category to the Elementor Finder.
17
+ * - Plugin resources
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class DDW_CPEL_Plugin_Finder_Category extends \Elementor\Core\Common\Modules\Finder\Base_Category {
22
+
23
+ /**
24
+ * Get title.
25
+ *
26
+ * @since 1.0.0
27
+ *
28
+ * @access public
29
+ *
30
+ * @return string Translateable category title.
31
+ */
32
+ public function get_title() {
33
+
34
+ return _x( 'Add-On: Polylang Connect for Elementor', 'Category title in Elementor Finder', 'connect-polylang-elementor' );
35
+
36
+ } // end method
37
+
38
+
39
+ /**
40
+ * Get category items.
41
+ *
42
+ * @since 1.0.0
43
+ *
44
+ * @access public
45
+ *
46
+ * @uses ddw_cpel_get_info_url()
47
+ *
48
+ * @param array $options
49
+ * @return array $items Filterable array of additional Finder items.
50
+ */
51
+ public function get_category_items( array $options = [] ) {
52
+
53
+ /** Set actions */
54
+ $action_name = 'view';
55
+ $action_icon = 'eye';
56
+
57
+ /** External: FAQ */
58
+ $items[ 'plugin-faq' ] = [
59
+ 'title' => _x( 'Plugin FAQ', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
60
+ 'url' => ddw_cpel_get_info_url( 'url_wporg_faq' ),
61
+ 'icon' => 'info',
62
+ 'keywords' => [ 'help', 'docs', 'documentation', 'faq', 'knowledge base', 'plugin' ],
63
+ 'description' => __( 'FAQ and Documentation', 'connect-polylang-elementor' ),
64
+ 'actions' => [
65
+ [
66
+ 'name' => $action_name,
67
+ 'url' => ddw_cpel_get_info_url( 'url_wporg_faq' ),
68
+ 'icon' => $action_icon,
69
+ ],
70
+ ],
71
+ ];
72
+
73
+ /** External: WordPress.org support forum */
74
+ $items[ 'plugin-support-forum' ] = [
75
+ 'title' => _x( 'Plugin Support Forum', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
76
+ 'url' => ddw_cpel_get_info_url( 'url_wporg_forum' ),
77
+ 'icon' => 'comments',
78
+ 'keywords' => [ 'support', 'forum', 'wordpress.org', 'help', 'plugin' ],
79
+ 'description' => __( 'Free support on WordPress.org', 'connect-polylang-elementor' ),
80
+ 'actions' => [
81
+ [
82
+ 'name' => $action_name,
83
+ 'url' => ddw_cpel_get_info_url( 'url_wporg_forum' ),
84
+ 'icon' => $action_icon,
85
+ ],
86
+ ],
87
+ ];
88
+
89
+ /** External: WordPress.org translation platform */
90
+ $items[ 'plugin-translations' ] = [
91
+ 'title' => _x( 'Plugin Translations', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
92
+ 'url' => ddw_cpel_get_info_url( 'url_translate' ),
93
+ 'icon' => 'exchange',
94
+ 'keywords' => [ 'translate', 'translations', 'wordpress.org', 'glotpress', 'plugin' ],
95
+ 'description' => __( 'Translate this plugin on WordPress.org', 'connect-polylang-elementor' ),
96
+ 'actions' => [
97
+ [
98
+ 'name' => $action_name,
99
+ 'url' => ddw_cpel_get_info_url( 'url_translate' ),
100
+ 'icon' => $action_icon,
101
+ ],
102
+ ],
103
+ ];
104
+
105
+ /** Return items array, filterable */
106
+ return apply_filters(
107
+ 'cpel/filter/elementor_finder/items/plugin_resources',
108
+ $items
109
+ );
110
+
111
+ } // end method
112
+
113
+ } // end of class
modules/finder/plugin-polylang.php ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/finder/plugin-polylang
4
+
5
+ /**
6
+ * Prevent direct access to this file.
7
+ *
8
+ * @since 1.0.0
9
+ */
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit( 'Sorry, you are not allowed to access this file directly.' );
12
+ }
13
+
14
+
15
+ /**
16
+ * Add the "Polylang" category to the Elementor Finder.
17
+ * - Settings pages
18
+ * - Plugin resources
19
+ *
20
+ * @since 1.0.0
21
+ */
22
+ class DDW_Polylang_Plugin_Finder_Category extends \Elementor\Core\Common\Modules\Finder\Base_Category {
23
+
24
+ /**
25
+ * Get title.
26
+ *
27
+ * @since 1.0.0
28
+ *
29
+ * @access public
30
+ *
31
+ * @return string Translateable category title.
32
+ */
33
+ public function get_title() {
34
+
35
+ return _x( 'Polylang - Multilingual Plugin', 'Category title in Elementor Finder', 'connect-polylang-elementor' );
36
+
37
+ } // end method
38
+
39
+
40
+ /**
41
+ * Get category items.
42
+ *
43
+ * @since 1.0.0
44
+ *
45
+ * @access public
46
+ *
47
+ * @uses ddw_cpel_is_polylang_pro_active()
48
+ * @uses pll_languages_list() Holds array of Polylang languages.
49
+ *
50
+ * @param array $options
51
+ * @return array $items Filterable array of additional Finder items.
52
+ */
53
+ public function get_category_items( array $options = [] ) {
54
+
55
+ /** Set "Polylang (Pro)" string */
56
+ $string_polylang = _x( 'Polylang', 'Item title part in Elementor Finder', 'connect-polylang-elementor' ) . ': ';
57
+
58
+ if ( ddw_cpel_is_polylang_pro_active() ) {
59
+ $string_polylang = _x( 'Polylang Pro', 'Item title part in Elementor Finder', 'connect-polylang-elementor' ) . ': ';
60
+ }
61
+
62
+ /** Set "Website Language" string */
63
+ $string_website_lang = _x( 'Website Language', 'Item title part in Elementor Finder', 'connect-polylang-elementor' ) . ': ';
64
+
65
+ /** Set "Polylang (Pro) Language" string */
66
+ $string_polylang_lang = _x( 'Polylang Language', 'Item title part in Elementor Finder', 'connect-polylang-elementor' ) . ': ';
67
+
68
+ if ( ddw_cpel_is_polylang_pro_active() ) {
69
+ $string_polylang_lang = _x( 'Polylang Pro Language', 'Item title part in Elementor Finder', 'connect-polylang-elementor' ) . ': ';
70
+ }
71
+
72
+ /** Set actions */
73
+ $action_name = 'view';
74
+ $action_icon = 'eye';
75
+
76
+ /** List all setup languages */
77
+ $languages = pll_languages_list( array( 'fields' => FALSE ) );
78
+
79
+ foreach ( $languages as $lang_data ) {
80
+
81
+ $items[ 'website-language-' . $lang_data->slug ] = [
82
+ 'title' => $string_website_lang . $lang_data->name,
83
+ 'url' => esc_url( $lang_data->home_url ),
84
+ 'icon' => 'eye',
85
+ 'keywords' => [ 'website', 'polylang', 'language', $lang_data->name, $lang_data->slug, 'country', $lang_data->locale ],
86
+ 'description' => __( 'View website in this language', 'connect-polylang-elementor' ),
87
+ 'actions' => [
88
+ [
89
+ 'name' => 'edit',
90
+ 'url' => esc_url_raw( admin_url( 'admin.php?page=mlang&pll_action=edit&lang=' . $lang_data->term_id ) ),
91
+ 'icon' => 'edit',
92
+ ],
93
+ ],
94
+ ];
95
+
96
+ } // end foreach
97
+
98
+ foreach ( $languages as $lang_data ) {
99
+
100
+ $items[ 'polylang-language-' . $lang_data->slug ] = [
101
+ 'title' => $string_polylang_lang . $lang_data->name,
102
+ 'url' => esc_url_raw( admin_url( 'admin.php?page=mlang&pll_action=edit&lang=' . $lang_data->term_id ) ),
103
+ 'icon' => 'edit',
104
+ 'keywords' => [ 'polylang', 'language', $lang_data->name, $lang_data->slug, 'country', $lang_data->locale ],
105
+ 'description' => __( 'Edit this language', 'connect-polylang-elementor' ),
106
+ 'actions' => [
107
+ [
108
+ 'name' => $action_name,
109
+ 'url' => esc_url( $lang_data->home_url ),
110
+ 'icon' => $action_icon,
111
+ ],
112
+ ],
113
+ ];
114
+
115
+ } // end foreach
116
+
117
+ /** Settings: Languages setup */
118
+ $items[ 'languages' ] = [
119
+ 'title' => $string_polylang . _x( 'Setup languages', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
120
+ 'url' => admin_url( 'admin.php?page=mlang' ),
121
+ 'icon' => 'comments',
122
+ 'keywords' => [ 'polylang', 'languages', 'setup', 'flags', 'country', 'countries' ],
123
+ 'description' => __( 'All languages your website appears in', 'connect-polylang-elementor' ),
124
+ ];
125
+
126
+ /** Settings: String translations */
127
+ $items[ 'string-translations' ] = [
128
+ 'title' => $string_polylang . _x( 'String Translations', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
129
+ 'url' => admin_url( 'admin.php?page=mlang_strings' ),
130
+ 'icon' => 'exchange',
131
+ 'keywords' => [ 'polylang', 'translations', 'translate', 'strings' ],
132
+ 'description' => __( 'From Widgets and other website parts', 'connect-polylang-elementor' ),
133
+ ];
134
+
135
+ /** Settings: General, for plugin */
136
+ $items[ 'settings' ] = [
137
+ 'title' => $string_polylang . _x( 'Settings', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
138
+ 'url' => admin_url( 'admin.php?page=mlang_settings' ),
139
+ 'icon' => 'settings',
140
+ 'keywords' => [ 'polylang', 'settings', 'options', 'modules' ],
141
+ 'description' => __( 'Plugin\'s settings, enable/ disable modules', 'connect-polylang-elementor' ),
142
+ ];
143
+
144
+ /** External: documentation */
145
+ $items[ 'documentation' ] = [
146
+ 'title' => $string_polylang . _x( 'Plugin Documentation', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
147
+ 'url' => 'https://polylang.pro/doc/',
148
+ 'icon' => 'info',
149
+ 'keywords' => [ 'help', 'support', 'docs', 'documentation', 'faq', 'knowledge base' ],
150
+ 'description' => __( 'FAQ, Knowledge Base and Documentation', 'connect-polylang-elementor' ),
151
+ 'actions' => [
152
+ [
153
+ 'name' => $action_name,
154
+ 'url' => 'https://polylang.pro/doc/',
155
+ 'icon' => $action_icon,
156
+ ],
157
+ ],
158
+ ];
159
+
160
+ /** External: WordPress.org support forum */
161
+ $items[ 'support-forum' ] = [
162
+ 'title' => $string_polylang . _x( 'Support Forum', 'Title in Elementor Finder', 'connect-polylang-elementor' ),
163
+ 'url' => 'https://wordpress.org/support/plugin/polylang',
164
+ 'icon' => 'comments',
165
+ 'keywords' => [ 'support', 'forum', 'wordpress.org', 'help' ],
166
+ 'description' => __( 'Free support on WordPress.org', 'connect-polylang-elementor' ),
167
+ 'actions' => [
168
+ [
169
+ 'name' => $action_name,
170
+ 'url' => 'https://wordpress.org/support/plugin/polylang',
171
+ 'icon' => $action_icon,
172
+ ],
173
+ ],
174
+ ];
175
+
176
+ /** Return items array, filterable */
177
+ return apply_filters(
178
+ 'cpel/filter/elementor_finder/items/polylang',
179
+ $items
180
+ );
181
+
182
+ } // end method
183
+
184
+ } // end of class
modules/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
modules/widgets/index.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Do not modify the files in this folder.
4
+ */
modules/widgets/polylang-language-switcher.php ADDED
@@ -0,0 +1,741 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/widget/polylang-language-switcher
4
+
5
+ namespace DDW_Connect_Polylang_Elementor\Widgets;
6
+
7
+ use Elementor\Widget_Base;
8
+ use Elementor\Controls_Manager;
9
+ use Elementor\Scheme_Color;
10
+ use Elementor\Scheme_Typography;
11
+ use Elementor\Group_Control_Border;
12
+ use Elementor\Group_Control_Typography;
13
+
14
+
15
+ /**
16
+ * Prevent direct access to this file.
17
+ *
18
+ * @since 1.0.0
19
+ */
20
+ if ( ! defined( 'ABSPATH' ) ) {
21
+ exit( 'Sorry, you are not allowed to access this file directly.' );
22
+ }
23
+
24
+
25
+ /**
26
+ * Polylang Switcher
27
+ *
28
+ * Elementor widget for Polylang Language Switcher.
29
+ *
30
+ * Note: Code based on Widget class of plugin "Language Switcher for Elementor",
31
+ * licensed under GPLv2 or later.
32
+ * @author Solitweb
33
+ * @link https://solitweb.be/
34
+ *
35
+ * @since 1.0.0
36
+ */
37
+ class Polylang_Language_Switcher extends Widget_Base {
38
+
39
+ /**
40
+ * Retrieve the widget name.
41
+ *
42
+ * @since 1.0.0
43
+ *
44
+ * @access public
45
+ *
46
+ * @return string Widget name.
47
+ */
48
+ public function get_name() {
49
+
50
+ return 'polylang-language-switcher';
51
+
52
+ } // end method
53
+
54
+
55
+ /**
56
+ * Retrieve the widget title.
57
+ *
58
+ * @since 1.0.0
59
+ *
60
+ * @access public
61
+ *
62
+ * @return string Widget title.
63
+ */
64
+ public function get_title() {
65
+
66
+ return _x( 'Polylang Switcher', 'Elementor widget title', 'connect-polylang-elementor' );
67
+
68
+ } // end method
69
+
70
+
71
+ /**
72
+ * Retrieve the widget icon.
73
+ *
74
+ * @since 1.0.0
75
+ *
76
+ * @access public
77
+ *
78
+ * @return string Widget icon.
79
+ */
80
+ public function get_icon() {
81
+
82
+ return 'fa fa-language';
83
+
84
+ } // end method
85
+
86
+
87
+ /**
88
+ * Retrieve the list of categories the widget belongs to.
89
+ *
90
+ * Used to determine where to display the widget in the editor.
91
+ *
92
+ * Note that currently Elementor supports only one category.
93
+ * When multiple categories passed, Elementor uses the first one.
94
+ *
95
+ * @since 1.0.0
96
+ *
97
+ * @access public
98
+ *
99
+ * @return array Widget categories.
100
+ */
101
+ public function get_categories() {
102
+
103
+ return [ 'general', 'theme-elements' ];
104
+
105
+ } // end method
106
+
107
+
108
+ /**
109
+ * Set keywords for widgets search.
110
+ *
111
+ * @since 1.0.0
112
+ */
113
+ public function get_keywords() {
114
+
115
+ return [ 'languages', 'switcher', 'polylang', 'multilingual', 'flags', 'countries', 'country', 'wpml' ];
116
+
117
+ } // end method
118
+
119
+
120
+ /**
121
+ * Retrieve the list of styles the widget depended on.
122
+ *
123
+ * Used to set styles dependencies required to run the widget.
124
+ *
125
+ * @since 1.0.0
126
+ *
127
+ * @access public
128
+ *
129
+ * @return array Widget styles dependencies.
130
+ */
131
+ public function get_style_depends() {
132
+
133
+ return [ 'plsfe-frontend' ];
134
+
135
+ } // end method
136
+
137
+
138
+ /**
139
+ * Retrieve the list of scripts the widget depended on.
140
+ *
141
+ * Used to set scripts dependencies required to run the widget.
142
+ *
143
+ * @since 1.0.0
144
+ *
145
+ * @access public
146
+ *
147
+ * @return array Widget scripts dependencies.
148
+ */
149
+ public function get_script_depends() {
150
+
151
+ return [ ];
152
+
153
+ } // end method
154
+
155
+
156
+ /**
157
+ * Register the widget controls.
158
+ *
159
+ * Adds different input fields to allow the user to change and customize the
160
+ * widget settings.
161
+ *
162
+ * @since 1.0.0
163
+ *
164
+ * @access protected
165
+ *
166
+ * @uses pll_the_languages()
167
+ */
168
+ protected function _register_controls() {
169
+
170
+ /** Content: Layout etc. */
171
+ $this->start_controls_section(
172
+ 'section_content',
173
+ [
174
+ 'label' => __( 'Content', 'connect-polylang-elementor' ),
175
+ ]
176
+ );
177
+
178
+ $this->add_responsive_control(
179
+ 'layout',
180
+ [
181
+ 'label' => __( 'Layout', 'connect-polylang-elementor' ),
182
+ 'type' => Controls_Manager::SELECT,
183
+ 'default' => 'horizontal',
184
+ 'options' => [
185
+ 'horizontal' => __( 'Horizontal', 'connect-polylang-elementor' ),
186
+ 'vertical' => __( 'Vertical', 'connect-polylang-elementor' ),
187
+ ],
188
+ 'label_block' => true,
189
+ 'prefix_class' => 'plsfe%s-layout-',
190
+ ]
191
+ );
192
+
193
+ $this->add_responsive_control(
194
+ 'align_items',
195
+ [
196
+ 'label' => __( 'Align', 'connect-polylang-elementor' ),
197
+ 'type' => Controls_Manager::CHOOSE,
198
+ 'options' => [
199
+ 'left' => [
200
+ 'title' => __( 'Left', 'connect-polylang-elementor' ),
201
+ 'icon' => 'eicon-h-align-left',
202
+ ],
203
+ 'center' => [
204
+ 'title' => __( 'Center', 'connect-polylang-elementor' ),
205
+ 'icon' => 'eicon-h-align-center',
206
+ ],
207
+ 'right' => [
208
+ 'title' => __( 'Right', 'connect-polylang-elementor' ),
209
+ 'icon' => 'eicon-h-align-right',
210
+ ],
211
+ 'justify' => [
212
+ 'title' => __( 'Stretch', 'connect-polylang-elementor' ),
213
+ 'icon' => 'eicon-h-align-stretch',
214
+ ],
215
+ ],
216
+ 'label_block' => true,
217
+ 'prefix_class' => 'plsfe%s-align-',
218
+ ]
219
+ );
220
+
221
+ $this->add_control(
222
+ 'hide_current',
223
+ [
224
+ 'label' => __( 'Hide the current language', 'connect-polylang-elementor' ),
225
+ 'type' => Controls_Manager::SWITCHER,
226
+ 'return_value' => 'yes',
227
+ 'default' => '',
228
+ 'separator' => 'before',
229
+ ]
230
+ );
231
+
232
+ $this->add_control(
233
+ 'hide_missing',
234
+ [
235
+ 'label' => __( 'Hide languages with no translation', 'connect-polylang-elementor' ),
236
+ 'type' => Controls_Manager::SWITCHER,
237
+ 'return_value' => 'yes',
238
+ 'default' => '',
239
+ ]
240
+ );
241
+
242
+ $this->add_control(
243
+ 'show_country_flag',
244
+ [
245
+ 'label' => __( 'Show Country Flag', 'connect-polylang-elementor' ),
246
+ 'type' => Controls_Manager::SWITCHER,
247
+ 'return_value' => 'yes',
248
+ 'default' => 'yes',
249
+ ]
250
+ );
251
+
252
+ $this->add_control(
253
+ 'show_language_name',
254
+ [
255
+ 'label' => __( 'Show Language Name', 'connect-polylang-elementor' ),
256
+ 'type' => Controls_Manager::SWITCHER,
257
+ 'return_value' => 'yes',
258
+ 'default' => 'yes',
259
+ ]
260
+ );
261
+
262
+ $this->add_control(
263
+ 'show_language_code',
264
+ [
265
+ 'label' => __( 'Show Language Code', 'connect-polylang-elementor' ),
266
+ 'type' => Controls_Manager::SWITCHER,
267
+ 'return_value' => 'yes',
268
+ 'default' => '',
269
+ ]
270
+ );
271
+
272
+ /** Create language drop-down for the select control */
273
+ $languages = pll_the_languages( array( 'raw' => 1 ) );
274
+ $dropdown = [];
275
+
276
+ foreach ( $languages as $language ) {
277
+ $dropdown[ $language[ 'slug' ] ] = $language[ 'name' ];
278
+ }
279
+
280
+ $first_key[ 'all' ] = __( 'All languages', 'connect-polylang-elementor' );
281
+
282
+ $dropdown = array_merge( $first_key, $dropdown );
283
+
284
+ $this->add_control(
285
+ 'plsfe_widget_display',
286
+ [
287
+ 'label' => __( 'Display widget for:', 'connect-polylang-elementor' ),
288
+ 'type' => Controls_Manager::SELECT,
289
+ 'default' => 'all',
290
+ 'options' => $dropdown,
291
+ ]
292
+ );
293
+
294
+ $this->end_controls_section();
295
+
296
+
297
+ /** Style: Main menu */
298
+ $this->start_controls_section(
299
+ 'main_section',
300
+ [
301
+ 'label' => __( 'Main Menu', 'connect-polylang-elementor' ),
302
+ 'tab' => Controls_Manager::TAB_STYLE,
303
+ ]
304
+ );
305
+
306
+ $this->start_controls_tabs( 'tabs_menu_item_style' );
307
+
308
+ $this->start_controls_tab(
309
+ 'tab_menu_item_normal',
310
+ [
311
+ 'label' => __( 'Normal', 'connect-polylang-elementor' ),
312
+ ]
313
+ );
314
+
315
+ $this->add_group_control(
316
+ Group_Control_Typography::get_type(),
317
+ [
318
+ 'name' => 'typography_menu_item',
319
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
320
+ 'selector' => '{{WRAPPER}} .plsfe-menu .plsfe-item',
321
+ ]
322
+ );
323
+
324
+ $this->add_control(
325
+ 'color_menu_item',
326
+ [
327
+ 'label' => __( 'Text Color', 'connect-polylang-elementor' ),
328
+ 'type' => Controls_Manager::COLOR,
329
+ 'scheme' => [
330
+ 'type' => Scheme_Color::get_type(),
331
+ 'value' => Scheme_Color::COLOR_3,
332
+ ],
333
+ 'default' => '',
334
+ 'selectors' => [
335
+ '{{WRAPPER}} .plsfe-menu .plsfe-item' => 'color: {{VALUE}}',
336
+ ],
337
+ ]
338
+ );
339
+
340
+ $this->end_controls_tab();
341
+
342
+ $this->start_controls_tab(
343
+ 'tab_menu_item_hover',
344
+ [
345
+ 'label' => __( 'Hover', 'connect-polylang-elementor' ),
346
+ ]
347
+ );
348
+
349
+ $this->add_group_control(
350
+ Group_Control_Typography::get_type(),
351
+ [
352
+ 'name' => 'typography_menu_item_hover',
353
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
354
+ 'selector' => '{{WRAPPER}} .plsfe-menu .plsfe-item:hover,
355
+ {{WRAPPER}} .plsfe-menu .plsfe-item.plsfe-item__active,
356
+ {{WRAPPER}} .plsfe-menu .plsfe-item.highlighted,
357
+ {{WRAPPER}} .plsfe-menu .plsfe-item:focus',
358
+ ]
359
+ );
360
+
361
+ $this->add_control(
362
+ 'color_menu_item_hover',
363
+ [
364
+ 'label' => __( 'Text Color', 'connect-polylang-elementor' ),
365
+ 'type' => Controls_Manager::COLOR,
366
+ 'scheme' => [
367
+ 'type' => Scheme_Color::get_type(),
368
+ 'value' => Scheme_Color::COLOR_4,
369
+ ],
370
+ 'selectors' => [
371
+ '{{WRAPPER}} .plsfe-menu .plsfe-item:hover,
372
+ {{WRAPPER}} .plsfe-menu .plsfe-item.highlighted,
373
+ {{WRAPPER}} .plsfe-menu .plsfe-item:focus' => 'color: {{VALUE}}',
374
+ ],
375
+ ]
376
+ );
377
+
378
+ $this->end_controls_tab();
379
+
380
+ $this->start_controls_tab(
381
+ 'tab_menu_item_active',
382
+ [
383
+ 'label' => __( 'Active', 'connect-polylang-elementor' ),
384
+ ]
385
+ );
386
+
387
+ $this->add_control(
388
+ 'info_menu_item_active',
389
+ [
390
+ 'type' => Controls_Manager::RAW_HTML,
391
+ 'raw' => __( 'This controls the item in the Switcher for the current active language', 'connect-polylang-elementor' ),
392
+ 'content_classes' => 'elementor-control-field-description cpel-info-menu-item-active',
393
+ ]
394
+ );
395
+
396
+ $this->add_group_control(
397
+ Group_Control_Typography::get_type(),
398
+ [
399
+ 'name' => 'typography_menu_item_active',
400
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
401
+ 'selector' => '{{WRAPPER}} .plsfe-menu .plsfe-item.plsfe-item__active',
402
+ ]
403
+ );
404
+
405
+ $this->add_control(
406
+ 'color_menu_item_active',
407
+ [
408
+ 'label' => __( 'Text Color', 'connect-polylang-elementor' ),
409
+ 'type' => Controls_Manager::COLOR,
410
+ 'default' => '',
411
+ 'selectors' => [
412
+ '{{WRAPPER}} .plsfe-menu .plsfe-item.plsfe-item__active' => 'color: {{VALUE}}',
413
+ ],
414
+ ]
415
+ );
416
+
417
+ $this->add_control(
418
+ 'color_menu_item_active_hover',
419
+ [
420
+ 'label' => __( 'Text Hover Color', 'connect-polylang-elementor' ),
421
+ 'type' => Controls_Manager::COLOR,
422
+ 'default' => '',
423
+ 'selectors' => [
424
+ '{{WRAPPER}} .plsfe-menu .plsfe-item.plsfe-item__active:hover' => 'color: {{VALUE}}',
425
+ ],
426
+ ]
427
+ );
428
+
429
+ $this->end_controls_tab();
430
+
431
+ $this->end_controls_tabs();
432
+
433
+ $this->add_responsive_control(
434
+ 'padding_horizontal_menu_item',
435
+ [
436
+ 'label' => __( 'Horizontal Padding', 'connect-polylang-elementor' ),
437
+ 'type' => Controls_Manager::SLIDER,
438
+ 'range' => [
439
+ 'px' => [
440
+ 'max' => 50,
441
+ ],
442
+ ],
443
+ 'separator' => 'before',
444
+ 'selectors' => [
445
+ '{{WRAPPER}} .plsfe-switcher .plsfe-item' => 'padding-left: {{SIZE}}{{UNIT}}; padding-right: {{SIZE}}{{UNIT}}',
446
+ ],
447
+ ]
448
+ );
449
+
450
+ $this->add_responsive_control(
451
+ 'padding_vertical_menu_item',
452
+ [
453
+ 'label' => __( 'Vertical Padding', 'connect-polylang-elementor' ),
454
+ 'type' => Controls_Manager::SLIDER,
455
+ 'range' => [
456
+ 'px' => [
457
+ 'max' => 50,
458
+ ],
459
+ ],
460
+ 'selectors' => [
461
+ '{{WRAPPER}} .plsfe-switcher .plsfe-item' => 'padding-top: {{SIZE}}{{UNIT}}; padding-bottom: {{SIZE}}{{UNIT}}',
462
+ ],
463
+ ]
464
+ );
465
+
466
+ $this->add_responsive_control(
467
+ 'menu_space_between',
468
+ [
469
+ 'label' => __( 'Space Between', 'connect-polylang-elementor' ),
470
+ 'type' => Controls_Manager::SLIDER,
471
+ 'range' => [
472
+ 'px' => [
473
+ 'max' => 100,
474
+ ],
475
+ ],
476
+ 'selectors' => [
477
+ 'body:not(.rtl) {{WRAPPER}}.plsfe-layout-horizontal:not(.plsfe-layout-vertical) .plsfe-menu > li:not(:last-child)' => 'margin-right: {{SIZE}}{{UNIT}}',
478
+ 'body.rtl {{WRAPPER}}.plsfe-layout-horizontal:not(.plsfe-layout-vertical) .plsfe-menu > li:not(:last-child)' => 'margin-left: {{SIZE}}{{UNIT}}',
479
+ '{{WRAPPER}}.plsfe-layout-vertical:not(.plsfe-layout-horizontal) .plsfe-menu > li:not(:last-child)' => 'margin-bottom: {{SIZE}}{{UNIT}}',
480
+ ],
481
+ ]
482
+ );
483
+
484
+ $this->add_group_control(
485
+ Group_Control_Border::get_type(),
486
+ [
487
+ 'name' => 'menu_item_border',
488
+ 'selector' => '{{WRAPPER}} .plsfe-menu > li',
489
+ 'separator' => 'before',
490
+ ]
491
+ );
492
+
493
+ $this->end_controls_section();
494
+
495
+
496
+ /** Style: Language flag */
497
+ $this->start_controls_section(
498
+ 'country_flag_section',
499
+ [
500
+ 'label' => __( 'Country Flag', 'connect-polylang-elementor' ),
501
+ 'tab' => Controls_Manager::TAB_STYLE,
502
+ 'condition' => [
503
+ 'show_country_flag' => [ 'yes' ],
504
+ ],
505
+ ]
506
+ );
507
+
508
+ $this->add_control(
509
+ 'margin_country_flag',
510
+ [
511
+ 'label' => __( 'Margin', 'connect-polylang-elementor' ),
512
+ 'type' => Controls_Manager::DIMENSIONS,
513
+ 'size_units' => [ 'px', '%', 'em' ],
514
+ 'selectors' => [
515
+ '{{WRAPPER}} .plsfe-switcher .plsfe-country-flag' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
516
+ ],
517
+ ]
518
+ );
519
+
520
+ $this->end_controls_section();
521
+
522
+
523
+ /** Style: Language name */
524
+ $this->start_controls_section(
525
+ 'language_name_section',
526
+ [
527
+ 'label' => __( 'Language Name', 'connect-polylang-elementor' ),
528
+ 'tab' => Controls_Manager::TAB_STYLE,
529
+ 'condition' => [
530
+ 'show_language_name' => [ 'yes' ],
531
+ ],
532
+ ]
533
+ );
534
+
535
+ $this->add_control(
536
+ 'uppercase_language_name',
537
+ [
538
+ 'label' => __( 'Uppercase', 'connect-polylang-elementor' ),
539
+ 'type' => Controls_Manager::SWITCHER,
540
+ 'return_value' => 'yes',
541
+ 'default' => '',
542
+ ]
543
+ );
544
+
545
+ $this->add_control(
546
+ 'margin_language_name',
547
+ [
548
+ 'label' => __( 'Margin', 'connect-polylang-elementor' ),
549
+ 'type' => Controls_Manager::DIMENSIONS,
550
+ 'size_units' => [ 'px', '%', 'em' ],
551
+ 'selectors' => [
552
+ '{{WRAPPER}} .plsfe-switcher .plsfe-language-name' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
553
+ ],
554
+ ]
555
+ );
556
+
557
+ $this->end_controls_section();
558
+
559
+
560
+ /** Style: Language code */
561
+ $this->start_controls_section(
562
+ 'language_code_section',
563
+ [
564
+ 'label' => __( 'Language Code', 'connect-polylang-elementor' ),
565
+ 'tab' => Controls_Manager::TAB_STYLE,
566
+ 'condition' => [
567
+ 'show_language_code' => [ 'yes' ],
568
+ ],
569
+ ]
570
+ );
571
+
572
+ $this->add_control(
573
+ 'uppercase_language_code',
574
+ [
575
+ 'label' => __( 'Uppercase', 'connect-polylang-elementor' ),
576
+ 'type' => Controls_Manager::SWITCHER,
577
+ 'return_value' => 'yes',
578
+ 'default' => 'yes',
579
+ ]
580
+ );
581
+
582
+ $this->add_control(
583
+ 'margin_language_code',
584
+ [
585
+ 'label' => __( 'Margin', 'connect-polylang-elementor' ),
586
+ 'type' => Controls_Manager::DIMENSIONS,
587
+ 'size_units' => [ 'px', '%', 'em' ],
588
+ 'selectors' => [
589
+ '{{WRAPPER}} .plsfe-switcher .plsfe-language-code' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
590
+ ],
591
+ ]
592
+ );
593
+
594
+ $this->add_control(
595
+ 'before_language_code',
596
+ [
597
+ 'label' => __( 'Text before', 'connect-polylang-elementor' ),
598
+ 'type' => Controls_Manager::TEXT,
599
+ ]
600
+ );
601
+
602
+ $this->add_control(
603
+ 'after_language_code',
604
+ [
605
+ 'label' => __( 'Text after', 'connect-polylang-elementor' ),
606
+ 'type' => Controls_Manager::TEXT,
607
+ ]
608
+ );
609
+
610
+ $this->end_controls_section();
611
+
612
+
613
+ /** Help information - user guidance */
614
+ $this->start_controls_section(
615
+ 'section_helpful_info',
616
+ [
617
+ 'label' => __( 'Helpful Information', 'connect-polylang-elementor' ),
618
+ ]
619
+ );
620
+
621
+ $output = '<div style="line-height: 1.2;">';
622
+ $output .= sprintf(
623
+ '<p style="margin-bottom: 15px;"><strong>%1$s:</strong><br />%2$s</p>',
624
+ __( 'Country Flags', 'connect-polylang-elementor' ),
625
+ sprintf(
626
+ /* translators: %1$s - <code>16px</code> (width 16px) / %2$s - <code>11px</code> (height 11px) */
627
+ __( 'Country flags are by default used from Polylang plugin and have the static size of %1$s wide and %2$s high.', 'connect-polylang-elementor' ),
628
+ '<code>16px</code>',
629
+ '<code>11px</code>'
630
+ )
631
+ );
632
+ $output .= sprintf(
633
+ '<p><strong>%1$s &rarr; %2$s &rarr; %3$s:</strong><br />%4$s</p>',
634
+ __( 'Style', 'connect-polylang-elementor' ),
635
+ __( 'Main Menu', 'connect-polylang-elementor' ),
636
+ __( 'Tab: "Active"', 'connect-polylang-elementor' ),
637
+ __( 'This marks the language of currently viewed content - on the frontend. In Elementor Editor Panel this could be different.', 'connect-polylang-elementor' )
638
+ );
639
+ $output .= '</div>';
640
+
641
+ $this->add_control(
642
+ 'plsfe_help_info',
643
+ [
644
+ 'type' => Controls_Manager::RAW_HTML,
645
+ 'raw' => $output,
646
+ 'content_classes' => 'cpel-help-info',
647
+ ]
648
+ );
649
+
650
+ $this->end_controls_section();
651
+
652
+ } // end method
653
+
654
+
655
+ /**
656
+ * Render the widget output on the frontend.
657
+ *
658
+ * Written in PHP and used to generate the final HTML.
659
+ *
660
+ * @since 1.0.0
661
+ *
662
+ * @access protected
663
+ *
664
+ * @uses pll_the_languages() Holds Polylang languages for switcher.
665
+ */
666
+ protected function render() {
667
+
668
+ /** Get the widget settings */
669
+ $settings = $this->get_active_settings();
670
+
671
+ /** Add render attributes for Elementor */
672
+ $this->add_render_attribute( 'main-menu', 'class', [
673
+ 'plsfe-switcher',
674
+ ] );
675
+
676
+ /** Get the available languages for a switcher */
677
+ $languages = pll_the_languages( array( 'raw' => 1 ) );
678
+
679
+ /** If there are language - render output */
680
+ if ( ! empty( $languages ) ) {
681
+
682
+ echo '<nav ' . $this->get_render_attribute_string( 'main-menu' ) . '><ul class="plsfe-menu">';
683
+
684
+ /** Loop through all languages */
685
+ foreach ( $languages as $language ) {
686
+
687
+ /** Optional: Hide the current language */
688
+ if ( 'yes' === $settings[ 'hide_current' ] && $language[ 'current_lang' ] ) {
689
+ continue;
690
+ }
691
+
692
+ /** Optional: Hide languages that have no translations available */
693
+ if ( 'yes' === $settings[ 'hide_missing' ] && $language[ 'no_translation' ] ) {
694
+ continue;
695
+ }
696
+
697
+ /** Language code: uppercase/ lowercase logic */
698
+ $language_code = ( 'yes' === $settings[ 'uppercase_language_code' ] ) ? strtoupper( $language[ 'slug' ] ) : strtolower( $language[ 'slug' ] );
699
+
700
+ /** Language name: uppercase/ lowercase logic */
701
+ $language_name = ( 'yes' === $settings[ 'uppercase_language_name' ] ) ? strtoupper( $language[ 'name' ] ) : $language[ 'name' ];
702
+
703
+ /** Build the language switcher menu output */
704
+ echo '<li class="plsfe-menu-item">';
705
+
706
+ echo ( $language[ 'current_lang' ] ) ? '<a href="' . $language[ 'url' ] . '" class="plsfe-item plsfe-item__active">' : '<a href="' . $language[ 'url' ] . '" class="plsfe-item">';
707
+
708
+ echo $settings[ 'show_country_flag' ] ? '<span class="plsfe-country-flag"><img src="' . $language[ 'flag' ] . '" alt="' . $language_code . '" width="16" height="11" /></span>' : '';
709
+
710
+ echo $settings[ 'show_language_name' ] ? '<span class="plsfe-language-name">' . $language_name . '</span>' : '';
711
+
712
+ echo $settings[ 'before_language_code' ] ?: '';
713
+ echo $settings[ 'show_language_code' ] ? '<span class="plsfe-language-code">' . $language_code . '</span>' : '';
714
+ echo $settings[ 'after_language_code' ] ?: '';
715
+
716
+ echo '</a>';
717
+
718
+ echo '</li>';
719
+
720
+ } // end if
721
+
722
+ echo '</ul></nav>';
723
+
724
+ } // end if
725
+
726
+ } // end method
727
+
728
+
729
+ /**
730
+ * Render the widget output in the editor.
731
+ *
732
+ * Written as a Backbone JavaScript template and used to generate the live
733
+ * preview.
734
+ *
735
+ * @since 1.0.0
736
+ *
737
+ * @access protected
738
+ */
739
+ protected function _content_template() { } // end method
740
+
741
+ } // end of class
modules/widgets/register-widget.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // modules/widget/polylang-language-switcher
4
+
5
+ namespace DDW_Connect_Polylang_Elementor;
6
+
7
+ use DDW_Connect_Polylang_Elementor\Widgets\Polylang_Language_Switcher;
8
+
9
+ /**
10
+ * Prevent direct access to this file.
11
+ *
12
+ * @since 1.0.0
13
+ */
14
+ if ( ! defined( 'ABSPATH' ) ) {
15
+ exit( 'Sorry, you are not allowed to access this file directly.' );
16
+ }
17
+
18
+
19
+ /**
20
+ * Main Plugin Class
21
+ *
22
+ * Register new elementor widget.
23
+ *
24
+ * @since 1.0.0
25
+ */
26
+ class Register_Widget {
27
+
28
+ /**
29
+ * Constructor
30
+ *
31
+ * @since 1.0.0
32
+ *
33
+ * @access public
34
+ */
35
+ public function __construct() {
36
+
37
+ $this->add_actions();
38
+
39
+ } // end method
40
+
41
+
42
+ /**
43
+ * Add Actions
44
+ *
45
+ * @since 1.0.0
46
+ *
47
+ * @access private
48
+ */
49
+ private function add_actions() {
50
+
51
+ add_action( 'elementor/widgets/widgets_registered', [ $this, 'on_widgets_registered' ] );
52
+
53
+ add_action( 'elementor/preview/enqueue_styles', function() {
54
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
55
+
56
+ wp_enqueue_style(
57
+ 'plsfe-editor',
58
+ plugins_url( '/assets/css/plsfe-editor' . $suffix . '.css', CPEL__FILE__ ),
59
+ '',
60
+ CPEL_PLUGIN_VERSION
61
+ );
62
+ } );
63
+
64
+ add_action( 'elementor/frontend/after_enqueue_styles', function() {
65
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
66
+
67
+ wp_register_style(
68
+ 'plsfe-frontend',
69
+ plugins_url( '/assets/css/plsfe-frontend' . $suffix . '.css', CPEL__FILE__ ),
70
+ '',
71
+ CPEL_PLUGIN_VERSION
72
+ );
73
+ } );
74
+
75
+ } // end method
76
+
77
+
78
+ /**
79
+ * On Widgets Registered
80
+ *
81
+ * @since 1.0.0
82
+ *
83
+ * @access public
84
+ */
85
+ public function on_widgets_registered() {
86
+
87
+ $this->includes();
88
+ $this->register_widget();
89
+
90
+ } // end method
91
+
92
+
93
+ /**
94
+ * Includes
95
+ *
96
+ * @since 1.0.0
97
+ *
98
+ * @access private
99
+ */
100
+ private function includes() {
101
+
102
+ require_once( CPEL_PLUGIN_DIR . 'modules/widgets/polylang-language-switcher.php' );
103
+
104
+ } // end method
105
+
106
+
107
+ /**
108
+ * Register Widget
109
+ *
110
+ * @since 1.0.0
111
+ *
112
+ * @access private
113
+ */
114
+ private function register_widget() {
115
+
116
+ \Elementor\Plugin::instance()->widgets_manager->register_widget_type( new Polylang_Language_Switcher() );
117
+
118
+ } // end method
119
+
120
+ } // end of class
readme.txt ADDED
@@ -0,0 +1,299 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Polylang Connect for Elementor - Language Switcher & Template Tweaks ===
2
+ Contributors: daveshine, p4fbradjohnson, deckerweb, wpautobahn
3
+ Donate link: https://www.paypal.me/deckerweb
4
+ Tags: elementor, polylang, multilingual, language switcher, languages, templates, widget, finder, dynamic tags, deckerweb
5
+ Requires at least: 4.7
6
+ Tested up to: 5.3
7
+ Requires PHP: 5.6
8
+ Stable tag: 1.0.1
9
+ License: GPL-2.0-or-later
10
+ License URI: https://opensource.org/licenses/GPL-2.0
11
+
12
+ Connect Polylang with Elementor - show correct Templates, plus Elementor language switcher widget.
13
+
14
+ == Description ==
15
+
16
+ Connect the Polylang multilingual plugin with Elementor Page Builder: This plugin will make Elementor and Polylang **show the correct language templates**, especially with Elementor Pro Theme Builder. Plus: native **Polylang Language Switcher Elementor widget**, new Dynamic Tags, and Polylang links added to the **Elementor Finder** feature.
17
+
18
+ https://www.youtube.com/watch?v=tMmJ6sdMdxw
19
+
20
+ = What the Plugin Does =
21
+ * **Shows the correct Template** (for different languages): Polylang Connect for Elementor allows Polylang to show the correct Elementor template to be displayed on the front end. Before this plugin, Elementor did not show the correct language (translated) template.
22
+ * Beyond enabling the Elementor post type in Polylang settings, plus assigning every post/page/template to a language, no further settings are needed for these template tweaks. It just works out of the box. All the heavy lifting happens under the hood.
23
+ * **Usage Example:**
24
+ * Make a header template in Elementor, set display conditions in Elementor panel, assign this to one language (English for example)
25
+ * Make a second header template in Elementor, set NO display conditions for this one (by assigning 2 of the same display conditions, you can create a conflict in Elementor), but assign to another Polylang language (Portuguese for example), meaning to link those languages/templates in Polylang.
26
+ * Result: when viewing in frontend the proper English content appears with the English header template, translated content in Portuguese appears with the Portuguese header template.
27
+ * Go on: The principle is always the same, now add German language, Spanish and so on ;-)
28
+ * [See **live demo** on co-author's own website](https://mariselaveludo.fashion/) // [Screenshot gallery](https://www.dropbox.com/sh/3i9tuh76etmhl1a/AADm_4L_aesp8Q9ss5NXuSiMa?dl=0)
29
+
30
+ = Plus: Even More Features =
31
+ * **Polylang Language Switcher Widget**: A native Elementor Widget to easily build a nice language switcher menu and have **more styling options** for non-coders at hand
32
+ * **Elementor Finder integration**: Adds Polylang languages, admin settings links, plus support resources as quick jump links to the Elementor Finder feature (Elementor v2.3.0+) - so you can navigate more quickly from whereever you are
33
+ * **Dynamic Tags** in Elementor Pro: Polylang Language Names (all registered/active) / Current Language Name / Current Language Code / Current Language Flag (image) / Current Language URL
34
+
35
+ = Further Plugin Info =
36
+ * More features might be added in the future.
37
+ * Community collaboration between David Decker and Brad Johnson, and more code coming from the Elementor/ Polylang community
38
+ * Plugin website: [https://polyglotwp.com](https://polyglotwp.com "PolyGlotWP.com - Multilingual WordPress Websites with Polylang and Elementor") - please sign up for our newsletter
39
+
40
+ = Where to Get Support? =
41
+ * [**Polylang User Community Group at Facebook**](https://www.facebook.com/groups/polylang.users/) - highly recommended for all users of this plugin!
42
+ * We monitor [the plugin's support forum](https://wordpress.org/support/plugin/connect-polylang-elementor) here on WordPress.org as well - but our preferred support channel is the FB community group
43
+ * **What is covered by our support?** - All regarding THIS plugin ("Polyang Connect for Elementor"), plus the relation to *Polylang*, *Elementor* and *Elementor Pro* of course.
44
+ * **What is NOT covered by support?** - Anything general regarding multilingual topics and WordPress. Explicitely we **DO NOT** offer any "WPML", "WPBakery" or "Visual Composer" support, and also not for your theme etc.!!!
45
+
46
+ = Translations =
47
+ * English (default, `en_US`) - always included
48
+ * German (`de_DE`) - always included
49
+ * German formal (`de_DE_formal`) - always included
50
+ * `.pot` file (`connect-polylang-elementor.pot`) for translators is also always included :)
51
+ * Easy plugin translation platform with GlotPress tool: [Translate "Polylang Connect for Elementor"...](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
52
+
53
+ = Feedback =
54
+ * I am open for your suggestions and feedback - Thank you for using or trying out one of my plugins!
55
+ * Join our [**Facebook User Community Support Group**](https://www.facebook.com/groups/deckerweb.wordpress.plugins/)
56
+
57
+ = My Other Plugins =
58
+ * [**Toolbar Extras for Elementor - WordPress Admin Bar Enhanced**](https://wordpress.org/plugins/connect-polylang-elementor/)
59
+ * [**Toolbar Extras for Oxygen Builder - Add-On plugin**](https://wordpress.org/plugins/toolbar-extras-oxygen/)
60
+ * [**Toolbar Extras for MainWP Dashboard - Add-On plugin**](https://wordpress.org/plugins/toolbar-extras-mainwp/)
61
+ * [**Toolbar Extras for Give Donations (GiveWP) - Add-On plugin**](https://wordpress.org/plugins/toolbar-extras-givewp/)
62
+ * [**Builder Shortcode Extras – WordPress Shortcodes Collection to Save You Time**](https://wordpress.org/plugins/builder-shortcode-extras/)
63
+ * [**Builder Template Categories - for WordPress Page Builders**](https://wordpress.org/plugins/builder-template-categories/)
64
+ * [**Simple Download Manager for WP Document Revisions**](https://wordpress.org/plugins/wpdr-simple-downloads/)
65
+ * [Genesis What's New Info](https://wordpress.org/plugins/genesis-whats-new-info/)
66
+ * [Genesis Layout Extras](https://wordpress.org/plugins/genesis-layout-extras/)
67
+ * [Genesis Widgetized Not Found & 404](https://wordpress.org/plugins/genesis-widgetized-notfound/)
68
+ * [Genesis Extra Settings Transporter](https://wordpress.org/plugins/genesis-extra-settings-transporter/)
69
+ * [Genesis Widgetized Footer](https://wordpress.org/plugins/genesis-widgetized-footer/)
70
+ * [Genesis Widgetized Archive](https://wordpress.org/plugins/genesis-widgetized-archive/)
71
+ * [Multisite Toolbar Additions](https://wordpress.org/plugins/multisite-toolbar-additions/)
72
+ * [Cleaner Plugin Installer](https://wordpress.org/plugins/cleaner-plugin-installer/)
73
+ * [*My plugins newsletter*](https://eepurl.com/gbAUUn)
74
+
75
+
76
+ == Installation ==
77
+
78
+ = Minimum Requirements =
79
+
80
+ * WordPress version 4.7 or higher
81
+ * [Elementor](https://wordpress.org/plugins/elementor/) and [Polylang](https://wordpress.org/plugins/polylang/) plugins - free versions from WordPress.org Plugin Directory
82
+ * **Optional:** *Elementor Pro* which is needed for Theme Building possibilities (Header templates etc.). This is a paid premium product by Elementor LTD, [available via elementor.com](https://toolbarextras.com/go/elementor-pro/)
83
+ * PHP version 5.6 or higher
84
+ * MySQL version 5.0 or higher
85
+
86
+ = We Recommend Your Host Supports at least: =
87
+
88
+ * PHP version 7.2 or higher
89
+ * MySQL version 5.6 or higher / or MariaDB 10 or higher
90
+
91
+ = Installation =
92
+
93
+ 1. Install using the WordPress built-in Plugin installer (via **Plugins > Add New** - search for `connect polylang elementor`), or extract the ZIP file and drop the contents in the `wp-content/plugins/` directory of your WordPress installation.
94
+ 2. Activate the plugin through the 'Plugins' menu in WordPress.
95
+ 3. Go to **Polylang > Settings > Custom post types and Taxonomies**, enable the "My Templates" post type (Elementor)
96
+ 4. Assign languages to your pages/ posts/ Elementor templates
97
+ 5. For Elementor templates: set display conditions in Elementor for one template only (your main language is recommended) - templates in the other languages will then get loaded via this plugin magically! :)
98
+ 6. Additionally use the native Elementor Widget: Polylang Switcher
99
+
100
+
101
+ == Frequently Asked Questions ==
102
+
103
+ = Where to get support? =
104
+ At best in our [**Polylang User Community Group at Facebook**](https://www.facebook.com/groups/polylang.users/) - highly recommended for all users of this plugin!
105
+
106
+ Additionally, we also monitor [the plugin's support forum](https://wordpress.org/support/plugin/connect-polylang-elementor) here on WordPress.org as well - but our preferred support channel is the FB community group.
107
+
108
+ * **What is covered by our support?** - All things regarding THIS plugin ("Polyang Connect for Elementor"), plus the relation to *Polylang*, *Elementor* and *Elementor Pro* of course.
109
+ * **What is NOT covered by support?** - Anything general regarding multilingual topics and WordPress. Explicitely we **DO NOT** offer any "WPML", "WPBakery" or "Visual Composer" support, and also not for your theme etc.!!!
110
+
111
+
112
+ = Is there a live demo? =
113
+ Yes, there is.
114
+
115
+ [**See live demo on co-author's own website**](https://mariselaveludo.fashion/)
116
+
117
+ [Plus: *bigger* versions of the above screenshots are in this external gallery ;-)](https://www.dropbox.com/sh/3i9tuh76etmhl1a/AADm_4L_aesp8Q9ss5NXuSiMa?dl=0)
118
+
119
+
120
+ = Recommended Workflow? =
121
+
122
+ 1. Setup Polylang at first, add at least TWO languages, one of them make your default language (in Polylang)
123
+ 2. Add content to your default Polylang language - if Polylang asks you to apply existing content to it, you should most likely click "ok" and proceed - it works really fine :)
124
+ 3. After that setup an Elementor Theme Builder template - asign it to your Polylang default language, apply conditions in Elementor
125
+ 4. Next, setup a translation template for the template of 3.) -- asign your second Polylang language, DO NOT apply conditions in Elementor
126
+
127
+
128
+ = Recommended Polylang settings? =
129
+
130
+ If you have issues with proper display of your translated templates, pages, content it is recommended to check your settings:
131
+
132
+ In Polylang Settings at `Languages > Settings > URL Modificatons` set to the following option: "The language is set from the directory name in pretty permalinks" ([see screenshot](https://ps.w.org/connect-polylang-elementor/assets/screenshot-10.png))
133
+
134
+ And in the case, all is working well with your current settings then please do not touch them. The above recommendation can be necessary for some users/ installs but not necessarily for all.
135
+
136
+
137
+ = Will this work with Elementor Popup Builder? =
138
+ It most likely will work totally fine if you follow our recommended workflow (see above). If not, please ask in [our FB user group](https://www.facebook.com/groups/polylang.users/).
139
+
140
+
141
+ = Correct Elementor template does not show up? =
142
+ Every page/ post/ template must be assigned a language for this to work. This is standard Polylang procedure but it should be noted in case "it doesnt work".
143
+
144
+ Also, for Elementor Templates, the post type must be enabled for Polylang support: Go to **Polylang > Settings > Custom post types and Taxonomies**, enable the "My Templates" post type (Elementor).
145
+
146
+
147
+ = Where is the Elementor Widget to be found? =
148
+ It's in the widget category "General Elements". Plus, if Elementor Pro is active and you're editing a template, the widget additionally appears in the "Site" widget category.
149
+
150
+ *Always via search:* When searching for widgets type "polylang" or "languages" and it will show up immediately! ;-)
151
+
152
+
153
+ = Where is the plugin's settings page? =
154
+ This plugin has NO settings page, as it does not need one. All it does works just under the hood. Activate the plugin. Done.
155
+
156
+ (If there will be settings needed in the future, we might add options in later plugin versions.)
157
+
158
+
159
+ = Is Elementor Pro required? =
160
+ Technically, Elementor Pro is not required - but highly recommended, though.
161
+
162
+ Elementor Pro is required for these features of the plugin:
163
+
164
+ * Translating Elementor Theme Builder Templates the version is required, otherwise this will not work.
165
+ * Dynamic Tags, additionally added by the plugin
166
+
167
+ For the other features of the plugin the regular free version of Elementor is sufficient - so the native Elementor language switcher widget will work also that way already ;-)
168
+
169
+
170
+ = Is Polylang Pro supported? =
171
+ Yes, it is! :)
172
+ All features of "Polylang Connect for Elementor" work with both, *Polylang* (free) AND *Polylang Pro* (Premium).
173
+
174
+
175
+ = Are custom flags supported? =
176
+ In general, [custom flags](https://polylang.pro/doc/can-i-use-my-own-flags-for-the-language-switcher/) are supported in the Polylang Switcher Elementor widget and in the Dynamic Tag (Current Language Flag).
177
+ However, the default flags in Polylang are sized `16px` wide and `11px` high, this automatically applies to custom flags - as it is fully handled internally by Polylang.
178
+
179
+ To use a different size for custom flags we are trying to find ways to implement this for Elementor in future versions of this plugin.
180
+
181
+
182
+ = Typography and uppercase settings? =
183
+ In the Polylang Switcher Elementor widget there are typography settings available for the Switcher menu items. These settings are CSS based of course, and applied "globally" to the various states they are for: normal, hover, active (current language). The available toggles for uppercase are done code-wise and therefore have a lower priority - this means the CSS always takes over, if wanted. That way you are most flexible with quick settings (toggles) but have all styling options at hand if needed.
184
+
185
+
186
+ = Is Elementor plugin needed? =
187
+ Yes, it is. Otherwise this connect plugin won't do anything. Elementor is available for free on WordPress.org.
188
+
189
+ The Elementor Pro Add-On plugin is needed for the Theme Builder capabilities (for example Header templates), plus the feature of "Dynamic Tags". So it is highly recommended. But if it is not installed/ activated, the depending features from the connect plugin won't even load. So it is all optional.
190
+
191
+ The language switcher widget only needs Elementor base plugin to work ;-)
192
+
193
+
194
+ = Other recommended plugins for multilingual websites? =
195
+ There are quite a few:
196
+
197
+ * [**Country Flags for Elementor**](https://wordpress.org/plugins/country-flags-for-elementor/) - Native Elementor widget
198
+ * [**Polylang Pro** (Premium)](https://polylang.pro/downloads/polylang-pro/) - The official premium version with more features, plus premium support
199
+ * [**Polylang for WooCommerce** (Premium)](https://polylang.pro/downloads/polylang-for-woocommerce/) - Makes WooCommerce multilingual - official Polylang Add-On
200
+ * [**Lingotek Translation**](https://wordpress.org/plugins/lingotek-translation/) - Native Polylang integration - Lingotek brings convenient cloud-based localization and translation for WordPress
201
+ * [**Integrate Gravity Forms + Polylang**](https://wordpress.org/plugins/integrate-gravity-forms-polylang/) - Add form titles, descriptions, field labels, etc. to Polylang string translations
202
+ * [**WPML to Polylang**](https://wordpress.org/plugins/wpml-to-polylang/) - From the Polylang developer himself
203
+
204
+
205
+ = More info on Translations? =
206
+
207
+ * English - default, always included
208
+ * German (de_DE): Deutsch - immer dabei! :-)
209
+ * For custom and update-safe language files please upload them to `/wp-content/languages/connect-polylang-elementor/` (just create this folder) - This enables you to use fully custom translations that won't be overridden on plugin updates. Also, complete custom English wording is possible with that as well, just use a language file like `connect-polylang-elementor-en_US.mo/.po` to achieve that (for creating one see the following tools).
210
+
211
+ **Easy WordPress.org plugin translation platform with GlotPress platform:** [**Translate "Polylang Connect for Elementor"...**](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
212
+
213
+ *Note:* All my plugins are internationalized/ translateable by default. This is very important for all users worldwide. So please contribute your language to the plugin to make it even more useful. For translating and validating I recommend the awesome ["Poedit Editor"](https://www.poedit.net/), which works fine on Windows, macOS and Linux.
214
+
215
+
216
+ == Screenshots ==
217
+
218
+ 1. Ensure that my templates is ticked in Polylang post types and Taxonomies. Although the plugin will automatically tick this for you 😊
219
+
220
+ 2. Header Template in Elementor showing that they have both been translated
221
+
222
+ 3. Polylang Widget in Elementor under Site
223
+
224
+ 4. Polylang Widget options in Elementor
225
+
226
+ 5. Polylang Widget Styling Options in Elementor
227
+
228
+ 6. Set your primary language display conditions for your primary language
229
+
230
+ 7. DO NOT SET A DISPLAY CONDITION FOR ANY OTHER LANGUAGE ---> Polylang will do this for you. Save without conditions
231
+
232
+ 8. (1/2) Working language header templates on the front end. Styled by the widget. Previously this was not an option in Polylang. (other than editing the menu options) Polylang users could not display language codes but now they can 😉. Thanks to Polylang Connect for Elementor.
233
+
234
+ 9. (2/2) Working language header templates on the front end. Styled by the widget. Previously this was not an option in Polylang. (other than editing the menu options) Polylang users could not display language codes but now they can 😉. Thanks to Polylang Connect for Elementor.
235
+
236
+ 10. Recommended Polylang URL settings if you have issues with translated templates/ templates
237
+
238
+
239
+ == Changelog ==
240
+
241
+ = 1.0.0 - 2018-11-28 =
242
+ * Official public release on WordPress.org
243
+
244
+
245
+ = 0.9.1 - 2018-11-27 =
246
+ * *First Release Candidate (RC) version*
247
+ * New: Automatic enabling of Elementor My Templates post type for Polylang support
248
+ * Tweak: Code improvements throughout
249
+ * Tweak: Inline documentation and PHP doc improvements
250
+
251
+
252
+ = 0.9.0 - 2018-11-26 =
253
+ * *Second beta version*
254
+ * New: More settings for Polylang Switcher widget
255
+ * Tweak: Improved Dynamic Tags additions
256
+ * Tweak: Improved Elementor Finder integration
257
+
258
+
259
+ = 0.8.0 - 2018-11-25 =
260
+ * *First beta version*
261
+ * New: Added native Elementor Widget - Polylang Language Switcher
262
+ * New: Added Dynamic Tags for Polylang (requires Elementor Pro)
263
+
264
+
265
+ = 0.7.0 - 2018-11-24 =
266
+ * *Second alpha version*
267
+ * New: Added Elementor Finder integration for Polylang plugin links and resources
268
+ * New: Make plugin translateable - added German translations
269
+ * New: Added Readme file, plus `composer.json`
270
+ * New: First public alpha release on GitHub
271
+
272
+
273
+ = 0.5.0 - 2018-10-30 =
274
+ * *Plugin idea by Brad*
275
+ * *First alpha version by David*
276
+ * New: Template tweaks work in form of plugin code - coding standards improvements
277
+
278
+
279
+ == Upgrade Notice ==
280
+
281
+ = 1.0.0 =
282
+ Just released into the wild.
283
+
284
+
285
+ == Donate ==
286
+ Enjoy using *Polylang Connect for Elementor*? [**Please consider making a donation**](https://www.paypal.me/deckerweb) to support the project's continued development.
287
+
288
+
289
+ == Credits ==
290
+ Credit where credit is due. The following code/ classes, all licensed under the GPL. Note: Credit is also referenced in the code doc block inline where used.
291
+
292
+ * Polylang Switcher class (Elementor Widget) and its CSS based on widget from plugin "Language Switcher for Elementor" by Solitweb (GPLv2 or later)
293
+
294
+
295
+ == Plugin Links ==
296
+ * [Translations (WP GlotPress Platform)](https://translate.wordpress.org/projects/wp-plugins/connect-polylang-elementor)
297
+ * [User support forums](https://wordpress.org/support/plugin/connect-polylang-elementor)
298
+ * [Polylang Users Facebook Group](https://www.facebook.com/groups/polylang.users/)
299
+ * [DECKERWEB WordPress Plugins Facebook Group](https://www.facebook.com/groups/deckerweb.wordpress.plugins/)