Real Media Library: Media Library Folder & File Manager - Version 4.17.3

Version Description

Download this release

Release Info

Developer devowl
Plugin Icon wp plugin Real Media Library: Media Library Folder & File Manager
Version 4.17.3
Comparing to
See all releases

Version 4.17.3

Files changed (130) hide show
  1. CHANGELOG.md +1979 -0
  2. LICENSE +8 -0
  3. LICENSE_3RD_PARTY_JS.md +3729 -0
  4. LICENSE_3RD_PARTY_PHP.md +71 -0
  5. README.txt +239 -0
  6. inc/Activator.php +186 -0
  7. inc/AdInitiator.php +113 -0
  8. inc/Assets.php +283 -0
  9. inc/Core.php +341 -0
  10. inc/Localization.php +30 -0
  11. inc/Util.php +441 -0
  12. inc/api/IFolder.php +289 -0
  13. inc/api/IFolderActions.php +143 -0
  14. inc/api/IFolderContent.php +149 -0
  15. inc/api/IMetadata.php +68 -0
  16. inc/api/IStructure.php +110 -0
  17. inc/api/IUserSettings.php +68 -0
  18. inc/api/attachment.php +289 -0
  19. inc/api/folders.php +599 -0
  20. inc/api/index.php +3 -0
  21. inc/api/meta.php +228 -0
  22. inc/attachment/CountCache.php +181 -0
  23. inc/attachment/CustomField.php +216 -0
  24. inc/attachment/Filter.php +307 -0
  25. inc/attachment/Permissions.php +103 -0
  26. inc/attachment/Shortcut.php +240 -0
  27. inc/attachment/Structure.php +396 -0
  28. inc/attachment/Upload.php +115 -0
  29. inc/attachment/index.php +5 -0
  30. inc/base/Core.php +28 -0
  31. inc/base/UtilsProvider.php +30 -0
  32. inc/base/index.php +5 -0
  33. inc/base/others/cachebuster-lib.php +13 -0
  34. inc/base/others/cachebuster.php +18 -0
  35. inc/base/others/class-alias.php +29 -0
  36. inc/base/others/fallback-already.php +34 -0
  37. inc/base/others/fallback-php-version.php +24 -0
  38. inc/base/others/fallback-rest-api.php +29 -0
  39. inc/base/others/fallback-wp-version.php +28 -0
  40. inc/base/others/index.php +1 -0
  41. inc/base/others/start.php +41 -0
  42. inc/comp/ExImport.php +298 -0
  43. inc/comp/ExportMediaLibrary.php +200 -0
  44. inc/comp/PageBuilders.php +245 -0
  45. inc/comp/PolyLang.php +140 -0
  46. inc/comp/WPML.php +357 -0
  47. inc/comp/complexquery/ComplexQuery.php +208 -0
  48. inc/comp/complexquery/ResetNames.php +48 -0
  49. inc/comp/complexquery/index.php +5 -0
  50. inc/comp/index.php +5 -0
  51. inc/exception/FolderAlreadyExistsException.php +63 -0
  52. inc/exception/OnlyInProVersionException.php +26 -0
  53. inc/folder/BaseFolder.php +356 -0
  54. inc/folder/CRUD.php +211 -0
  55. inc/folder/Creatable.php +486 -0
  56. inc/folder/Folder.php +52 -0
  57. inc/folder/QueryCount.php +54 -0
  58. inc/folder/Root.php +90 -0
  59. inc/folder/index.php +5 -0
  60. inc/index.php +5 -0
  61. inc/metadata/CommonFolderTrait.php +36 -0
  62. inc/metadata/CommonTrait.php +40 -0
  63. inc/metadata/CoverImage.php +123 -0
  64. inc/metadata/Description.php +69 -0
  65. inc/metadata/Meta.php +189 -0
  66. inc/metadata/index.php +5 -0
  67. inc/order/Sortable.php +107 -0
  68. inc/order/index.php +5 -0
  69. inc/overrides/interfce/IOverrideCore.php +32 -0
  70. inc/overrides/interfce/comp/IOverrideExImport.php +35 -0
  71. inc/overrides/interfce/comp/IOverrideWPML.php +11 -0
  72. inc/overrides/interfce/comp/index.php +5 -0
  73. inc/overrides/interfce/folder/IOverrideCRUD.php +12 -0
  74. inc/overrides/interfce/folder/IOverrideCreatable.php +17 -0
  75. inc/overrides/interfce/folder/index.php +5 -0
  76. inc/overrides/interfce/index.php +5 -0
  77. inc/overrides/interfce/order/IOverrideSortable.php +11 -0
  78. inc/overrides/interfce/order/index.php +5 -0
  79. inc/overrides/interfce/rest/IOverrideFolder.php +30 -0
  80. inc/overrides/interfce/rest/IOverrideService.php +30 -0
  81. inc/overrides/interfce/rest/index.php +5 -0
  82. inc/overrides/interfce/usersettings/IOverrideDefaultFolder.php +16 -0
  83. inc/overrides/interfce/usersettings/index.php +5 -0
  84. inc/overrides/lite/Core.php +30 -0
  85. inc/overrides/lite/comp/ExImport.php +31 -0
  86. inc/overrides/lite/comp/WPML.php +14 -0
  87. inc/overrides/lite/comp/index.php +5 -0
  88. inc/overrides/lite/folder/CRUD.php +15 -0
  89. inc/overrides/lite/folder/Creatable.php +173 -0
  90. inc/overrides/lite/folder/index.php +5 -0
  91. inc/overrides/lite/index.php +5 -0
  92. inc/overrides/lite/order/Sortable.php +55 -0
  93. inc/overrides/lite/order/index.php +5 -0
  94. inc/overrides/lite/rest/Folder.php +28 -0
  95. inc/overrides/lite/rest/Service.php +28 -0
  96. inc/overrides/lite/rest/index.php +5 -0
  97. inc/overrides/lite/usersettings/DefaultFolder.php +18 -0
  98. inc/overrides/lite/usersettings/index.php +5 -0
  99. inc/rest/Attachment.php +177 -0
  100. inc/rest/Folder.php +298 -0
  101. inc/rest/Reset.php +427 -0
  102. inc/rest/Service.php +221 -0
  103. inc/rest/index.php +5 -0
  104. inc/usersettings/AllFilesShortcuts.php +76 -0
  105. inc/usersettings/CommonUserSettingsTrait.php +51 -0
  106. inc/usersettings/DefaultFolder.php +91 -0
  107. inc/usersettings/Demo.php +29 -0
  108. inc/usersettings/InfiniteScrolling.php +73 -0
  109. inc/usersettings/index.php +5 -0
  110. inc/view/FolderShortcode.php +150 -0
  111. inc/view/Gutenberg.php +119 -0
  112. inc/view/Lang.php +248 -0
  113. inc/view/Options.php +187 -0
  114. inc/view/View.php +219 -0
  115. inc/view/index.php +5 -0
  116. index.php +54 -0
  117. languages/real-media-library-da_DK.mo +0 -0
  118. languages/real-media-library-da_DK.po +1276 -0
  119. languages/real-media-library-de_AT.mo +0 -0
  120. languages/real-media-library-de_AT.po +1309 -0
  121. languages/real-media-library-de_CH.mo +0 -0
  122. languages/real-media-library-de_CH.po +1309 -0
  123. languages/real-media-library-de_CH_informal.mo +0 -0
  124. languages/real-media-library-de_CH_informal.po +1309 -0
  125. languages/real-media-library-de_DE.mo +0 -0
  126. languages/real-media-library-de_DE.po +1309 -0
  127. languages/real-media-library-de_DE_formal.mo +0 -0
  128. languages/real-media-library-de_DE_formal.po +1309 -0
  129. languages/real-media-library-es_AR.mo +0 -0
  130. languages/real-media-library-es_AR.po +1187 -0
CHANGELOG.md ADDED
@@ -0,0 +1,1979 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ ## 4.17.3 (2021-11-24)
7
+
8
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
9
+
10
+
11
+
12
+
13
+
14
+ ## 4.17.2 (2021-11-18)
15
+
16
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
17
+
18
+
19
+
20
+
21
+
22
+ ## 4.17.1 (2021-11-11)
23
+
24
+
25
+ ### chore
26
+
27
+ * remove not-finished translations from feature branches to avoid huge ZIP size (CU-1rgn5h3)
28
+
29
+
30
+ ### fix
31
+
32
+ * rerender media dialog toolbar correctly for custom select-photo-types
33
+ * wrong pagination when switching folder in list view (CU-1raujhg)
34
+
35
+
36
+
37
+
38
+
39
+ # 4.17.0 (2021-11-03)
40
+
41
+
42
+ ### feat
43
+
44
+ * translation into Polish (CU-1q2ryjz)
45
+
46
+
47
+
48
+
49
+
50
+ ## 4.16.2 (2021-10-16)
51
+
52
+
53
+ ### fix
54
+
55
+ * in some cases the classic editor could not be switched between Visual and Text (CU-1mrfb8b)
56
+
57
+
58
+
59
+
60
+
61
+ ## 4.16.1 (2021-10-12)
62
+
63
+
64
+ ### fix
65
+
66
+ * compatibility with MySQL 8 (UDF, CU-1kp4nuz)
67
+
68
+
69
+
70
+
71
+
72
+ # 4.16.0 (2021-09-30)
73
+
74
+
75
+ ### build
76
+
77
+ * allow to define allowed locales to make release management possible (CU-1257b2b)
78
+ * copy files for i18n so we can drop override hooks and get performance boost (CU-wtt3hy)
79
+ * remove unnecessary localization files after synchronisation
80
+
81
+
82
+ ### chore
83
+
84
+ * prepare for continuous localization with weblate (CU-f94bdr)
85
+ * refactor texts to use ellipses instead of ... (CU-f94bdr)
86
+ * remove language files from repository (CU-f94bdr)
87
+ * updated Russian translations (CU-10hyfnv)
88
+
89
+
90
+ ### ci
91
+
92
+ * introduce continuous localization (CU-f94bdr)
93
+
94
+
95
+ ### feat
96
+
97
+ * introduce infinite scrolling setting for WP 5.8 and greater (cogwheel symbol in folder toolbar, CU-11tuatt)
98
+ * translation into Hungarian (CU-10hz32c)
99
+
100
+
101
+ ### perf
102
+
103
+ * remove translation overrides in preference of language files (CU-wtt3hy)
104
+
105
+
106
+ ### refactor
107
+
108
+ * grunt-mojito to abstract grunt-continuous-localization package (CU-f94bdr)
109
+ * introduce @devowl-wp/continuous-integration
110
+
111
+
112
+
113
+
114
+
115
+ # 4.15.0 (2021-08-31)
116
+
117
+
118
+ ### feat
119
+
120
+ * translation into Danish (CU-w8ftv5)
121
+
122
+
123
+
124
+
125
+
126
+ ## 4.14.3 (2021-08-20)
127
+
128
+
129
+ ### chore
130
+
131
+ * update PHP dependencies
132
+
133
+
134
+ ### fix
135
+
136
+ * modify composer autoloading to avoid multiple injections (CU-w8kvcq)
137
+
138
+
139
+
140
+
141
+
142
+ ## 4.14.2 (2021-08-12)
143
+
144
+
145
+ ### docs
146
+
147
+ * update readme text about XSS vulnerability (CU-6fczem)
148
+
149
+
150
+ ### fix
151
+
152
+ * author-only XSS vulnerability when creating a folder (CU-6fczem)
153
+
154
+
155
+
156
+
157
+
158
+ ## 4.14.1 (2021-08-10)
159
+
160
+
161
+ ### fix
162
+
163
+ * reorder video and audio playlists (CU-rp1xy2)
164
+
165
+
166
+
167
+
168
+
169
+ # 4.14.0 (2021-08-05)
170
+
171
+
172
+ ### feat
173
+
174
+ * translation into Japanese (CU-pngenk)
175
+
176
+
177
+
178
+
179
+
180
+ ## 4.13.12 (2021-07-16)
181
+
182
+
183
+ ### chore
184
+
185
+ * update compatibility with WordPress 5.8 (CU-n9dfx9)
186
+
187
+
188
+ ### fix
189
+
190
+ * compatibility with WordPress 5.8 (CU-n9dfx9)
191
+
192
+
193
+
194
+
195
+
196
+ ## 4.13.11 (2021-06-05)
197
+
198
+
199
+ ### fix
200
+
201
+ * height of preview image in list table
202
+
203
+
204
+
205
+
206
+
207
+ ## 4.13.10 (2021-05-25)
208
+
209
+
210
+ ### chore
211
+
212
+ * migarte loose mode to compiler assumptions
213
+ * polyfill setimmediate only if needed (CU-jh3czf)
214
+ * revert update of typedoc@0.20.x as it does not support monorepos yet
215
+ * upgrade dependencies to latest minor version
216
+
217
+
218
+ ### ci
219
+
220
+ * move type check to validate stage
221
+
222
+
223
+ ### fix
224
+
225
+ * do not rely on install_plugins capability, instead use activate_plugins so GIT-synced WP instances work too (CU-k599a2)
226
+
227
+
228
+ ### test
229
+
230
+ * make window.fetch stubbable (CU-jh3cza)
231
+
232
+
233
+
234
+
235
+
236
+ ## 4.13.9 (2021-05-14)
237
+
238
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
239
+
240
+
241
+
242
+
243
+
244
+ ## 4.13.8 (2021-05-12)
245
+
246
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
247
+
248
+
249
+
250
+
251
+
252
+ ## 4.13.7 (2021-05-11)
253
+
254
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
255
+
256
+
257
+
258
+
259
+
260
+ ## 4.13.6 (2021-05-11)
261
+
262
+
263
+ ### chore
264
+
265
+ * remove classnames as dependency
266
+
267
+
268
+ ### refactor
269
+
270
+ * create wp-webpack package for WordPress packages and plugins
271
+ * introduce eslint-config package
272
+ * introduce new grunt workspaces package for monolithic usage
273
+ * introduce new package to validate composer licenses and generate disclaimer
274
+ * introduce new package to validate yarn licenses and generate disclaimer
275
+ * introduce new script to run-yarn-children commands
276
+ * move build scripts to proper backend and WP package
277
+ * move jest scripts to proper backend and WP package
278
+ * move PHP Unit bootstrap file to @devowl-wp/utils package
279
+ * move PHPUnit and Cypress scripts to @devowl-wp/utils package
280
+ * move technical doc scripts to proper WP and backend package
281
+ * move WP build process to @devowl-wp/utils
282
+ * move WP i18n scripts to @devowl-wp/utils
283
+ * move WP specific typescript config to @devowl-wp/wp-webpack package
284
+ * remove @devowl-wp/development package
285
+ * split stubs.php to individual plugins' package
286
+
287
+
288
+
289
+
290
+
291
+ ## 4.13.5 (2021-04-27)
292
+
293
+
294
+ ### chore
295
+
296
+ * **release :** publish [ci skip]
297
+
298
+
299
+ ### ci
300
+
301
+ * push plugin artifacts to GitLab Generic Packages registry (CU-hd6ef6)
302
+
303
+
304
+ ### docs
305
+
306
+ * add Medialist to compatibility list in wordpress.org description (CU-c71wbc)
307
+
308
+
309
+ ### fix
310
+
311
+ * compatibility with latest Divi and backend editor (CU-hka4dk)
312
+
313
+
314
+
315
+
316
+
317
+ ## 4.13.4 (2021-03-30)
318
+
319
+
320
+ ### fix
321
+
322
+ * mobile experience when creating posts
323
+
324
+
325
+
326
+
327
+
328
+ ## 4.13.3 (2021-03-23)
329
+
330
+
331
+ ### build
332
+
333
+ * plugin tested for WordPress 5.7 (CU-f4ydk2)
334
+
335
+
336
+ ### docs
337
+
338
+ * improve wordpress.org product description (CU-fk36dn)
339
+
340
+
341
+
342
+
343
+
344
+ ## 4.13.2 (2021-03-10)
345
+
346
+
347
+ ### fix
348
+
349
+ * renaming a folder did work, but no success message (CU-fb02e3)
350
+
351
+
352
+
353
+
354
+
355
+ ## 4.13.1 (2021-03-02)
356
+
357
+
358
+ ### fix
359
+
360
+ * newly folders are not draggable and droppable without page reload
361
+ * newly uploaded media attachments were missing when filtering media items by date due to lack of cache invalidation
362
+ * respect language of newsletter subscriber to assign to correct newsletter (CU-aar8y9)
363
+
364
+
365
+
366
+
367
+
368
+ # 4.13.0 (2021-02-24)
369
+
370
+
371
+ ### chore
372
+
373
+ * rename go-links to new syntax (#en621h)
374
+
375
+
376
+ ### docs
377
+
378
+ * rename test drive to sanbox (#ef26y8)
379
+
380
+
381
+ ### feat
382
+
383
+ * translation intro Croatian (#eq11w3)
384
+
385
+
386
+ ### fix
387
+
388
+ * allow to refresh modal attachments browser e.g. Divi page builder does not do this automatically
389
+ * newly uploaded files are not visible after reopening the folder in Free version (CU-epyvt7)
390
+ * reset folder correctly when reopening a modal dialog
391
+
392
+
393
+
394
+
395
+
396
+ ## 4.12.4 (2021-02-16)
397
+
398
+
399
+ ### docs
400
+
401
+ * correctly generated JSDoc for Real Media Library (CU-e8zuj3)
402
+ * update README to be compatible with Requires at least (CU-df2wb4)
403
+
404
+
405
+ ### fix
406
+
407
+ * compatiblity with Beaver Builder and responsive settings for a block e.g. mobile
408
+
409
+
410
+
411
+
412
+
413
+ ## 4.12.3 (2021-02-05)
414
+
415
+
416
+ ### fix
417
+
418
+ * button 'Set featured image' is not active after direct upload after new PRO features were introduced (#7am682)
419
+
420
+
421
+
422
+
423
+
424
+ ## 4.12.2 (2021-02-02)
425
+
426
+
427
+ ### chore
428
+
429
+ * move default startup folder functionality to PRO features (CU-d6z2u6)
430
+ * removed folder limit of 10 folders, new PRO features (CU-d6z2u6)
431
+
432
+
433
+ ### docs
434
+
435
+ * improved product description for wordpress.org (#d6z2u6)
436
+
437
+
438
+ ### fix
439
+
440
+ * compatibility with Media Library Assistant (CU-d0w8f7)
441
+
442
+
443
+
444
+
445
+
446
+ ## 4.12.1 (2021-01-24)
447
+
448
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
449
+
450
+
451
+
452
+
453
+
454
+ # 4.12.0 (2021-01-20)
455
+
456
+
457
+ ### chore
458
+
459
+ * add new developer function wp_rml_create_p
460
+
461
+
462
+ ### feat
463
+
464
+ * allow to upload complete folder structures (CU-vbf0)
465
+
466
+
467
+ ### fix
468
+
469
+ * used folder icon in advanced upload progress
470
+
471
+
472
+
473
+
474
+
475
+ ## 4.11.6 (2021-01-11)
476
+
477
+
478
+ ### chore
479
+
480
+ * **release :** publish [ci skip]
481
+ * **release :** publish [ci skip]
482
+
483
+
484
+
485
+
486
+
487
+ ## 4.11.5 (2020-12-15)
488
+
489
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
490
+
491
+
492
+
493
+
494
+
495
+ ## 4.11.4 (2020-12-10)
496
+
497
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
498
+
499
+
500
+
501
+
502
+
503
+ ## 4.11.3 (2020-12-09)
504
+
505
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
506
+
507
+
508
+
509
+
510
+
511
+ ## 4.11.2 (2020-12-09)
512
+
513
+
514
+ ### chore
515
+
516
+ * new host for react-aiot git repository (CU-9rq9c7)
517
+ * update to cypress v6 (CU-7gmaxc)
518
+ * update to webpack v5 (CU-4akvz6)
519
+ * updates typings and min. Node.js and Yarn version (CU-9rq9c7)
520
+ * **release :** publish [ci skip]
521
+
522
+
523
+ ### fix
524
+
525
+ * allow to directly drag&drop folder structure without toolbar button (CU-2cfq3f)
526
+ * automatically deactivate lite version when installing pro version (CU-5ymbqn)
527
+
528
+
529
+
530
+
531
+
532
+ ## 4.11.1 (2020-12-01)
533
+
534
+
535
+ ### chore
536
+
537
+ * update dependencies (CU-3cj43t)
538
+ * update major dependencies (CU-3cj43t)
539
+ * update to composer v2 (CU-4akvjg)
540
+ * **release :** publish [ci skip]
541
+
542
+
543
+ ### refactor
544
+
545
+ * enforce explicit-member-accessibility (CU-a6w5bv)
546
+
547
+
548
+
549
+
550
+
551
+ # 4.11.0 (2020-11-24)
552
+
553
+
554
+ ### feat
555
+
556
+ * translation into Persian (CU-ajtpy8)
557
+
558
+
559
+ ### fix
560
+
561
+ * compatibility with upcoming WordPress 5.6 (CU-amzjdz)
562
+ * modify max index length for MySQL 5.6 databases so all database tables get created (CU-agzcrp)
563
+ * update backend german translation
564
+ * update german translation
565
+ * use no-store caching for WP REST API calls to avoid issues with browsers and CloudFlare (CU-agzcrp)
566
+
567
+
568
+
569
+
570
+
571
+ ## 4.10.6 (2020-11-19)
572
+
573
+
574
+ ### fix
575
+
576
+ * lite version does not correctly allow 10 folders when deleting the last one (#aguw79)
577
+
578
+
579
+
580
+
581
+
582
+ ## 4.10.5 (2020-11-18)
583
+
584
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
585
+
586
+
587
+
588
+
589
+
590
+ ## 4.10.4 (2020-11-17)
591
+
592
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
593
+
594
+
595
+
596
+
597
+
598
+ ## 4.10.3 (2020-11-16)
599
+
600
+
601
+ ### chore
602
+
603
+ * add developer action RML/Count/Reset (#aaybrt)
604
+
605
+
606
+ ### fix
607
+
608
+ * reset count cache correctly when WPML is active (#aaybrt)
609
+
610
+
611
+
612
+
613
+
614
+ ## 4.10.2 (2020-11-12)
615
+
616
+
617
+ ### ci
618
+
619
+ * make scripts of individual plugins available in review applications (#a2z8z1)
620
+
621
+
622
+
623
+
624
+
625
+ ## 4.10.1 (2020-11-03)
626
+
627
+
628
+ ### ci
629
+
630
+ * release to new license server (#8wpcr1)
631
+
632
+
633
+ ### fix
634
+
635
+ * correct primary key usage (#9cpg5c)
636
+ * import from FileBird is shown always (#9my9zj)
637
+
638
+
639
+
640
+
641
+
642
+ # 4.10.0 (2020-10-23)
643
+
644
+
645
+ ### docs
646
+
647
+ * mention in the description of wordpress.org all plugins for which import is supported (#9cptx6)
648
+
649
+
650
+ ### feat
651
+
652
+ * route PATCH PaddleIncompleteOrder (#8ywfdu)
653
+
654
+
655
+ ### fix
656
+
657
+ * automatically deactivate import button in settings when successfully (#92w0qk)
658
+ * filebird v4 importer compatiblity (#92w0qk)
659
+
660
+
661
+ ### refactor
662
+
663
+ * use "import type" instead of "import"
664
+
665
+
666
+
667
+
668
+
669
+ ## 4.9.11 (2020-10-16)
670
+
671
+
672
+ ### build
673
+
674
+ * use node modules cache more aggressively in CI (#4akvz6)
675
+
676
+
677
+ ### chore
678
+
679
+ * rename folder name (#94xp4g)
680
+
681
+
682
+ ### fix
683
+
684
+ * isolated mobx store
685
+
686
+
687
+
688
+
689
+
690
+ ## 4.9.10 (2020-10-09)
691
+
692
+
693
+ ### fix
694
+
695
+ * jQuery v3 compatibility (#90wvre)
696
+
697
+
698
+
699
+
700
+
701
+ ## 4.9.9 (2020-10-09)
702
+
703
+
704
+ ### fix
705
+
706
+ * do not show RPM hint in compact media dialog (#90vmh9)
707
+
708
+
709
+
710
+
711
+
712
+ ## 4.9.8 (2020-10-08)
713
+
714
+
715
+ ### chore
716
+
717
+ * **release :** version bump
718
+
719
+
720
+
721
+
722
+
723
+ ## 4.9.7 (2020-09-29)
724
+
725
+
726
+ ### build
727
+
728
+ * backend pot files and JSON generation conflict-resistent (#6utk9n)
729
+
730
+
731
+ ### chore
732
+
733
+ * introduce development package (#6utk9n)
734
+ * move backend files to development package (#6utk9n)
735
+ * move grunt to common package (#6utk9n)
736
+ * move packages to development package (#6utk9n)
737
+ * move some files to development package (#6utk9n)
738
+ * remove grunt task aliases (#6utk9n)
739
+ * update dependencies (#3cj43t)
740
+ * update package.json scripts for each plugin (#6utk9n)
741
+
742
+
743
+
744
+
745
+
746
+ ## 4.9.6 (2020-09-22)
747
+
748
+
749
+ ### fix
750
+
751
+ * import settings (#82rk4n)
752
+ * remove urldecode as it is no longer needed
753
+
754
+
755
+
756
+
757
+
758
+ ## 4.9.5 (2020-08-31)
759
+
760
+
761
+ ### fix
762
+
763
+ * change of software license from GPLv3 to GPLv2 due to Envato Market restrictions (#4ufx38)
764
+
765
+
766
+
767
+
768
+
769
+ ## 4.9.4 (2020-08-26)
770
+
771
+
772
+ ### chore
773
+
774
+ * **release :** publish [ci skip]
775
+
776
+
777
+ ### ci
778
+
779
+ * install container volume with unique name (#7gmuaa)
780
+
781
+
782
+ ### perf
783
+
784
+ * no longer read from slow INFORMATION_SCHEMA (#7cqdzj)
785
+ * remove transients and introduce expire options for better performance (#7cqdzj)
786
+
787
+
788
+
789
+
790
+
791
+ ## 4.9.3 (2020-08-18)
792
+
793
+
794
+ ### fix
795
+
796
+ * upload breaks media library in Create Gallery modal (#7emj1y)
797
+ * use configured default folder also for Add New page (#7ekm25)
798
+ * use correct REST namespace when REST API is corrupt
799
+
800
+
801
+
802
+
803
+
804
+ ## 4.9.2 (2020-08-17)
805
+
806
+
807
+ ### ci
808
+
809
+ * prefer dist in composer install
810
+
811
+
812
+ ### fix
813
+
814
+ * button 'Set featured image' is not active after direct upload (#7am682)
815
+ * media library crashes after direct upload in 'Upload files' view (#7aqy96)
816
+ * media not found when order is applied to folder content (#7arkav)
817
+
818
+
819
+
820
+
821
+
822
+ ## 4.9.1 (2020-08-11)
823
+
824
+
825
+ ### chore
826
+
827
+ * backends for monorepo introduced
828
+
829
+
830
+ ### docs
831
+
832
+ * add Porguese translation in wordpress.org description (#6em9tr)
833
+ * optimize plugin description at wordpress.org (#76tqkz)
834
+
835
+
836
+ ### fix
837
+
838
+ * compatibility with Thrive Quiz Builder (#72kxjk)
839
+ * remove cover image option in Thrive Quiz Builder because it throws errors (#72kxjk)
840
+
841
+
842
+
843
+
844
+
845
+ # 4.9.0 (2020-07-30)
846
+
847
+
848
+ ### docs
849
+
850
+ * optimize plugin description at wordpress.org
851
+ * optimize plugin description at wordpress.org
852
+
853
+
854
+ ### feat
855
+
856
+ * introduce dashboard with assistant (#68k9ny)
857
+ * product instruction video for wordpress.org (#68c3qq)
858
+ * show hint for Real Physical Media in attachment details (#6pmf7g)
859
+ * translation into Portuguese (#6em9tr)
860
+ * translation into Turkish #CU-6mm2jg
861
+ * WordPress 5.5 compatibility (#6gqcm8)
862
+
863
+
864
+ ### fix
865
+
866
+ * compatibility with Export Media Library plugin to download unorganized folder (#6pmb8t)
867
+ * REST API notice in admin dashboard
868
+
869
+
870
+
871
+
872
+
873
+ ## 4.8.7 (2020-07-02)
874
+
875
+
876
+ ### chore
877
+
878
+ * allow to define allowed licenses in root package.json (#68jvq7)
879
+ * update dependencies (#3cj43t)
880
+
881
+
882
+ ### docs
883
+
884
+ * remove ImageSEO from list of compatible plugins
885
+
886
+
887
+ ### test
888
+
889
+ * cypress does not yet support window.fetch (#5whc2c)
890
+
891
+
892
+
893
+
894
+
895
+ ## 4.8.6 (2020-06-17)
896
+
897
+
898
+ ### chore
899
+
900
+ * update plugin updater newsletter text (#6gfghm)
901
+
902
+
903
+ ### docs
904
+
905
+ * add YOOtheme to compatible themes
906
+
907
+
908
+ ### fix
909
+
910
+ * compatibility with YOOTheme page builder (#5yjvm3)
911
+
912
+
913
+
914
+
915
+
916
+ ## 4.8.5 (2020-06-12)
917
+
918
+
919
+ ### chore
920
+
921
+ * i18n update (#5ut991)
922
+
923
+
924
+
925
+
926
+
927
+ ## 4.8.4 (2020-05-27)
928
+
929
+
930
+ ### build
931
+
932
+ * improve plugin build with webpack parallel builds
933
+
934
+
935
+ ### ci
936
+
937
+ * use hot cache and node-gitlab-ci (#54r34g)
938
+
939
+
940
+ ### docs
941
+
942
+ * redirect user documentation to new knowledgebase (#5etfa6)
943
+
944
+
945
+
946
+
947
+
948
+ ## 4.8.3 (2020-05-20)
949
+
950
+
951
+ ### fix
952
+
953
+ * do not enqueue scripts and styles in customize preview
954
+
955
+
956
+
957
+
958
+
959
+ ## 4.8.2 (2020-05-14)
960
+
961
+
962
+ ### docs
963
+
964
+ * broken link to WP/LR Sync in wordpress.org description
965
+
966
+
967
+
968
+
969
+
970
+ ## 4.8.1 (2020-05-14)
971
+
972
+
973
+ ### chore
974
+
975
+ * add developer filter RML/Tree/Parsed
976
+
977
+
978
+ ### docs
979
+
980
+ * add new compatibilities of Real Media Library to 3th-party plugins
981
+
982
+
983
+
984
+
985
+
986
+ # 4.8.0 (2020-05-12)
987
+
988
+
989
+ ### build
990
+
991
+ * cleanup temporary i18n files correctly
992
+
993
+
994
+ ### feat
995
+
996
+ * allow to import from Media Library Folders plugin (#50rduv)
997
+ * last queried folder as default folder (#5pe7y)
998
+ * show all other folders for shortcuts (#2jh476)
999
+
1000
+
1001
+ ### fix
1002
+
1003
+ * avoid flickering at page load (#42ggat)
1004
+ * classic editor does not load shortcode editor (#52kybh)
1005
+ * correctly enqueue dependencies (#52jf92)
1006
+ * import folders from correct level in Media Library Folders (#50rduv)
1007
+ * import taxonomy with special characters (#50rdtv)
1008
+ * shortcut info list has duplicates in some cases
1009
+ * typo (#5pe7y)
1010
+
1011
+
1012
+
1013
+
1014
+
1015
+ ## 4.7.10 (2020-04-27)
1016
+
1017
+
1018
+ ### chore
1019
+
1020
+ * add hook_suffix to enqueue_scripts_and_styles function (#4ujzx0)
1021
+
1022
+
1023
+ ### docs
1024
+
1025
+ * animated Real Media Library logo for wordpress.org
1026
+ * remove inappropriate tags from the description at wordpress.org
1027
+ * update user documentation and redirect to help.devowl.io (#6c9urq)
1028
+
1029
+
1030
+ ### fix
1031
+
1032
+ * console error 'Cannot read property hooks of undefined' (#2j57er)
1033
+ * droppable does no longer work after searching for a folder / category (#4wn81h)
1034
+ * error after renaming an item without changing the name (#4wm93q)
1035
+ * remove Tatsu Page Builder compatibility because it uses outdated libraries, wait for update... (#4ug589)
1036
+
1037
+
1038
+ ### style
1039
+
1040
+ * higher distance between setting groups in folder details (#4aqkwf)
1041
+
1042
+
1043
+ ### test
1044
+
1045
+ * add smoke tests (#4rm5ae)
1046
+ * automatically retry cypress tests (#3rmp6q)
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+ ## 4.7.9 (2020-04-20)
1053
+
1054
+
1055
+ ### fix
1056
+
1057
+ * folder tree not loading in page builders like Elementor and Divi Builder (#4rknyh)
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+ ## 4.7.8 (2020-04-16)
1064
+
1065
+ **Note:** This package (@devowl-wp/real-media-library) has been updated because a dependency, which is also shipped with this package, has changed.
1066
+
1067
+
1068
+
1069
+
1070
+
1071
+ ## 4.7.7 (2020-04-16)
1072
+
1073
+
1074
+ ### build
1075
+
1076
+ * adjust legal information for envato pro version (#46fjk9)
1077
+ * move test namespaces to composer autoload-dev (#4jnk84)
1078
+ * reduce bundle size by ~25% (#4jjq0u)
1079
+ * scope PHP vendor dependencies (#4jnk84)
1080
+
1081
+
1082
+ ### chore
1083
+
1084
+ * create real-ad package to introduce more UX after installing the plugin (#1aewyf)
1085
+ * rename real-ad to real-utils (#4jpg5f)
1086
+ * update to Cypress v4 (#2wee38)
1087
+
1088
+
1089
+ ### ci
1090
+
1091
+ * correctly build i18n frontend files (#4jjq0u)
1092
+ * run package jobs also on devops changes
1093
+
1094
+
1095
+ ### docs
1096
+
1097
+ * broken links in developer documentation (#5yg1cf)
1098
+
1099
+
1100
+ ### fix
1101
+
1102
+ * moving files in bulk select in WP 5.4 (#4pm455)
1103
+
1104
+
1105
+ ### style
1106
+
1107
+ * reformat php codebase (#4gg05b)
1108
+
1109
+
1110
+ ### test
1111
+
1112
+ * avoid session expired error in E2E tests (#3rmp6q)
1113
+
1114
+
1115
+
1116
+
1117
+
1118
+ ## 4.7.6 (2020-03-31)
1119
+
1120
+
1121
+ ### chore
1122
+
1123
+ * update dependencies (#3cj43t)
1124
+ * **release :** publish [ci skip]
1125
+ * **release :** publish [ci skip]
1126
+
1127
+
1128
+ ### ci
1129
+
1130
+ * use concurrency 1 in yarn disclaimer generation
1131
+
1132
+
1133
+ ### style
1134
+
1135
+ * run prettier@2 on all files (#3cj43t)
1136
+
1137
+
1138
+ ### test
1139
+
1140
+ * configure jest setupFiles correctly with enzyme and clearMocks (#4akeab)
1141
+ * generate test reports (#4cg6tp)
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+ ## 4.7.5 (2020-03-23)
1148
+
1149
+
1150
+ ### build
1151
+
1152
+ * initial release of WP Real Custom Post Order plugin (#46ftef)
1153
+
1154
+
1155
+ ### docs
1156
+
1157
+ * seo optimize wordpress.org description for Real Media Library
1158
+
1159
+
1160
+ ### fix
1161
+
1162
+ * change folder in media dialog folder dropdown (#46nkby)
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+ ## 4.7.4 (2020-03-13)
1169
+
1170
+
1171
+ ### chore
1172
+
1173
+ * make ready for WordPress 5.4 release (#42g9wx)
1174
+
1175
+
1176
+ ### fix
1177
+
1178
+ * allow import from Responsive Lightbox & Gallery
1179
+ * compatibility with LernaPress Frontend Editor (#44jczf)
1180
+ * i18n is not correctly initialized
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+ ## 4.7.3 (2020-03-05)
1187
+
1188
+
1189
+ ### build
1190
+
1191
+ * chunk vendor libraries (#3wkvfe) and update antd@4 (#3wnntb)
1192
+
1193
+
1194
+ ### chore
1195
+
1196
+ * update dependencies (webpack, types)
1197
+
1198
+
1199
+ ### fix
1200
+
1201
+ * **lite :** while adding a new plugin an exception is thrown (#3yp0v3)
1202
+ * Export Media Library compatibility when clicking the toolbar export button while All or Unorganized is selected (#3yeqkw)
1203
+ * links in media menu are not accessible (e. g. Export Media Library, Imagify, #3yeqkw)
1204
+ * **lite :** add preview image for order subfolders (#3wkbtk)
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+ ## 4.7.2 (2020-02-27)
1211
+
1212
+
1213
+ ### build
1214
+
1215
+ * optimize wordpress.org plugin description (#3wgvmg)
1216
+
1217
+
1218
+ ### docs
1219
+
1220
+ * CHANGELOG and README
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+ ## 4.7.1 (2020-02-26)
1227
+
1228
+
1229
+ ### fix
1230
+
1231
+ * compatibility running Real Media Library and Real Thumbnail Generator together (hotfix)
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+ # 4.7.0 (2020-02-26)
1238
+
1239
+
1240
+ ### build
1241
+
1242
+ * abstract freemium package (#3rmkfh)
1243
+ * migrate real-thumbnail-generator to monorepo
1244
+
1245
+
1246
+ ### ci
1247
+
1248
+ * automatic wp.org SVN deploy (#1aemay)
1249
+
1250
+
1251
+ ### feat
1252
+
1253
+ * added swedish language (#3uhd4j)
1254
+ * prepare for free / lite version (#1aemay)
1255
+
1256
+
1257
+ ### fix
1258
+
1259
+ * folder selector in compat view / insert media dialog (#3rfbaw)
1260
+ * import from FileBird works now as expected
1261
+ * import from other plugins is now more intuitive (#3pf4jb)
1262
+ * make importing categories only available in PRO version (#1aemay)
1263
+ * make importing categories only available in PRO version (#1aemay)
1264
+ * use correct library for cover image media picker (#3mjrrc)
1265
+ * use own wp_set_script_translations to make it compatible with deferred scripts (#3mjh0e)
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+ ## 4.6.1 (2020-02-13)
1272
+
1273
+
1274
+ ### fix
1275
+
1276
+ * compatibility with Justified Image Grid
1277
+ * no longer use lodash in frontend coding (#3mjrrc)
1278
+ * old PHP versions (7.1) reported a bug related to namespaces
1279
+ * use correct pathes without whitespaces together with Real Physical Media
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+ # 4.6.0 (2020-02-11)
1286
+
1287
+ * the plugin is now available in following langauges: English, German, Dutch, Spanish, French, Indian, Chinese, Russian
1288
+ * add feature to set default startup folder
1289
+ * fix bug with Divi Page Builder
1290
+ * fix bug with subfolder ordering by name
1291
+ * fix bug with multiple MobX usage (developers only)
1292
+ * fix bug with ReactJS v17 warnings in your console
1293
+ * refactor partly JavaScript object rmlOpts to rmlOpts.others (developers only)
1294
+
1295
+ ## 4.5.4 (2019-09-07)
1296
+
1297
+ * fix bug with PHP 7.2.7
1298
+
1299
+ ## 4.5.3 (2019-09-07)
1300
+
1301
+ * fix bug with WP 5.2.2 when uploading a file directly to a folder
1302
+ * fix bug with custom order when used a "orderby" clause before
1303
+ * extend core WP REST API /wp-json/wp/v2/media to fetch RML specific data (developers only)
1304
+ * add RML/Item/DragDrop and RML/Folder/OrderBy action (developers only)
1305
+
1306
+ ## 4.5.2 (2019-08-09)
1307
+
1308
+ * improve compatibility with Beaver Builder
1309
+ * fix bug with Flatsome UX Page builder when the folder dropdown shows no content
1310
+ * fix bug with SuperPWA wordpress plugin (cache)
1311
+ * fix bug with Avada 6.0 and Fusion Builder Live
1312
+ * fix bug with search box height in some cases that it needed too much space
1313
+ * add filter RML/Tree/Parsed so you can for example hide folders (developers only)
1314
+ * add filter RML/Scripts/Skip to skip assets loading for given pages (developers only)
1315
+ * fix bug when uploading a file to a specific folder which is generated through filter (developers only)
1316
+ * fix bug with logged Notice in folder shortcode (developers only)
1317
+
1318
+ ## 4.5.1 (2019-06-10)
1319
+
1320
+ * fix bug with Gutenberg "Gallery" block and the folder sidebar
1321
+ * fix bug with folder selector, use modal dialog instead
1322
+ * fix bug with snax plugin frontend submission uploader
1323
+ * improve "Add new" button with preselection in uploader
1324
+
1325
+ # 4.5.0 (2019-05-07)
1326
+
1327
+ * add multi toolbar action "Delete" when multiple folders are checked
1328
+ * add compatibility with "Export Media Library" plugin: Download a folder as .zip
1329
+ * fix bug with limited image amount in Gutenberg block
1330
+ * now you can add multi toolbar actions (when multiple nodes are selected) (developers only)
1331
+
1332
+ ## 4.4.1 (2019-04-27)
1333
+
1334
+ * add feature to show SVG images in media library as image and not a generic icon
1335
+ * fix count cache in list mode
1336
+ * fix bug with Real Physical Media when queue is not filled in automatic mode when tree node is relocated
1337
+ * improve API function wp_rml_create_all_children_sql() with MySQL UDF and legacy fallback (developers only)
1338
+
1339
+ # 4.4.0 (2019-04-13)
1340
+
1341
+ * add sort menu for subfolders so you can order subfolders alphabetically
1342
+ * add "title" attribute to tree node for accessibility
1343
+ * add ability to cancel uploads
1344
+ * fix bug with uploader showing more then one upload message (with spinner)
1345
+ * fix bug with item click on touch devices does not open links / dialogs
1346
+ * fix bug in "Replace image" dialog
1347
+ * fix bug in custom content order when navigating back to All files
1348
+
1349
+ # 4.3.0 (2019-03-19)
1350
+
1351
+ * add button to expand/collapse all node items
1352
+ * add option while holding CTRL while creating a new folder you can bulk insert folders
1353
+ * add option to rearrange a folder manually by selecting the parent folder and next sibling
1354
+ * improve user settings / folder details dialog
1355
+ * improve dropdown when selecting a folder (e. g. Media > Add new) with searchbar
1356
+ * improve dark mode
1357
+ * fix bug with edit dialog in portfolio image gallery in Glazov theme
1358
+ * fix bug with domains with umlauts
1359
+ * fix bug with Divi Builder (wrong dependency registered for script)
1360
+ * add API function wp_rml_selector() for a dropdown (developers only)
1361
+
1362
+ # 4.2.0 (2018-02-02)
1363
+
1364
+ * add Gutenberg block to create a dynamic gallery (shortcode still works)
1365
+ * fix bug with Gutenberg edit dialog
1366
+ * fix bug with Ninja Table Pro and edit "Add media" dialog
1367
+ * fix bug with admin notice when using PHP version < 5.4
1368
+ * fix bug with frontend loading and "Upload to folder" dropdown (e.g. Marketplace vendor plugins)
1369
+
1370
+ ## 4.1.1 (2019-01-23)
1371
+
1372
+ * add Material WP compatibility
1373
+ * add new order: Order by date (ascending, descending)
1374
+ * add Polish translation
1375
+ * fix bug with custom order when editing a detail in the media dialog
1376
+ * fix bug with ACF when editing an image field
1377
+ * fix bug with PHP 5.4 and autoupdater
1378
+ * fix bug with PHP 7.3 (deprecation notice in error log)
1379
+ * improve compatibility with Trive Quiz Builder
1380
+
1381
+ # 4.1.0 (2018-12-10)
1382
+
1383
+ * add auto update functionality
1384
+ * fix bug with german translations
1385
+ * fix bug with with Thrive Architect page builder
1386
+ * reduced installable .zip file size
1387
+ * improve performance for JS and CSS resources / assets (developers only)
1388
+
1389
+ ## 4.0.10 (2018-12-07)
1390
+
1391
+ * fix bug with hierarchical SQL queries and MariaDB database system
1392
+ * fix bug with wp_attachment_get_shortcuts() API function (developers only)
1393
+
1394
+ ## 4.0.9 (2018-11-27)
1395
+
1396
+ * fix bug with option to hide shortcuts in All files view
1397
+ * fix bug with slow environments / pcs and big admin pages
1398
+ * fix bug with bulk select in grid mode and unnecessary server requests
1399
+
1400
+ ## 4.0.8 (2018-11-04)
1401
+
1402
+ * add option to hide shortcuts in All files view
1403
+ * add compatibility with Slick slider plugin and other gallery shortcodes which use the standard gallery shortcode
1404
+ * improve load time when opening a custom ordered folder
1405
+ * PHP 5.4 is now minimum required PHP version (legacy version 4.0.7 for PHP 5.3 support add to download package)
1406
+ * fix bug with "Edit gallery" dialog when entering in an ordered folder
1407
+ * fix bug with ordered images when switching back to "All files"
1408
+ * fix bug with bulk select and delete when using the grid view (performance)
1409
+ * fix bug with wrong breadcrumb in media details dialog
1410
+ * fix bug with The Grid and RML modal dialog (folders not visible)
1411
+ * fix bug with WPML and custom order content
1412
+ * fix bug with last queried folder (HTTP header error)
1413
+ * fix bug with picu Plugin
1414
+
1415
+ ## 4.0.7 (2018-09-08)
1416
+
1417
+ * add russian translation (thanks to Антон)
1418
+ * add compatibility for Tailor page builder
1419
+ * fix bug with WPML: WPML Media translation add-on is no longer needed
1420
+ * fix bug with Divi Builder in frontend-editing
1421
+ * fix bug with debugging the plugin with debug option in media settings
1422
+ * fix bug with ACF edit screen
1423
+ * fix bug with new created folders and droppable attachment
1424
+ * add a few new PHP actions / hooks (see API documentation) (developers only)
1425
+
1426
+ ## 4.0.6 (2018-08-11)
1427
+
1428
+ * improve cover image metabox (removable with preview)
1429
+ * improve german translation
1430
+ * fix bug with Divi Page builder and the gallery module
1431
+ * fix bug with folder sorting (error handling)
1432
+ * fix bug with missing resources when developer tools are opened (source maps)
1433
+
1434
+ ## 4.0.5 (2018-08-03)
1435
+
1436
+ * fix save bug with last queried folder on NGINX envs
1437
+ * fix bug with "Plain" permalink structure
1438
+ * fix bug with non-multiple browser uploader and media assignment to folder
1439
+ * fix bug with floating sidebar when scrolling and the first three folders are invisible
1440
+ * fix bug with collapsable/expandable folders
1441
+
1442
+ ## 4.0.4 (2018-07-20)
1443
+
1444
+ * improve dark mode compatibility (meta box)
1445
+ * improve error handling with plugins like Clearfy
1446
+ * fix bug in media modal when changing the tab to "Upload"
1447
+ * fix bug with X Pro Theme / Cornerstone
1448
+ * fix bug with PHP 5.3
1449
+ * fix bug with WPML v4 "All files" counter
1450
+ * fix bug with non-SSL API root urls
1451
+ * fix bug with pagination in list mode after switching folder
1452
+ * fix bug with cover image in list mode
1453
+ * fix bug with Gutenberg 3.1.x (https://git.io/f4SXU) (developers only)
1454
+ * removed unnecessary server request at startup (developers only)
1455
+
1456
+ ## 4.0.3 (2018-06-15)
1457
+
1458
+ * add compatibility with WP Dark Mode plugin
1459
+ * fix bug with XML/RPC requests when using WP/LR extension
1460
+ * removed one unusued script (immer) (developers only)
1461
+ * use global WP REST API parameters instead of DELETE / PUT (developers only)
1462
+
1463
+ ## 4.0.2 (2018-06-11)
1464
+
1465
+ * add help message if WP REST API is not reachable through HTTP verbs
1466
+ * fix bug with scroll container in media modal in IE/Edge/Firefox
1467
+ * fix bug with custom content ordering
1468
+ * fix bug with older MySQL systems or non-InnoDB engines
1469
+ * fix bug with count cache when using REST API
1470
+ * improve scroll behavior in main media library page
1471
+ * improve mass delete process of attachments to avoid too many requests
1472
+ * prepared the plugin for the new WP/LR extension (Adobe Lightroom sync)
1473
+ * add action RML/Creatable/Register (developers only)
1474
+ * fix bug with RML/Active filter (developers only)
1475
+ * fix bug with creatables which are no longer registered (developers only)
1476
+ * improve debug mode in media settings (developers only)
1477
+
1478
+ ## 4.0.1 (2018-06-04)
1479
+
1480
+ * fix bug with spinning loader when permalink structure is "Plain"
1481
+ * fix bug with WPML when using another language within WP admin as default
1482
+ * fix bug with german translation
1483
+ * fix bug with modal in Avada Theme options
1484
+ * fix bug with IE11/Edge browser
1485
+
1486
+ # 4.0.0 (2018-05-31)
1487
+
1488
+ * complete code rewrite, same functionality with improve performance, with an eye on smooth user interface and experience
1489
+ * improve performance when opening the media library in grid mode
1490
+ * removed option in media settings to reset a single folder attachment order
1491
+ * removed API function wp_rml_select_tree (developers only)
1492
+ * removed filters RML/Folder/TreeNodeLi/Class, RML/Folder/TreeNode/Class, RML/Folder/TreeNode/Content, RML/Folder/TreeNode/Href (developers only)
1493
+ * rewrite the plugin to WP REST API, ReactJS, Mobx-State-Tree (developers only)
1494
+ * changed IUserSettings/IMetadata interface method save() (developers only)
1495
+
1496
+ ## 3.4.8 (2018-05-03)
1497
+
1498
+ * add Right-to-left support (RTL)
1499
+
1500
+ ## 3.4.7 (2018-04-12)
1501
+
1502
+ * improve performance when opening the media library with lots of folders
1503
+ * add lazy loading of folders in attachment details folder dropdown
1504
+ * fix bug with WPML languages like Portuguese (Brazil) and Portuguese (Portugal)
1505
+
1506
+ ## 3.4.6 (2018-04-07)
1507
+
1508
+ * improve shortcut generation: Caption and description are also copied (Alt text if image)
1509
+ * fix bug with lost selection when opening the media modal dialog
1510
+
1511
+ ## 3.4.5 (2018-03-05)
1512
+
1513
+ * fix bug with WPML multisite usage regarding folder count
1514
+
1515
+ ## 3.4.4 (2018-03-02)
1516
+
1517
+ * improve delete dialog with selected folder name
1518
+ * fix bug with folder counter when WPML is active
1519
+ * fix bug when moving a file to "/ Unorganized" the list is updated now correctly
1520
+ * fix bug with bulk select deletion and switching folder in grid mode
1521
+ * fix bug with PHP 7.2.2
1522
+
1523
+ ## 3.4.3 (2018-01-16)
1524
+
1525
+ * improve uploading process / performance
1526
+ * fix bug with uploader when uploading to "All files"
1527
+ * fix bug when moving files from "All files" to another target
1528
+
1529
+ ## 3.4.2 (2017-12-17)
1530
+
1531
+ * fix bug with F&O theme
1532
+ * fix bug with new PHP version 7.2 (developers only)
1533
+
1534
+ ## 3.4.1 (2017-12-06)
1535
+
1536
+ * fix bug while installation process when creating database tables (developers only)
1537
+
1538
+ # 3.4.0 (2017-12-05)
1539
+
1540
+ * add functionality to Import / Export folder hierarchy
1541
+ * add functionality to Import an registered taxonomy with attachment relations
1542
+ * improve touch experience, add scrollbar in media picker to avoid drag&drop attachments
1543
+ * fix bug with search bar when folders were not found
1544
+ * fix bug with query links
1545
+ * fix bug with Database updates caused by dbDelta (developers only)
1546
+
1547
+ ## 3.3.2 (2017-10-31)
1548
+
1549
+ * fix bug after creating a new post the nodes are not clickable
1550
+
1551
+ ## 3.3.1 (2017-10-27)
1552
+
1553
+ * fix bug with Unorganized folder in attachments dialog
1554
+ * fix bug with toolbar buttons
1555
+ * fix bug with touch devices (no dropdown was touchable)
1556
+ * add filters for structure operations, and created Interface for structure classes (developers only)
1557
+ * fix bug for all parents getter API function (developers only)
1558
+ * improve code quality (developers only)
1559
+ * removed filters RML/Tree/QueryCount (developers only)
1560
+
1561
+ # 3.3.0 (2017-10-22)
1562
+
1563
+ * add ability to expand/collapse the complete sidebar by doubleclick the resize button
1564
+ * add option to allow automatically order a folder by a given criterium
1565
+ * add "General" tabs in folder details settings (developers are now able to add own tabs)
1566
+ * improve: Update the columns width in grid mode while resizing the sidebar
1567
+ * fix bug with wrong characters in gallery shortcode generator dialog
1568
+ * fix bug with Inbound Now PRO plugin dialogs
1569
+ * fix style bug with uploader in modal window
1570
+ * fix bug with ESC key in rename mode
1571
+ * fix bug with creating a new folder and switch back to previous
1572
+ * add owner/creator field for a folder (developers only)
1573
+ * add option to reset the folder names, slugs and absolute pathes (developers only)
1574
+ * add API functions to get all parents of a folder (additionally add metadata condition) (developers only)
1575
+ * add API functions to get all children of a folder (additionally add metadata condition) (developers only)
1576
+ * add hooks to allow "Apply to subfolder" mechanism after moving files to a folder (developers only)
1577
+ * improve the save of localStorage items within one row per tree instance (developers only)
1578
+ * improve the way of generating unique slugs (developers only)
1579
+ * fix bug with font awesome handler in wordpress style enqueue logic (developers only)
1580
+
1581
+ ## 3.2.2 (2017-08-23)
1582
+
1583
+ * fix bug with IE 11 when folder structure does not show up
1584
+ * updated icon font (Font Awesome 4.3 to 4.7)
1585
+
1586
+ ## 3.2.1 (2017-08-11)
1587
+
1588
+ * fix bug with refresh button in folder tree
1589
+
1590
+ # 3.2.0 (2017-08-11)
1591
+
1592
+ * new free Add-On "Default Startup Folder for Real Media Library"
1593
+ * add external link to "Browse Add-Ons"
1594
+ * add ability to add user options (for Add-ons)
1595
+ * add compatibility for Cornerstone page builder plugin
1596
+ * fix bug with modal window when opening the same again
1597
+ * add new filters to support the default wordpress media library extension plugin (developers only)
1598
+ * add PHPDoc for API (developers only)
1599
+ * add Hooks (Filter & Actions) Documentation (developers only)
1600
+ * improve and renamed/refactored the events of JS hooks (developers only)
1601
+ * improve the debug log (developers only)
1602
+ * improve the generation and registration of minified scripts (developers only)
1603
+ * fix bug with localized Javascript object (developers only)
1604
+ * fix bug with slug regeneration when folder is moved (developers only)
1605
+ * fix bug with meta data for Unorganized folder (developers only)
1606
+
1607
+ ## 3.1.3 (2017-July-04)
1608
+
1609
+ * fix bug with gallery shortcode when the message occurs "Headers already sent[...]"
1610
+ * fix bug with sticky header in insert media dialog
1611
+
1612
+ ## 3.1.2 (2017-06-24)
1613
+
1614
+ * improve the "Add new" in media library to preselect the last queried folder
1615
+ * fix bug with some browsers when local storage is disabled
1616
+ * improve the wp_rml_dropdown() function to support multiple selected folders (developers only)
1617
+
1618
+ ## 3.1.1 (2017-06-10)
1619
+
1620
+ * add full compatibility with WordPress 4.8
1621
+ * improve english / german localization
1622
+ * fix bug with search field in IE
1623
+
1624
+ # 3.1.0 (2017-06-08)
1625
+
1626
+ * add ESC to close the rename folder action
1627
+ * add F2 handler to rename a folder
1628
+ * add double click event to open folder
1629
+ * add search input field for folders
1630
+ * add full compatibility with Elementor page builder
1631
+ * improve rearrange mode
1632
+ * improve performance on media library initial startup / load screen
1633
+ * improve uploader for large amount of uploads
1634
+ * fix bug with icons in BeaverBuilder
1635
+ * fix bug with multiple media modal dialogs (improve user experience) and expander
1636
+ * fix bug with ACF media picker and duplicate shortcut info
1637
+ * fix bug with rearrange mode in media modal view
1638
+ * fix bug with Enhanced Media Library representation
1639
+
1640
+ ## 3.0.2 (2017-05-09)
1641
+
1642
+ * add title attribute on folder hover (for long names)
1643
+ * fix bug in customizer while folder structure is not displayed
1644
+ * fix bug with multiple media modal's after switching the folder
1645
+ * fix bug with Advanced Custom Fields when using the image picker modal
1646
+ * add compatibility for Tatsu Page Builder (Oshine Theme)
1647
+
1648
+ ## 3.0.1 (2017-04-22)
1649
+
1650
+ * fix bug with attachment details, on some browsers the dropdowns were not clickable
1651
+ * add a message strip to the plugins page to show MatthiasWeb plugins
1652
+
1653
+ # 3.0.0 (2017-04-20)
1654
+
1655
+ * add feature to create shortcuts and put images in multiple folders, like you already know from your operating system
1656
+ * removed popups
1657
+ * fix bug with changing the folder location in grid view attachment details dialog
1658
+ * fix bug with Polylang while moving a translation file
1659
+ * fix bug with WPML while moving a translation file
1660
+ * fix bug with count cache after uploading a new file
1661
+ * fix performance bug with the count cache
1662
+ * add API function wp_rml_create_shortcuts() (developers only)
1663
+ * add API function wp_rml_created_shortcuts_last_ids() (developers only)
1664
+ * add API function wp_attachment_ensure_source_file() (developers only)
1665
+ * add API function wp_attachment_has_shortcuts() (developers only)
1666
+ * add API function wp_attachment_get_shortcuts() (developers only)
1667
+ * add API function wp_attachment_is_shortcut() (developers only)
1668
+
1669
+ ## 2.8.6 (2017-03-25)
1670
+
1671
+ * fix bug with PHP < 5.6
1672
+
1673
+ ## 2.8.5 (2017-03-24)
1674
+
1675
+ * fix bug with styles and scripts
1676
+ * fix bug with rearrange
1677
+ * minify scripts / css for prepared shortcut functionality (developers only)
1678
+
1679
+ ## 2.8.4 (2017-03-22)
1680
+
1681
+ * add https://matthias-web.com as author url
1682
+ * improve the way of rearrange mode, the folders gets expand after 700ms of hover
1683
+ * fix bugs with absolute pathes and slugs of folders, if you have problems, please rename the first level folders to regenerate
1684
+ * add getPlain() method to IFolder interface to get a normal array for the folder properties (developers only)
1685
+ * prepared readable REST API for folders (developers only)
1686
+
1687
+ ## 2.8.3 (2017-02-14)
1688
+
1689
+ * add new permission "par" to restrict the change of parent folder
1690
+ * fix bug with korean characters in folder names
1691
+ * removed icon when a folder has a restriction (WP/LR)
1692
+ * add api/IFolder.interface.php and more API functions (developers only)
1693
+ * improve the OOP: getters/setters (developers only)
1694
+ * improve code quality by using own API functions (developers only)
1695
+
1696
+ ## 2.8.2 (2017-02-03)
1697
+
1698
+ * fix bug with migration in multisite installations
1699
+ * fix bug with Facebook hint in plugins site
1700
+ * fix XSS vulnerability (this bug can only be used by folder creators, no visitors) (developers only)
1701
+ * fix bug with MLA class dependency (developers only)
1702
+
1703
+ ## 2.8.1 (2017-01-20)
1704
+
1705
+ * add v2.7.2 stable for older PHP versions to the codecanyon download files
1706
+ * fix bug with permission system for WP/LR extension
1707
+ * fix bug with the migration system for WP multisite
1708
+
1709
+ # 2.8.0 (2017-01-15)
1710
+
1711
+ * add more useful error messages when changing the hierarchical order of the folders
1712
+ * add confirm dialog when you sort the files inside the folder
1713
+ * improve the performance
1714
+ * improve the way of relocating the folder tree (immediatly saved after relocating)
1715
+ * improve the way of sortable folder content (galleries), now it is possible to reorder files in every folder
1716
+ * improve naming of folders, every character is now allowed, the folder name is sanitized
1717
+ * improve the folder metadata dialog and refresh the view if needed (button click in dialog)
1718
+ * fix bug while uploading a new plugin .zip file
1719
+ * add autoloading for php classes (developers only)
1720
+ * add namespaces for php classes (developers only)
1721
+ * add new abstract class for Creatable's (folders, collections, galleries, ...) (developers only)
1722
+ * add new abstract class for Sortable's (folders, collections, galleries, ...) extends Creatable's (developers only)
1723
+ * add folder\Root as own class (developers only)
1724
+ * add debug mode, define('WP_DEBUG', true); and define('SCRIPT_DEBUG', true); in wp-config.php (developers only)
1725
+ * add visible debug mode in options panel (developers only)
1726
+ * add API function wp_rml_create_or_return_existing_id() (developers only)
1727
+ * add API function wp_rml_structure_reset() (developers only)
1728
+ * add admin notice for when you have PHP Version < 5.3.0 (developers only)
1729
+ * improve the whole API and Advanced wp_rml_get_object_by_id() to get folder object (developers only)
1730
+ * improve the split between Structure and CountCache (php classes) (developers only)
1731
+ * improve the php code quality (developers only)
1732
+ * removed the database table wp_realmedialibrary_order, merged with wp_realmedialibrary_posts (developers only)
1733
+ * removed unnecessary sql query in pre_get_posts (developers only)
1734
+ * removed bid columns in database tables and add new index (developers only)
1735
+
1736
+ ## 2.7.2 (2016-12-10)
1737
+
1738
+ * add option to reset the count cache
1739
+ * fix bug with upload in modal window
1740
+ * fix count cache when moving from Unorganized to folder
1741
+
1742
+ ## 2.7.1 (2016-12-05)
1743
+
1744
+ * add the MatthiasWeb promotion dialog
1745
+ * fix bug with IE8
1746
+ * fix bug with TinyMCE editor shortcode dialog
1747
+
1748
+ # 2.7.0 (2016-11-24)
1749
+
1750
+ * add natural filename sort of folders (thanks to KorbinianT)
1751
+ * add lazy loading to folder tree, now it is only loaded from server when needed
1752
+ * add: You can now directly upload files to a folder with a dropdown selection in media modal and "Add Media" page
1753
+ * fix bug with migration on multisite installation
1754
+ * fix bug with modal views, now it also supports lazy loading
1755
+ * fix bug with attachment movement helper (Move x file)
1756
+ * fxied bug with plugin "Visual Composer Extensions All In One" and the tooltips
1757
+ * improve the changelog file
1758
+ * improve the actions RML/Folder/Deleted|Renamed|Moved (developers only)
1759
+ * fix bug with jQuery AIO tree version when RCM is enabled (developers only)
1760
+ * fix bug with api method wp_attachment_folder and the default value (developers only)
1761
+ * fix bug with creating a new folder with new order number (developers only)
1762
+ * prepare RML for Physical Press plugin and avoid folder names "." and ".." (developers only)
1763
+
1764
+ ## 2.6.5 (2016-10-26)
1765
+
1766
+ * fix bug with Justified Image Grid
1767
+ * fix bug with migration system, no image relationships were imported
1768
+
1769
+ ## 2.6.4 (2016-10-21)
1770
+
1771
+ * fix bug while wipe of folders in multisite installation
1772
+ * fix bug after save in attachment details
1773
+ * fix problem with negative -1 count
1774
+ * fix bug when switching folder when on page 2 in table mode
1775
+ * improve tabs in options panel of RML media options
1776
+ * improve the delete behaviour of folder (files will be moved to unorganized)
1777
+ * add a migration system for further updates (developers only)
1778
+ * add filter for parent root folder id (Default -1) (developers only)
1779
+ * fix the usage of switch_to_blog together with api functions (developers only)
1780
+ * improve some CSS experiences (loader) (developers only)
1781
+ * improve the save point of relationship between folder and post (own database table for relationships) (developers only)
1782
+
1783
+ ## 2.6.3 (2016-09-25)
1784
+
1785
+ * improve some CSS
1786
+ * fix bug while bulk select and moving files
1787
+ * fix bug with reopening a media select dialog
1788
+ * fix bug with Avia / Enfold page builder
1789
+ * fix bug with reordering the gallery data folder
1790
+ * removed deprecated ressource files
1791
+
1792
+ ## 2.6.2 (2016-09-16)
1793
+
1794
+ * fix database tables are not generated, now they are
1795
+
1796
+ ## 2.6.1 (2016-09-16)
1797
+
1798
+ * fix options bug while accessing other pages (developers only)
1799
+
1800
+ # 2.6.0 (2016-09-15)
1801
+
1802
+ * add full compatibility with WP/LR Lightroom plugin
1803
+ * add minified scripts / styles
1804
+ * add option to apply an order by title, filename, ID to gallery data folders
1805
+ * add option to disable scripts/styles on frontend viewing
1806
+ * add finnish translation (Thanks to Antti!)
1807
+ * fix Enfold / Avia media picker bug (Thanks to Josh!)
1808
+ * fix Thickbox bug while logged out
1809
+ * improve load performance
1810
+ * improve the order for gallery data folders
1811
+ * add option for folders "restrict" (developers only)
1812
+ * add a minified permission system so 3rd party plugins can restrict folders interactions (developers only)
1813
+
1814
+ ## 2.5.5 (2016-08-19)
1815
+
1816
+ * fix capability bug while logged out
1817
+ * add Javascript polyfill's to avoid browser incompatibility (developers only)
1818
+ * fix bug for crashed safari browser (developers only)
1819
+
1820
+ ## 2.5.4 (2016-08-08)
1821
+
1822
+ * add option to remove advertisement links
1823
+ * fix "Edit selection" bug while inserting media to post
1824
+
1825
+ ## 2.5.3 (2016-07-21)
1826
+
1827
+ * fix media.comparator bug (developers only)
1828
+ * fix bugs with Easy Digital Downloads plugin (developers only)
1829
+ * fix String.prototype problems (developers only)
1830
+
1831
+ ## 2.5.2 (2016-07-11)
1832
+
1833
+ * fix toolbar while scrolling in media library
1834
+ * fix problems with plugin "Formidable Forms"
1835
+ * fix resize bug
1836
+ * fix WP query database notices in error log (developers only)
1837
+ * fix count bug when many folders exist (performed SQL statement) (developers only)
1838
+ * improve API, wp_rml_create() now returns false or a string error array, on success it return an int (ID) (developers only)
1839
+
1840
+ ## 2.5.1 (2016-07-10)
1841
+
1842
+ * fix shortcode builder [folder-gallery] did not work
1843
+
1844
+ # 2.5.0 (2016-07-03)
1845
+
1846
+ * add folder tree to insert media dialog
1847
+ * complete recoding of javascript code (developers only)
1848
+
1849
+ ## 2.4.2 (2016-06-20)
1850
+
1851
+ * fix TinyMCE bug when not admin
1852
+ * fix style issues
1853
+ * fix PHP < 5.3 Bug with func_get_args (developers only)
1854
+
1855
+ ## 2.4.1 (2016-03-20)
1856
+
1857
+ * fix website is empty because javascript occurs an error
1858
+
1859
+ # 2.4.0 (2016-03-10)
1860
+
1861
+ * add "Reamining time" and bytes/s in uploader
1862
+ * add order mode in galleries
1863
+ * add warning when moving files from "All Files"
1864
+ * improve move in table list mode (no page refresh)
1865
+ * improve ux styling (uploader, tree, tree in upload media dialog)
1866
+ * improve options panel in Settings > Media
1867
+ * fix theme preview when plugin is active
1868
+ * fix hidden folder nodes on safari browser
1869
+ * fix usage of front-end editor in BeaverBuilder and Visual Composer
1870
+ * add custom fields (meta data) for folders (see inc/api/meta.php) (developers only)
1871
+ * add custom field: cover image + description (not activated as standard, used in JIG) (developers only)
1872
+ * fix admin_footer problem when a plugin removes styles and javascript of RML (developers only)
1873
+ * fix database queries to avoid long load time on dashboard (developers only)
1874
+ * fix bug pre_get_posts (developers only)
1875
+
1876
+ # 2.3.0 (2016-03-10)
1877
+
1878
+ * add compatibility with JUSTIFIED IMAGE GRID
1879
+ * add resizable container width
1880
+ * add option to wipe all settings and releations
1881
+ * add spanish translation - by Ana Ayelén Martínez. http://caribdisweb.com/
1882
+ * fix edit mode when creating a new folder
1883
+ * fix default order in folder gallery
1884
+ * fix UX bugs (draggable, droppable, sortable)
1885
+ * fix sticky sidebar
1886
+ * add "slug" and "absolute" to database table (developers only)
1887
+ * add / updated api (developers only)
1888
+
1889
+ ## 2.2.3 (2016-Feburary-26)
1890
+
1891
+ * add Finnish translation (thanks to palvelu)
1892
+ * add more attractive alerts and prompt windows
1893
+ * fix visual bugs
1894
+ * fix delete bug => when folder is deleted, switch view to root
1895
+ * fix upload percentage issue
1896
+ * fix live update of folder count
1897
+ * fix upload in "Insert media" dialog => file is now in correct folder
1898
+ * fix drag and drop experience
1899
+ * moved folder gallery button above visual editor into visual editor
1900
+ * add more actions and filters (developers only)
1901
+ * add javascript actions (window.rml.hooks) (developers only)
1902
+ * changed javascript function names (developers only)
1903
+ * changed localize javascript variables (developers only)
1904
+
1905
+ ## 2.2.2 (2016-01-20)
1906
+
1907
+ * bugfix error in creating a folder gallery
1908
+
1909
+ ## 2.2.1 (2016-01-17)
1910
+
1911
+ * add facebook advert on plugin activation
1912
+ * improve restyled upload window
1913
+ * fix font awesome bug
1914
+ * add filters and actions (developers only)
1915
+ * add three more api functions (developers only)
1916
+
1917
+ # 2.2.0 (2015-12-29)
1918
+
1919
+ * add sticky container when scrolling
1920
+ * add collection and galleries folder types
1921
+ * add collapsable folders
1922
+ * add left infos about folder structure
1923
+ * add option to hide upload preview (for slow loading pc's)
1924
+ * fix conditional tag to create / sort items
1925
+ * fix count bug (WPML)
1926
+ * fix duplicate name
1927
+ * add API functions (look inc/api/) (developers only)
1928
+ * outsourced javascript functions (developers only)
1929
+ * fix AJAX bug (developers only)
1930
+ * PHP Code rewritten (better split in view and structure) (developers only)
1931
+ * PHP Code documentation improve (developers only)
1932
+
1933
+ ## 2.1.2 (2015-11-22)
1934
+
1935
+ * add french translation (thanks to Youpain)
1936
+ * fix rename bug
1937
+ * fix count bug when WPML in usage
1938
+
1939
+ ## 2.1.1 (2015-11-13)
1940
+
1941
+ * removed unnecessary code (developers only)
1942
+ * fix jquery conflict (developers only)
1943
+
1944
+ # 2.1.0 (2015-11-07)
1945
+
1946
+ * add multisite compatibility
1947
+ * fix correct sorting (not alphabetic)
1948
+
1949
+ # 2.0.0 (15-11-03)
1950
+
1951
+ * support PHP version < 5.4 (developers only)
1952
+
1953
+ # 1.3.0 (15-11-02)
1954
+
1955
+ * add nice uploading to folder
1956
+
1957
+ # 1.2.0 (15-10-29)
1958
+
1959
+ * add notice about the alphabetic sorting
1960
+ * fix problems with RevSlider >= 5.0 (developers only)
1961
+ * fix body class for grid mode (add Javascript methode) (developers only)
1962
+
1963
+ # 1.1.0 (15-10-21)
1964
+
1965
+ * fix moving in list table
1966
+ * fix style (drag and drop helper)
1967
+ * removed limit of folder gallery images
1968
+ * fix pre_get_posts appending meta_query (developers only)
1969
+ * add pre_get_posts capability check (developers only)
1970
+
1971
+ ## 1.0.1 (15-10-16)
1972
+
1973
+ * improve rename without window reload
1974
+ * improve delete without window reload
1975
+ * fix https:// resources for css and js files
1976
+
1977
+ # 1.0.0 (2015-10-9)
1978
+
1979
+ * initial Release
LICENSE ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ Organize your wordpress media library in a nice way with folders.
2
+ Copyright (C) 2020 devowl.io GmbH
3
+
4
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or any later version.
5
+
6
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
7
+
8
+ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
LICENSE_3RD_PARTY_JS.md ADDED
@@ -0,0 +1,3729 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED IN PORTIONS OF THE @DEVOWL WP/DEVELOPMENT PRODUCT.
2
+
3
+ async-validator, css-animation, dom-align, rc-align, rc-animate, rc-collapse, rc-dialog, rc-dropdown, rc-input-number, rc-menu, rc-notification, rc-pagination, rc-progress, rc-rate, rc-steps, rc-switch, rc-tabs. A copy of the source code may be downloaded from git@github.com:ant-design/css-animation.git (@ant-design/css-animation), git@github.com:yiminghe/add-dom-event-listener (add-dom-event-listener), git@github.com:yiminghe/async-validator.git (async-validator), git@github.com:yiminghe/css-animation.git (css-animation), git@github.com:yiminghe/dom-align.git (dom-align), git@github.com:react-component/align.git (rc-align), git@github.com:react-component/animate.git (rc-animate), git@github.com:react-component/collapse.git (rc-collapse), git@github.com:react-component/dialog.git (rc-dialog), git@github.com:react-component/dropdown.git (rc-dropdown), https://github.com/react-component/form.git (rc-form), git@github.com:react-component/input-number.git (rc-input-number), git@github.com:react-component/menu.git (rc-menu), git@github.com:react-component/notification.git (rc-notification), git@github.com:react-component/pagination.git (rc-pagination), git@github.com:react-component/progress.git (rc-progress), https://github.com/react-component/rate.git (rc-rate), git+ssh://git@github.com/react-component/steps.git (rc-steps), git@github.com:react-component/switch.git (rc-switch), git@github.com:react-component/tabs.git (rc-tabs), git@github.com:react-component/time-picker.git (rc-time-picker). This software contains the following license and notice below:
4
+
5
+ The MIT License (MIT)
6
+
7
+ Copyright (c) 2014-present yiminghe
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+
15
+ -----
16
+
17
+ The following software may be included in this product: json2mq. A copy of the source code may be downloaded from https://github.com/ant-design/react-slick (@ant-design/react-slick), https://github.com/akiran/json2mq (json2mq), https://github.com/akiran/react-slick (react-slick). This software contains the following license and notice below:
18
+
19
+ The MIT License (MIT)
20
+
21
+ Copyright (c) 2014 Kiran Abburi
22
+
23
+ Permission is hereby granted, free of charge, to any person obtaining a copy
24
+ of this software and associated documentation files (the "Software"), to deal
25
+ in the Software without restriction, including without limitation the rights
26
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27
+ copies of the Software, and to permit persons to whom the Software is
28
+ furnished to do so, subject to the following conditions:
29
+
30
+ The above copyright notice and this permission notice shall be included in all
31
+ copies or substantial portions of the Software.
32
+
33
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39
+ SOFTWARE.
40
+
41
+ -----
42
+
43
+ The following software may be included in this product: memize, tannin. A copy of the source code may be downloaded from https://github.com/aduth/tannin.git (@tannin/compile), https://github.com/aduth/tannin.git (@tannin/evaluate), https://github.com/aduth/tannin.git (@tannin/plural-forms), https://github.com/aduth/tannin.git (@tannin/postfix), https://github.com/aduth/memize.git (memize), https://github.com/aduth/tannin.git (tannin). This software contains the following license and notice below:
44
+
45
+ [The MIT License (MIT)](https://opensource.org/licenses/MIT)
46
+
47
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
48
+
49
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
50
+
51
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
52
+
53
+ -----
54
+
55
+ The following software may be included in this product: airbnb-prop-types. A copy of the source code may be downloaded from git+https://github.com/airbnb/prop-types.git. This software contains the following license and notice below:
56
+
57
+ MIT License
58
+
59
+ Copyright (c) 2016 Airbnb
60
+
61
+ Permission is hereby granted, free of charge, to any person obtaining a copy
62
+ of this software and associated documentation files (the "Software"), to deal
63
+ in the Software without restriction, including without limitation the rights
64
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
65
+ copies of the Software, and to permit persons to whom the Software is
66
+ furnished to do so, subject to the following conditions:
67
+
68
+ The above copyright notice and this permission notice shall be included in all
69
+ copies or substantial portions of the Software.
70
+
71
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
72
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
73
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
74
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
75
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
76
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
77
+ SOFTWARE.
78
+
79
+ -----
80
+
81
+ The following software may be included in this product: object-assign. A copy of the source code may be downloaded from https://github.com/chalk/ansi-regex.git (ansi-regex), https://github.com/chalk/ansi-styles.git (ansi-styles), https://github.com/sindresorhus/array-differ.git (array-differ), https://github.com/sindresorhus/array-find-index.git (array-find-index), https://github.com/sindresorhus/array-union.git (array-union), https://github.com/sindresorhus/array-uniq.git (array-uniq), https://github.com/sindresorhus/arrify.git (arrify), https://github.com/sindresorhus/caller-callsite.git (caller-callsite), https://github.com/sindresorhus/caller-path.git (caller-path), https://github.com/sindresorhus/callsites.git (callsites), https://github.com/sindresorhus/camelcase.git (camelcase), https://github.com/sindresorhus/camelcase-keys.git (camelcase-keys), https://github.com/chalk/chalk.git (chalk), https://github.com/sindresorhus/cli-cursor.git (cli-cursor), https://github.com/sindresorhus/code-point-at.git (code-point-at), https://github.com/sindresorhus/dargs.git (dargs), https://github.com/sindresorhus/decamelize.git (decamelize), https://github.com/sindresorhus/detect-indent.git (detect-indent), https://github.com/sindresorhus/dot-prop.git (dot-prop), https://github.com/sindresorhus/escape-string-regexp.git (escape-string-regexp), https://github.com/sindresorhus/figures.git (figures), https://github.com/sindresorhus/file-type.git (file-type), https://github.com/sindresorhus/filename-reserved-regex.git (filename-reserved-regex), https://github.com/sindresorhus/filter-obj.git (filter-obj), https://github.com/sindresorhus/find-up.git (find-up), https://github.com/sindresorhus/get-stream.git (get-stream), https://github.com/sindresorhus/git-remote-origin-url.git (git-remote-origin-url), https://github.com/sindresorhus/got.git (got), https://github.com/sindresorhus/has-ansi.git (has-ansi), https://github.com/sindresorhus/import-fresh.git (import-fresh), https://github.com/sindresorhus/indent-string.git (indent-string), https://github.com/sindresorhus/into-stream.git (into-stream), https://github.com/sindresorhus/is-fullwidth-code-point.git (is-fullwidth-code-point), https://github.com/sindresorhus/is-obj.git (is-obj), https://github.com/sindresorhus/is-plain-obj.git (is-plain-obj), https://github.com/sindresorhus/is-stream.git (is-stream), https://github.com/sindresorhus/is-text-path.git (is-text-path), https://github.com/sindresorhus/is-webp.git (is-webp), https://github.com/sindresorhus/load-json-file.git (load-json-file), https://github.com/sindresorhus/locate-path.git (locate-path), https://github.com/sindresorhus/loud-rejection.git (loud-rejection), https://github.com/sindresorhus/lowercase-keys.git (lowercase-keys), https://github.com/sindresorhus/map-obj.git (map-obj), https://github.com/sindresorhus/meow.git (meow), https://github.com/sindresorhus/modify-values.git (modify-values), https://github.com/sindresorhus/npm-run-path.git (npm-run-path), https://github.com/sindresorhus/number-is-nan.git (number-is-nan), https://github.com/sindresorhus/object-assign.git (object-assign), https://github.com/sindresorhus/onetime.git (onetime), https://github.com/sindresorhus/os-homedir.git (os-homedir), https://github.com/sindresorhus/os-tmpdir.git (os-tmpdir), https://github.com/sindresorhus/p-cancelable.git (p-cancelable), https://github.com/sindresorhus/p-event.git (p-event), https://github.com/sindresorhus/p-finally.git (p-finally), https://github.com/sindresorhus/p-is-promise.git (p-is-promise), https://github.com/sindresorhus/p-locate.git (p-locate), https://github.com/sindresorhus/p-map-series.git (p-map-series), https://github.com/sindresorhus/p-reduce.git (p-reduce), https://github.com/sindresorhus/p-try.git (p-try), https://github.com/sindresorhus/p-waterfall.git (p-waterfall), https://github.com/sindresorhus/parse-json.git (parse-json), https://github.com/sindresorhus/path-exists.git (path-exists), https://github.com/sindresorhus/path-is-absolute.git (path-is-absolute), https://github.com/sindresorhus/path-key.git (path-key), https://github.com/sindresorhus/path-type.git (path-type), https://github.com/sindresorhus/pify.git (pify), https://github.com/sindresorhus/prepend-http.git (prepend-http), https://github.com/sindresorhus/read-pkg.git (read-pkg), https://github.com/sindresorhus/read-pkg-up.git (read-pkg-up), https://github.com/sindresorhus/redent.git (redent), https://github.com/sindresorhus/repeating.git (repeating), https://github.com/sindresorhus/resolve-cwd.git (resolve-cwd), https://github.com/sindresorhus/resolve-from.git (resolve-from), https://github.com/sindresorhus/restore-cursor.git (restore-cursor), https://github.com/sindresorhus/semver-truncate.git (semver-truncate), https://github.com/sindresorhus/shebang-regex.git (shebang-regex), https://github.com/sindresorhus/sort-keys.git (sort-keys), https://github.com/sindresorhus/string-width.git (string-width), https://github.com/chalk/strip-ansi.git (strip-ansi), https://github.com/sindresorhus/strip-bom.git (strip-bom), https://github.com/sindresorhus/strip-eof.git (strip-eof), https://github.com/sindresorhus/strip-indent.git (strip-indent), https://github.com/sindresorhus/strip-json-comments.git (strip-json-comments), https://github.com/sindresorhus/strip-outer.git (strip-outer), https://github.com/chalk/supports-color.git (supports-color), https://github.com/sindresorhus/temp-dir.git (temp-dir), https://github.com/sindresorhus/tempfile.git (tempfile), https://github.com/sindresorhus/trim-newlines.git (trim-newlines), https://github.com/sindresorhus/trim-repeated.git (trim-repeated), https://github.com/sindresorhus/url-parse-lax.git (url-parse-lax). This software contains the following license and notice below:
82
+
83
+ The MIT License (MIT)
84
+
85
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
86
+
87
+ Permission is hereby granted, free of charge, to any person obtaining a copy
88
+ of this software and associated documentation files (the "Software"), to deal
89
+ in the Software without restriction, including without limitation the rights
90
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
91
+ copies of the Software, and to permit persons to whom the Software is
92
+ furnished to do so, subject to the following conditions:
93
+
94
+ The above copyright notice and this permission notice shall be included in
95
+ all copies or substantial portions of the Software.
96
+
97
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
98
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
99
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
100
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
101
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
102
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
103
+ THE SOFTWARE.
104
+
105
+ -----
106
+
107
+ The following software may be included in this product: antd. A copy of the source code may be downloaded from https://github.com/ant-design/ant-design. This software contains the following license and notice below:
108
+
109
+ MIT LICENSE
110
+
111
+ Copyright (c) 2015-present Ant UED, https://xtech.antfin.com/
112
+
113
+ Permission is hereby granted, free of charge, to any person obtaining
114
+ a copy of this software and associated documentation files (the
115
+ "Software"), to deal in the Software without restriction, including
116
+ without limitation the rights to use, copy, modify, merge, publish,
117
+ distribute, sublicense, and/or sell copies of the Software, and to
118
+ permit persons to whom the Software is furnished to do so, subject to
119
+ the following conditions:
120
+
121
+ The above copyright notice and this permission notice shall be
122
+ included in all copies or substantial portions of the Software.
123
+
124
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
125
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
126
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
127
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
128
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
129
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
130
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
131
+
132
+ -----
133
+
134
+ The following software may be included in this product: antd, rc-drawer, rc-image, rc-table, rc-tree, rc-tree-select. A copy of the source code may be downloaded from https://github.com/ant-design/ant-design (antd), https://github.com/ant-motion/drawer.git (rc-drawer), git@github.com:react-component/image.git (rc-image), git@github.com:react-component/table.git (rc-table), git@github.com:react-component/tree.git (rc-tree), https://github.com/react-component/tree-select.git (rc-tree-select). This software contains the following license and notice below:
135
+
136
+ MIT LICENSE
137
+
138
+ Copyright (c) 2015-present Alipay.com, https://www.alipay.com/
139
+
140
+ Permission is hereby granted, free of charge, to any person obtaining
141
+ a copy of this software and associated documentation files (the
142
+ "Software"), to deal in the Software without restriction, including
143
+ without limitation the rights to use, copy, modify, merge, publish,
144
+ distribute, sublicense, and/or sell copies of the Software, and to
145
+ permit persons to whom the Software is furnished to do so, subject to
146
+ the following conditions:
147
+
148
+ The above copyright notice and this permission notice shall be
149
+ included in all copies or substantial portions of the Software.
150
+
151
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
152
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
153
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
154
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
155
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
156
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
157
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
158
+
159
+ -----
160
+
161
+ The following software may be included in this product: array-includes, define-properties, es-abstract. A copy of the source code may be downloaded from git://github.com/es-shims/array-includes.git (array-includes), git://github.com/ljharb/define-properties.git (define-properties), git://github.com/ljharb/es-abstract.git (es-abstract). This software contains the following license and notice below:
162
+
163
+ The MIT License (MIT)
164
+
165
+ Copyright (C) 2015 Jordan Harband
166
+
167
+ Permission is hereby granted, free of charge, to any person obtaining a copy
168
+ of this software and associated documentation files (the "Software"), to deal
169
+ in the Software without restriction, including without limitation the rights
170
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
171
+ copies of the Software, and to permit persons to whom the Software is
172
+ furnished to do so, subject to the following conditions:
173
+
174
+ The above copyright notice and this permission notice shall be included in
175
+ all copies or substantial portions of the Software.
176
+
177
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
178
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
179
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
180
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
181
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
182
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
183
+ THE SOFTWARE.
184
+
185
+ -----
186
+
187
+ The following software may be included in this product: asap. A copy of the source code may be downloaded from https://github.com/kriskowal/asap.git. This software contains the following license and notice below:
188
+
189
+ Copyright 2009–2014 Contributors. All rights reserved.
190
+
191
+ Permission is hereby granted, free of charge, to any person obtaining a copy
192
+ of this software and associated documentation files (the "Software"), to
193
+ deal in the Software without restriction, including without limitation the
194
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
195
+ sell copies of the Software, and to permit persons to whom the Software is
196
+ furnished to do so, subject to the following conditions:
197
+
198
+ The above copyright notice and this permission notice shall be included in
199
+ all copies or substantial portions of the Software.
200
+
201
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
202
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
203
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
204
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
205
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
206
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
207
+ IN THE SOFTWARE.
208
+
209
+ -----
210
+
211
+ The following software may be included in this product: insert-css. A copy of the source code may be downloaded from git://github.com/hughsk/atob-lite.git (atob-lite), git://github.com/hughsk/btoa-lite.git (btoa-lite), git://github.com/substack/camelize.git (camelize), git://github.com/substack/node-concat-map.git (concat-map), git://github.com/shahata/dasherize.git (dasherize), git://github.com/substack/github-from-package.git (github-from-package), git://github.com/substack/insert-css.git (insert-css), git://github.com/hughsk/is-typedarray.git (is-typedarray), git://github.com/substack/minimist.git (minimist), git://github.com/substack/safe-regex.git (safe-regex), git://github.com/substack/node-wordwrap.git (wordwrap). This software contains the following license and notice below:
212
+
213
+ This software is released under the MIT license:
214
+
215
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
216
+ this software and associated documentation files (the "Software"), to deal in
217
+ the Software without restriction, including without limitation the rights to
218
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
219
+ the Software, and to permit persons to whom the Software is furnished to do so,
220
+ subject to the following conditions:
221
+
222
+ The above copyright notice and this permission notice shall be included in all
223
+ copies or substantial portions of the Software.
224
+
225
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
226
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
227
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
228
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
229
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
230
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
231
+
232
+ -----
233
+
234
+ The following software may be included in this product: call-bind, get-intrinsic. A copy of the source code may be downloaded from git+https://github.com/ljharb/call-bind.git (call-bind), git+https://github.com/ljharb/get-intrinsic.git (get-intrinsic). This software contains the following license and notice below:
235
+
236
+ MIT License
237
+
238
+ Copyright (c) 2020 Jordan Harband
239
+
240
+ Permission is hereby granted, free of charge, to any person obtaining a copy
241
+ of this software and associated documentation files (the "Software"), to deal
242
+ in the Software without restriction, including without limitation the rights
243
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
244
+ copies of the Software, and to permit persons to whom the Software is
245
+ furnished to do so, subject to the following conditions:
246
+
247
+ The above copyright notice and this permission notice shall be included in all
248
+ copies or substantial portions of the Software.
249
+
250
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
251
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
252
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
253
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
254
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
255
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
256
+ SOFTWARE.
257
+
258
+ -----
259
+
260
+ The following software may be included in this product: cheerio. A copy of the source code may be downloaded from git://github.com/cheeriojs/cheerio.git. This software contains the following license and notice below:
261
+
262
+ MIT License
263
+
264
+ Copyright (c) 2016 Matt Mueller
265
+
266
+ Permission is hereby granted, free of charge, to any person obtaining a copy
267
+ of this software and associated documentation files (the "Software"), to deal
268
+ in the Software without restriction, including without limitation the rights
269
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
270
+ copies of the Software, and to permit persons to whom the Software is
271
+ furnished to do so, subject to the following conditions:
272
+
273
+ The above copyright notice and this permission notice shall be included in all
274
+ copies or substantial portions of the Software.
275
+
276
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
277
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
278
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
279
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
280
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
281
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
282
+ SOFTWARE.
283
+
284
+ -----
285
+
286
+ The following software may be included in this product: css-select, css-what, domelementtype, domhandler, domutils, entities, nth-check. A copy of the source code may be downloaded from git://github.com/cheeriojs/cheerio-select.git (cheerio-select), git://github.com/fb55/css-select.git (css-select), https://github.com/fb55/css-what (css-what), git://github.com/fb55/domelementtype.git (domelementtype), git://github.com/fb55/domhandler.git (domhandler), git://github.com/fb55/domutils.git (domutils), git://github.com/fb55/entities.git (entities), https://github.com/fb55/nth-check (nth-check). This software contains the following license and notice below:
287
+
288
+ Copyright (c) Felix Böhm
289
+ All rights reserved.
290
+
291
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
292
+
293
+ Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
294
+
295
+ Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
296
+
297
+ THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
298
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
299
+
300
+ -----
301
+
302
+ The following software may be included in this product: lru-cache, semver, yallist. A copy of the source code may be downloaded from git://github.com/isaacs/chownr.git (chownr), https://github.com/npm/dezalgo (dezalgo), git+https://github.com/npm/fs-minipass.git (fs-minipass), https://github.com/npm/fs-write-stream-atomic (fs-write-stream-atomic), https://github.com/npm/fstream.git (fstream), git+https://github.com/isaacs/ignore-walk.git (ignore-walk), git://github.com/isaacs/ini.git (ini), git+https://github.com/isaacs/isexe.git (isexe), git://github.com/isaacs/json-stringify-safe (json-stringify-safe), git://github.com/isaacs/node-lru-cache.git (lru-cache), git://github.com/isaacs/minimatch.git (minimatch), git://github.com/isaacs/mute-stream (mute-stream), https://github.com/npm/nopt.git (nopt), git+https://github.com/npm/npm-packlist.git (npm-packlist), https://github.com/npm/npmlog.git (npmlog), git://github.com/isaacs/once (once), https://github.com/npm/osenv (osenv), https://github.com/isaacs/proto-list (proto-list), git+https://github.com/isaacs/pseudomap.git (pseudomap), git://github.com/isaacs/read.git (read), https://github.com/npm/read-package-tree (read-package-tree), https://github.com/npm/readdir-scoped-modules (readdir-scoped-modules), git://github.com/isaacs/rimraf.git (rimraf), https://github.com/npm/node-semver (semver), https://github.com/npm/node-tar.git (tar), git://github.com/isaacs/node-which.git (which), https://github.com/npm/wrappy (wrappy), git+https://github.com/isaacs/yallist.git (yallist). This software contains the following license and notice below:
303
+
304
+ The ISC License
305
+
306
+ Copyright (c) Isaac Z. Schlueter and Contributors
307
+
308
+ Permission to use, copy, modify, and/or distribute this software for any
309
+ purpose with or without fee is hereby granted, provided that the above
310
+ copyright notice and this permission notice appear in all copies.
311
+
312
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
313
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
314
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
315
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
316
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
317
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
318
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
319
+
320
+ -----
321
+
322
+ The following software may be included in this product: classnames. A copy of the source code may be downloaded from https://github.com/JedWatson/classnames.git. This software contains the following license and notice below:
323
+
324
+ The MIT License (MIT)
325
+
326
+ Copyright (c) 2017 Jed Watson
327
+
328
+ Permission is hereby granted, free of charge, to any person obtaining a copy
329
+ of this software and associated documentation files (the "Software"), to deal
330
+ in the Software without restriction, including without limitation the rights
331
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
332
+ copies of the Software, and to permit persons to whom the Software is
333
+ furnished to do so, subject to the following conditions:
334
+
335
+ The above copyright notice and this permission notice shall be included in all
336
+ copies or substantial portions of the Software.
337
+
338
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
339
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
340
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
341
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
342
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
343
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
344
+ SOFTWARE.
345
+
346
+ -----
347
+
348
+ The following software may be included in this product: classnames. A copy of the source code may be downloaded from https://github.com/JedWatson/classnames.git. This software contains the following license and notice below:
349
+
350
+ The MIT License (MIT)
351
+
352
+ Copyright (c) 2018 Jed Watson
353
+
354
+ Permission is hereby granted, free of charge, to any person obtaining a copy
355
+ of this software and associated documentation files (the "Software"), to deal
356
+ in the Software without restriction, including without limitation the rights
357
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
358
+ copies of the Software, and to permit persons to whom the Software is
359
+ furnished to do so, subject to the following conditions:
360
+
361
+ The above copyright notice and this permission notice shall be included in all
362
+ copies or substantial portions of the Software.
363
+
364
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
365
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
366
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
367
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
368
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
369
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
370
+ SOFTWARE.
371
+
372
+ -----
373
+
374
+ The following software may be included in this product: commander. A copy of the source code may be downloaded from https://github.com/tj/commander.js.git. This software contains the following license and notice below:
375
+
376
+ (The MIT License)
377
+
378
+ Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
379
+
380
+ Permission is hereby granted, free of charge, to any person obtaining
381
+ a copy of this software and associated documentation files (the
382
+ 'Software'), to deal in the Software without restriction, including
383
+ without limitation the rights to use, copy, modify, merge, publish,
384
+ distribute, sublicense, and/or sell copies of the Software, and to
385
+ permit persons to whom the Software is furnished to do so, subject to
386
+ the following conditions:
387
+
388
+ The above copyright notice and this permission notice shall be
389
+ included in all copies or substantial portions of the Software.
390
+
391
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
392
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
393
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
394
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
395
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
396
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
397
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
398
+
399
+ -----
400
+
401
+ The following software may be included in this product: compute-scroll-into-view. A copy of the source code may be downloaded from git+https://github.com/stipsan/compute-scroll-into-view.git. This software contains the following license and notice below:
402
+
403
+ MIT License
404
+
405
+ Copyright (c) 2018 Cody Olsen
406
+
407
+ Permission is hereby granted, free of charge, to any person obtaining a copy
408
+ of this software and associated documentation files (the "Software"), to deal
409
+ in the Software without restriction, including without limitation the rights
410
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
411
+ copies of the Software, and to permit persons to whom the Software is
412
+ furnished to do so, subject to the following conditions:
413
+
414
+ The above copyright notice and this permission notice shall be included in all
415
+ copies or substantial portions of the Software.
416
+
417
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
418
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
419
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
420
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
421
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
422
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
423
+ SOFTWARE.
424
+
425
+ -----
426
+
427
+ The following software may be included in this product: copy-to-clipboard. A copy of the source code may be downloaded from git+https://github.com/sudodoki/copy-to-clipboard. This software contains the following license and notice below:
428
+
429
+ MIT License
430
+
431
+ Copyright (c) 2017 sudodoki <smd.deluzion@gmail.com>
432
+
433
+ Permission is hereby granted, free of charge, to any person obtaining a copy
434
+ of this software and associated documentation files (the "Software"), to deal
435
+ in the Software without restriction, including without limitation the rights
436
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
437
+ copies of the Software, and to permit persons to whom the Software is
438
+ furnished to do so, subject to the following conditions:
439
+
440
+ The above copyright notice and this permission notice shall be included in all
441
+ copies or substantial portions of the Software.
442
+
443
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
444
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
445
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
446
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
447
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
448
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
449
+ SOFTWARE.
450
+
451
+ -----
452
+
453
+ The following software may be included in this product: core-js. A copy of the source code may be downloaded from https://github.com/zloirock/core-js.git. This software contains the following license and notice below:
454
+
455
+ Copyright (c) 2014-2020 Denis Pushkarev
456
+
457
+ Permission is hereby granted, free of charge, to any person obtaining a copy
458
+ of this software and associated documentation files (the "Software"), to deal
459
+ in the Software without restriction, including without limitation the rights
460
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
461
+ copies of the Software, and to permit persons to whom the Software is
462
+ furnished to do so, subject to the following conditions:
463
+
464
+ The above copyright notice and this permission notice shall be included in
465
+ all copies or substantial portions of the Software.
466
+
467
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
468
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
469
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
470
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
471
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
472
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
473
+ THE SOFTWARE.
474
+
475
+ -----
476
+
477
+ The following software may be included in this product: core-js. A copy of the source code may be downloaded from https://github.com/zloirock/core-js.git. This software contains the following license and notice below:
478
+
479
+ Copyright (c) 2014-2021 Denis Pushkarev
480
+
481
+ Permission is hereby granted, free of charge, to any person obtaining a copy
482
+ of this software and associated documentation files (the "Software"), to deal
483
+ in the Software without restriction, including without limitation the rights
484
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
485
+ copies of the Software, and to permit persons to whom the Software is
486
+ furnished to do so, subject to the following conditions:
487
+
488
+ The above copyright notice and this permission notice shall be included in
489
+ all copies or substantial portions of the Software.
490
+
491
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
492
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
493
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
494
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
495
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
496
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
497
+ THE SOFTWARE.
498
+
499
+ -----
500
+
501
+ The following software may be included in this product: core-js. A copy of the source code may be downloaded from https://github.com/zloirock/core-js.git. This software contains the following license and notice below:
502
+
503
+ Copyright (c) 2015 Denis Pushkarev
504
+
505
+ Permission is hereby granted, free of charge, to any person obtaining a copy
506
+ of this software and associated documentation files (the "Software"), to deal
507
+ in the Software without restriction, including without limitation the rights
508
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
509
+ copies of the Software, and to permit persons to whom the Software is
510
+ furnished to do so, subject to the following conditions:
511
+
512
+ The above copyright notice and this permission notice shall be included in
513
+ all copies or substantial portions of the Software.
514
+
515
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
516
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
517
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
518
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
519
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
520
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
521
+ THE SOFTWARE.
522
+
523
+ -----
524
+
525
+ The following software may be included in this product: core-util-is. A copy of the source code may be downloaded from git://github.com/isaacs/core-util-is. This software contains the following license and notice below:
526
+
527
+ Copyright Node.js contributors. All rights reserved.
528
+
529
+ Permission is hereby granted, free of charge, to any person obtaining a copy
530
+ of this software and associated documentation files (the "Software"), to
531
+ deal in the Software without restriction, including without limitation the
532
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
533
+ sell copies of the Software, and to permit persons to whom the Software is
534
+ furnished to do so, subject to the following conditions:
535
+
536
+ The above copyright notice and this permission notice shall be included in
537
+ all copies or substantial portions of the Software.
538
+
539
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
540
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
541
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
542
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
543
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
544
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
545
+ IN THE SOFTWARE.
546
+
547
+ -----
548
+
549
+ The following software may be included in this product: prop-types, react-addons-create-fragment, warning. A copy of the source code may be downloaded from git+https://github.com/facebook/react.git (create-react-class), https://github.com/facebook/prop-types.git (prop-types), https://github.com/facebook/react.git (react-addons-create-fragment), https://github.com/BerkeleyTrue/warning.git (warning). This software contains the following license and notice below:
550
+
551
+ MIT License
552
+
553
+ Copyright (c) 2013-present, Facebook, Inc.
554
+
555
+ Permission is hereby granted, free of charge, to any person obtaining a copy
556
+ of this software and associated documentation files (the "Software"), to deal
557
+ in the Software without restriction, including without limitation the rights
558
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
559
+ copies of the Software, and to permit persons to whom the Software is
560
+ furnished to do so, subject to the following conditions:
561
+
562
+ The above copyright notice and this permission notice shall be included in all
563
+ copies or substantial portions of the Software.
564
+
565
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
566
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
567
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
568
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
569
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
570
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
571
+ SOFTWARE.
572
+
573
+ -----
574
+
575
+ The following software may be included in this product: date-fns. A copy of the source code may be downloaded from https://github.com/date-fns/date-fns. This software contains the following license and notice below:
576
+
577
+ Copyright (C) 2020 Sasha Koss and Lesha Koss
578
+
579
+ # License
580
+
581
+ date-fns is licensed under the [MIT license](http://kossnocorp.mit-license.org).
582
+ Read more about MIT at [TLDRLegal](https://tldrlegal.com/license/mit-license).
583
+
584
+ -----
585
+
586
+ The following software may be included in this product: dayjs. A copy of the source code may be downloaded from https://github.com/iamkun/dayjs.git. This software contains the following license and notice below:
587
+
588
+ MIT License
589
+
590
+ Copyright (c) 2018-present, iamkun
591
+
592
+ Permission is hereby granted, free of charge, to any person obtaining a copy
593
+ of this software and associated documentation files (the "Software"), to deal
594
+ in the Software without restriction, including without limitation the rights
595
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
596
+ copies of the Software, and to permit persons to whom the Software is
597
+ furnished to do so, subject to the following conditions:
598
+
599
+ The above copyright notice and this permission notice shall be included in all
600
+ copies or substantial portions of the Software.
601
+
602
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
603
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
604
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
605
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
606
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
607
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
608
+ SOFTWARE.
609
+
610
+ -----
611
+
612
+ The following software may be included in this product: deepmerge. A copy of the source code may be downloaded from git://github.com/TehShrike/deepmerge.git. This software contains the following license and notice below:
613
+
614
+ The MIT License (MIT)
615
+
616
+ Copyright (c) 2012 James Halliday, Josh Duff, and other contributors
617
+
618
+ Permission is hereby granted, free of charge, to any person obtaining a copy
619
+ of this software and associated documentation files (the "Software"), to deal
620
+ in the Software without restriction, including without limitation the rights
621
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
622
+ copies of the Software, and to permit persons to whom the Software is
623
+ furnished to do so, subject to the following conditions:
624
+
625
+ The above copyright notice and this permission notice shall be included in
626
+ all copies or substantial portions of the Software.
627
+
628
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
629
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
630
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
631
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
632
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
633
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
634
+ THE SOFTWARE.
635
+
636
+ -----
637
+
638
+ The following software may be included in this product: discontinuous-range. A copy of the source code may be downloaded from https://github.com/dtudury/discontinuous-range.git. This software contains the following license and notice below:
639
+
640
+ The MIT License (MIT)
641
+
642
+ Copyright (c) 2014 David Tudury
643
+
644
+ Permission is hereby granted, free of charge, to any person obtaining a copy
645
+ of this software and associated documentation files (the "Software"), to deal
646
+ in the Software without restriction, including without limitation the rights
647
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
648
+ copies of the Software, and to permit persons to whom the Software is
649
+ furnished to do so, subject to the following conditions:
650
+
651
+ The above copyright notice and this permission notice shall be included in all
652
+ copies or substantial portions of the Software.
653
+
654
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
655
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
656
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
657
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
658
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
659
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
660
+ SOFTWARE.
661
+
662
+ -----
663
+
664
+ The following software may be included in this product: dom-serializer. A copy of the source code may be downloaded from git://github.com/cheeriojs/dom-renderer.git. This software contains the following license and notice below:
665
+
666
+ License
667
+
668
+ (The MIT License)
669
+
670
+ Copyright (c) 2014 The cheeriojs contributors
671
+
672
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
673
+
674
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
675
+
676
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
677
+
678
+ -----
679
+
680
+ The following software may be included in this product: encoding. A copy of the source code may be downloaded from https://github.com/andris9/encoding.git. This software contains the following license and notice below:
681
+
682
+ Copyright (c) 2012-2014 Andris Reinman
683
+
684
+ Permission is hereby granted, free of charge, to any person obtaining a copy
685
+ of this software and associated documentation files (the "Software"), to deal
686
+ in the Software without restriction, including without limitation the rights
687
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
688
+ copies of the Software, and to permit persons to whom the Software is
689
+ furnished to do so, subject to the following conditions:
690
+
691
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
692
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
693
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
694
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
695
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
696
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
697
+ SOFTWARE.
698
+
699
+ -----
700
+
701
+ The following software may be included in this product: enzyme. A copy of the source code may be downloaded from https://github.com/airbnb/enzyme.git. This software contains the following license and notice below:
702
+
703
+ The MIT License (MIT)
704
+
705
+ Copyright (c) 2015 Airbnb, Inc.
706
+
707
+ Permission is hereby granted, free of charge, to any person obtaining a copy
708
+ of this software and associated documentation files (the "Software"), to deal
709
+ in the Software without restriction, including without limitation the rights
710
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
711
+ copies of the Software, and to permit persons to whom the Software is
712
+ furnished to do so, subject to the following conditions:
713
+
714
+ The above copyright notice and this permission notice shall be included in all
715
+ copies or substantial portions of the Software.
716
+
717
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
718
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
719
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
720
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
721
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
722
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
723
+ SOFTWARE.
724
+
725
+ -----
726
+
727
+ The following software may be included in this product: enzyme-adapter-react-16, enzyme-adapter-utils, enzyme-shallow-equal. A copy of the source code may be downloaded from https://github.com/enzymejs/enzyme.git (enzyme-adapter-react-16), https://github.com/enzymejs/enzyme.git (enzyme-adapter-utils), https://github.com/enzymejs/enzyme.git (enzyme-shallow-equal). This software contains the following license and notice below:
728
+
729
+ The MIT License (MIT)
730
+
731
+ Copyright (c) 2015 Airbnb, Inc. and contributors
732
+
733
+ Permission is hereby granted, free of charge, to any person obtaining a copy
734
+ of this software and associated documentation files (the "Software"), to deal
735
+ in the Software without restriction, including without limitation the rights
736
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
737
+ copies of the Software, and to permit persons to whom the Software is
738
+ furnished to do so, subject to the following conditions:
739
+
740
+ The above copyright notice and this permission notice shall be included in all
741
+ copies or substantial portions of the Software.
742
+
743
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
744
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
745
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
746
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
747
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
748
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
749
+ SOFTWARE.
750
+
751
+ -----
752
+
753
+ The following software may be included in this product: es-to-primitive, is-boolean-object, is-callable, is-date-object, is-number-object, is-string, is-symbol.entries, object.getownpropertydescriptors, object.values, string-at, string.prototype.trimleft, string.prototype.trimright. A copy of the source code may be downloaded from git://github.com/ljharb/es-to-primitive.git (es-to-primitive), git://github.com/ljharb/is-boolean-object.git (is-boolean-object), git://github.com/ljharb/is-callable.git (is-callable), git://github.com/ljharb/is-date-object.git (is-date-object), git://github.com/inspect-js/is-number-object.git (is-number-object), git://github.com/ljharb/is-string.git (is-string), git://github.com/inspect-js/is-symbol.git (is-symbol), git://github.com/es-shims/Object.entries.git (object.entries), git://github.com/es-shims/object.getownpropertydescriptors.git (object.getownpropertydescriptors), git://github.com/es-shims/Object.values.git (object.values), git://github.com/ljharb/string-at.git (string-at), git://github.com/es-shims/String.prototype.trimLeft.git (string.prototype.trimleft), git://github.com/es-shims/String.prototype.trimRight.git (string.prototype.trimright). This software contains the following license and notice below:
754
+
755
+ The MIT License (MIT)
756
+
757
+ Copyright (c) 2015 Jordan Harband
758
+
759
+ Permission is hereby granted, free of charge, to any person obtaining a copy
760
+ of this software and associated documentation files (the "Software"), to deal
761
+ in the Software without restriction, including without limitation the rights
762
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
763
+ copies of the Software, and to permit persons to whom the Software is
764
+ furnished to do so, subject to the following conditions:
765
+
766
+ The above copyright notice and this permission notice shall be included in all
767
+ copies or substantial portions of the Software.
768
+
769
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
770
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
771
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
772
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
773
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
774
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
775
+ SOFTWARE.
776
+
777
+ -----
778
+
779
+ The following software may be included in this product: es6-shim. A copy of the source code may be downloaded from git://github.com/paulmillr/es6-shim.git. This software contains the following license and notice below:
780
+
781
+ MIT License
782
+
783
+ Copyright (c) 2019 Paul Miller (https://paulmillr.com)
784
+
785
+ Permission is hereby granted, free of charge, to any person obtaining a copy
786
+ of this software and associated documentation files (the "Software"), to deal
787
+ in the Software without restriction, including without limitation the rights
788
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
789
+ copies of the Software, and to permit persons to whom the Software is
790
+ furnished to do so, subject to the following conditions:
791
+
792
+ The above copyright notice and this permission notice shall be included in all
793
+ copies or substantial portions of the Software.
794
+
795
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
796
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
797
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
798
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
799
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
800
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
801
+ SOFTWARE.
802
+
803
+ -----
804
+
805
+ The following software may be included in this product: es7-shim. A copy of the source code may be downloaded from http://github.com/es-shims/es7-shim.git. This software contains the following license and notice below:
806
+
807
+ The MIT License (MIT)
808
+
809
+ Copyright (C) 2015-2016 Jordan Harband and contributors
810
+
811
+ Permission is hereby granted, free of charge, to any person obtaining a copy
812
+ of this software and associated documentation files (the "Software"), to deal
813
+ in the Software without restriction, including without limitation the rights
814
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
815
+ copies of the Software, and to permit persons to whom the Software is
816
+ furnished to do so, subject to the following conditions:
817
+
818
+ The above copyright notice and this permission notice shall be included in
819
+ all copies or substantial portions of the Software.
820
+
821
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
822
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
823
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
824
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
825
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
826
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
827
+ THE SOFTWARE.
828
+
829
+ -----
830
+
831
+ The following software may be included in this product: eventemitter3. A copy of the source code may be downloaded from git://github.com/primus/eventemitter3.git. This software contains the following license and notice below:
832
+
833
+ The MIT License (MIT)
834
+
835
+ Copyright (c) 2014 Arnout Kazemier
836
+
837
+ Permission is hereby granted, free of charge, to any person obtaining a copy
838
+ of this software and associated documentation files (the "Software"), to deal
839
+ in the Software without restriction, including without limitation the rights
840
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
841
+ copies of the Software, and to permit persons to whom the Software is
842
+ furnished to do so, subject to the following conditions:
843
+
844
+ The above copyright notice and this permission notice shall be included in all
845
+ copies or substantial portions of the Software.
846
+
847
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
848
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
849
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
850
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
851
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
852
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
853
+ SOFTWARE.
854
+
855
+ -----
856
+
857
+ The following software may be included in this product: fbjs. A copy of the source code may be downloaded from https://github.com/facebook/fbjs.git. This software contains the following license and notice below:
858
+
859
+ MIT License
860
+
861
+ Copyright (c) 2013-present, Facebook, Inc.
862
+
863
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
864
+ this software and associated documentation files (the "Software"), to deal in
865
+ the Software without restriction, including without limitation the rights to
866
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
867
+ the Software, and to permit persons to whom the Software is furnished to do so,
868
+ subject to the following conditions:
869
+
870
+ The above copyright notice and this permission notice shall be included in all
871
+ copies or substantial portions of the Software.
872
+
873
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
874
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
875
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
876
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
877
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
878
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
879
+
880
+ -----
881
+
882
+ The following software may be included in this product: function-bind. A copy of the source code may be downloaded from git://github.com/Raynos/function-bind.git. This software contains the following license and notice below:
883
+
884
+ Copyright (c) 2013 Raynos.
885
+
886
+ Permission is hereby granted, free of charge, to any person obtaining a copy
887
+ of this software and associated documentation files (the "Software"), to deal
888
+ in the Software without restriction, including without limitation the rights
889
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
890
+ copies of the Software, and to permit persons to whom the Software is
891
+ furnished to do so, subject to the following conditions:
892
+
893
+ The above copyright notice and this permission notice shall be included in
894
+ all copies or substantial portions of the Software.
895
+
896
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
897
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
898
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
899
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
900
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
901
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
902
+ THE SOFTWARE.
903
+
904
+ -----
905
+
906
+ The following software may be included in this product: functions-have-names, html-element-map. A copy of the source code may be downloaded from git+https://github.com/inspect-js/functions-have-names.git (functions-have-names), git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/html-element-map.git (html-element-map), git+https://github.com/ljharb/side-channel.git (side-channel), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below:
907
+
908
+ MIT License
909
+
910
+ Copyright (c) 2019 Jordan Harband
911
+
912
+ Permission is hereby granted, free of charge, to any person obtaining a copy
913
+ of this software and associated documentation files (the "Software"), to deal
914
+ in the Software without restriction, including without limitation the rights
915
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
916
+ copies of the Software, and to permit persons to whom the Software is
917
+ furnished to do so, subject to the following conditions:
918
+
919
+ The above copyright notice and this permission notice shall be included in all
920
+ copies or substantial portions of the Software.
921
+
922
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
923
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
924
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
925
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
926
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
927
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
928
+ SOFTWARE.
929
+
930
+ -----
931
+
932
+ The following software may be included in this product: gettext-parser. A copy of the source code may be downloaded from http://github.com/smhg/gettext-parser.git. This software contains the following license and notice below:
933
+
934
+ Copyright (c) 2014-2015 Andris Reinman
935
+
936
+ Permission is hereby granted, free of charge, to any person obtaining a copy
937
+ of this software and associated documentation files (the "Software"), to deal
938
+ in the Software without restriction, including without limitation the rights
939
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
940
+ copies of the Software, and to permit persons to whom the Software is
941
+ furnished to do so, subject to the following conditions:
942
+
943
+ The above copyright notice and this permission notice shall be included in
944
+ all copies or substantial portions of the Software.
945
+
946
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
947
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
948
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
949
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
950
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
951
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
952
+ THE SOFTWARE.
953
+
954
+ -----
955
+
956
+ The following software may be included in this product: has-symbols. A copy of the source code may be downloaded from git://github.com/inspect-js/has-symbols.git. This software contains the following license and notice below:
957
+
958
+ MIT License
959
+
960
+ Copyright (c) 2016 Jordan Harband
961
+
962
+ Permission is hereby granted, free of charge, to any person obtaining a copy
963
+ of this software and associated documentation files (the "Software"), to deal
964
+ in the Software without restriction, including without limitation the rights
965
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
966
+ copies of the Software, and to permit persons to whom the Software is
967
+ furnished to do so, subject to the following conditions:
968
+
969
+ The above copyright notice and this permission notice shall be included in all
970
+ copies or substantial portions of the Software.
971
+
972
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
973
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
974
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
975
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
976
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
977
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
978
+ SOFTWARE.
979
+
980
+ -----
981
+
982
+ The following software may be included in this product: hoist-non-react-statics. A copy of the source code may be downloaded from git://github.com/mridgway/hoist-non-react-statics.git. This software contains the following license and notice below:
983
+
984
+ Software License Agreement (BSD License)
985
+ ========================================
986
+
987
+ Copyright (c) 2015, Yahoo! Inc. All rights reserved.
988
+ ----------------------------------------------------
989
+
990
+ Redistribution and use of this software in source and binary forms, with or
991
+ without modification, are permitted provided that the following conditions are
992
+ met:
993
+
994
+ * Redistributions of source code must retain the above copyright notice, this
995
+ list of conditions and the following disclaimer.
996
+ * Redistributions in binary form must reproduce the above copyright notice,
997
+ this list of conditions and the following disclaimer in the documentation
998
+ and/or other materials provided with the distribution.
999
+ * Neither the name of Yahoo! Inc. nor the names of YUI's contributors may be
1000
+ used to endorse or promote products derived from this software without
1001
+ specific prior written permission of Yahoo! Inc.
1002
+
1003
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1004
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1005
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1006
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
1007
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1008
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1009
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
1010
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1011
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
1012
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1013
+
1014
+ -----
1015
+
1016
+ The following software may be included in this product: htmlparser2. A copy of the source code may be downloaded from git://github.com/fb55/htmlparser2.git. This software contains the following license and notice below:
1017
+
1018
+ Copyright 2010, 2011, Chris Winberry <chris@winberry.net>. All rights reserved.
1019
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1020
+ of this software and associated documentation files (the "Software"), to
1021
+ deal in the Software without restriction, including without limitation the
1022
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
1023
+ sell copies of the Software, and to permit persons to whom the Software is
1024
+ furnished to do so, subject to the following conditions:
1025
+
1026
+ The above copyright notice and this permission notice shall be included in
1027
+ all copies or substantial portions of the Software.
1028
+
1029
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1030
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1031
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1032
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1033
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1034
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
1035
+ IN THE SOFTWARE.
1036
+
1037
+ -----
1038
+
1039
+ The following software may be included in this product: i18n-react. A copy of the source code may be downloaded from https://github.com/alexdrel/i18n-react. This software contains the following license and notice below:
1040
+
1041
+ The MIT License
1042
+
1043
+ Copyright (C) 2015 Alex Drel
1044
+
1045
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
1046
+ this software and associated documentation files (the "Software"), to deal in
1047
+ the Software without restriction, including without limitation the rights to
1048
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
1049
+ of the Software, and to permit persons to whom the Software is furnished to do
1050
+ so, subject to the following conditions:
1051
+
1052
+ The above copyright notice and this permission notice shall be included in all
1053
+ copies or substantial portions of the Software.
1054
+
1055
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1056
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
1057
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
1058
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
1059
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1060
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1061
+
1062
+ -----
1063
+
1064
+ The following software may be included in this product: iconv-lite. A copy of the source code may be downloaded from git://github.com/ashtuchkin/iconv-lite.git. This software contains the following license and notice below:
1065
+
1066
+ Copyright (c) 2011 Alexander Shtuchkin
1067
+
1068
+ Permission is hereby granted, free of charge, to any person obtaining
1069
+ a copy of this software and associated documentation files (the
1070
+ "Software"), to deal in the Software without restriction, including
1071
+ without limitation the rights to use, copy, modify, merge, publish,
1072
+ distribute, sublicense, and/or sell copies of the Software, and to
1073
+ permit persons to whom the Software is furnished to do so, subject to
1074
+ the following conditions:
1075
+
1076
+ The above copyright notice and this permission notice shall be
1077
+ included in all copies or substantial portions of the Software.
1078
+
1079
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1080
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1081
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1082
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1083
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1084
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1085
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1086
+
1087
+ -----
1088
+
1089
+ The following software may be included in this product: immer. A copy of the source code may be downloaded from https://github.com/mweststrate/immer.git. This software contains the following license and notice below:
1090
+
1091
+ MIT License
1092
+
1093
+ Copyright (c) 2017 Michel Weststrate
1094
+
1095
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1096
+ of this software and associated documentation files (the "Software"), to deal
1097
+ in the Software without restriction, including without limitation the rights
1098
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1099
+ copies of the Software, and to permit persons to whom the Software is
1100
+ furnished to do so, subject to the following conditions:
1101
+
1102
+ The above copyright notice and this permission notice shall be included in all
1103
+ copies or substantial portions of the Software.
1104
+
1105
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1106
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1107
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1108
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1109
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1110
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1111
+ SOFTWARE.
1112
+
1113
+ -----
1114
+
1115
+ The following software may be included in this product: regenerator-runtime. A copy of the source code may be downloaded from git://github.com/facebook/immutable-js.git (immutable), https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime (regenerator-runtime). This software contains the following license and notice below:
1116
+
1117
+ MIT License
1118
+
1119
+ Copyright (c) 2014-present, Facebook, Inc.
1120
+
1121
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1122
+ of this software and associated documentation files (the "Software"), to deal
1123
+ in the Software without restriction, including without limitation the rights
1124
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1125
+ copies of the Software, and to permit persons to whom the Software is
1126
+ furnished to do so, subject to the following conditions:
1127
+
1128
+ The above copyright notice and this permission notice shall be included in all
1129
+ copies or substantial portions of the Software.
1130
+
1131
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1132
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1133
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1134
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1135
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1136
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1137
+ SOFTWARE.
1138
+
1139
+ -----
1140
+
1141
+ The following software may be included in this product: inherits. A copy of the source code may be downloaded from git://github.com/isaacs/inherits. This software contains the following license and notice below:
1142
+
1143
+ The ISC License
1144
+
1145
+ Copyright (c) Isaac Z. Schlueter
1146
+
1147
+ Permission to use, copy, modify, and/or distribute this software for any
1148
+ purpose with or without fee is hereby granted, provided that the above
1149
+ copyright notice and this permission notice appear in all copies.
1150
+
1151
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1152
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
1153
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1154
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1155
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1156
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1157
+ PERFORMANCE OF THIS SOFTWARE.
1158
+
1159
+ -----
1160
+
1161
+ The following software may be included in this product: interpolate-components. A copy of the source code may be downloaded from git+https://github.com/Automattic/interpolate-components.git. This software contains the following license and notice below:
1162
+
1163
+ The GNU General Public License, Version 2, June 1991 (GPLv2)
1164
+ ============================================================
1165
+
1166
+ > Copyright (C) 1989, 1991 Free Software Foundation, Inc.
1167
+ > 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
1168
+
1169
+ Everyone is permitted to copy and distribute verbatim copies of this license
1170
+ document, but changing it is not allowed.
1171
+
1172
+
1173
+ Preamble
1174
+ --------
1175
+
1176
+ The licenses for most software are designed to take away your freedom to share
1177
+ and change it. By contrast, the GNU General Public License is intended to
1178
+ guarantee your freedom to share and change free software--to make sure the
1179
+ software is free for all its users. This General Public License applies to most
1180
+ of the Free Software Foundation's software and to any other program whose
1181
+ authors commit to using it. (Some other Free Software Foundation software is
1182
+ covered by the GNU Library General Public License instead.) You can apply it to
1183
+ your programs, too.
1184
+
1185
+ When we speak of free software, we are referring to freedom, not price. Our
1186
+ General Public Licenses are designed to make sure that you have the freedom to
1187
+ distribute copies of free software (and charge for this service if you wish),
1188
+ that you receive source code or can get it if you want it, that you can change
1189
+ the software or use pieces of it in new free programs; and that you know you can
1190
+ do these things.
1191
+
1192
+ To protect your rights, we need to make restrictions that forbid anyone to deny
1193
+ you these rights or to ask you to surrender the rights. These restrictions
1194
+ translate to certain responsibilities for you if you distribute copies of the
1195
+ software, or if you modify it.
1196
+
1197
+ For example, if you distribute copies of such a program, whether gratis or for a
1198
+ fee, you must give the recipients all the rights that you have. You must make
1199
+ sure that they, too, receive or can get the source code. And you must show them
1200
+ these terms so they know their rights.
1201
+
1202
+ We protect your rights with two steps: (1) copyright the software, and (2) offer
1203
+ you this license which gives you legal permission to copy, distribute and/or
1204
+ modify the software.
1205
+
1206
+ Also, for each author's protection and ours, we want to make certain that
1207
+ everyone understands that there is no warranty for this free software. If the
1208
+ software is modified by someone else and passed on, we want its recipients to
1209
+ know that what they have is not the original, so that any problems introduced by
1210
+ others will not reflect on the original authors' reputations.
1211
+
1212
+ Finally, any free program is threatened constantly by software patents. We wish
1213
+ to avoid the danger that redistributors of a free program will individually
1214
+ obtain patent licenses, in effect making the program proprietary. To prevent
1215
+ this, we have made it clear that any patent must be licensed for everyone's free
1216
+ use or not licensed at all.
1217
+
1218
+ The precise terms and conditions for copying, distribution and modification
1219
+ follow.
1220
+
1221
+
1222
+ Terms And Conditions For Copying, Distribution And Modification
1223
+ ---------------------------------------------------------------
1224
+
1225
+ **0.** This License applies to any program or other work which contains a notice
1226
+ placed by the copyright holder saying it may be distributed under the terms of
1227
+ this General Public License. The "Program", below, refers to any such program or
1228
+ work, and a "work based on the Program" means either the Program or any
1229
+ derivative work under copyright law: that is to say, a work containing the
1230
+ Program or a portion of it, either verbatim or with modifications and/or
1231
+ translated into another language. (Hereinafter, translation is included without
1232
+ limitation in the term "modification".) Each licensee is addressed as "you".
1233
+
1234
+ Activities other than copying, distribution and modification are not covered by
1235
+ this License; they are outside its scope. The act of running the Program is not
1236
+ restricted, and the output from the Program is covered only if its contents
1237
+ constitute a work based on the Program (independent of having been made by
1238
+ running the Program). Whether that is true depends on what the Program does.
1239
+
1240
+ **1.** You may copy and distribute verbatim copies of the Program's source code
1241
+ as you receive it, in any medium, provided that you conspicuously and
1242
+ appropriately publish on each copy an appropriate copyright notice and
1243
+ disclaimer of warranty; keep intact all the notices that refer to this License
1244
+ and to the absence of any warranty; and give any other recipients of the Program
1245
+ a copy of this License along with the Program.
1246
+
1247
+ You may charge a fee for the physical act of transferring a copy, and you may at
1248
+ your option offer warranty protection in exchange for a fee.
1249
+
1250
+ **2.** You may modify your copy or copies of the Program or any portion of it,
1251
+ thus forming a work based on the Program, and copy and distribute such
1252
+ modifications or work under the terms of Section 1 above, provided that you also
1253
+ meet all of these conditions:
1254
+
1255
+ * **a)** You must cause the modified files to carry prominent notices stating
1256
+ that you changed the files and the date of any change.
1257
+
1258
+ * **b)** You must cause any work that you distribute or publish, that in whole
1259
+ or in part contains or is derived from the Program or any part thereof, to
1260
+ be licensed as a whole at no charge to all third parties under the terms of
1261
+ this License.
1262
+
1263
+ * **c)** If the modified program normally reads commands interactively when
1264
+ run, you must cause it, when started running for such interactive use in the
1265
+ most ordinary way, to print or display an announcement including an
1266
+ appropriate copyright notice and a notice that there is no warranty (or
1267
+ else, saying that you provide a warranty) and that users may redistribute
1268
+ the program under these conditions, and telling the user how to view a copy
1269
+ of this License. (Exception: if the Program itself is interactive but does
1270
+ not normally print such an announcement, your work based on the Program is
1271
+ not required to print an announcement.)
1272
+
1273
+ These requirements apply to the modified work as a whole. If identifiable
1274
+ sections of that work are not derived from the Program, and can be reasonably
1275
+ considered independent and separate works in themselves, then this License, and
1276
+ its terms, do not apply to those sections when you distribute them as separate
1277
+ works. But when you distribute the same sections as part of a whole which is a
1278
+ work based on the Program, the distribution of the whole must be on the terms of
1279
+ this License, whose permissions for other licensees extend to the entire whole,
1280
+ and thus to each and every part regardless of who wrote it.
1281
+
1282
+ Thus, it is not the intent of this section to claim rights or contest your
1283
+ rights to work written entirely by you; rather, the intent is to exercise the
1284
+ right to control the distribution of derivative or collective works based on the
1285
+ Program.
1286
+
1287
+ In addition, mere aggregation of another work not based on the Program with the
1288
+ Program (or with a work based on the Program) on a volume of a storage or
1289
+ distribution medium does not bring the other work under the scope of this
1290
+ License.
1291
+
1292
+ **3.** You may copy and distribute the Program (or a work based on it, under
1293
+ Section 2) in object code or executable form under the terms of Sections 1 and 2
1294
+ above provided that you also do one of the following:
1295
+
1296
+ * **a)** Accompany it with the complete corresponding machine-readable source
1297
+ code, which must be distributed under the terms of Sections 1 and 2 above on
1298
+ a medium customarily used for software interchange; or,
1299
+
1300
+ * **b)** Accompany it with a written offer, valid for at least three years, to
1301
+ give any third party, for a charge no more than your cost of physically
1302
+ performing source distribution, a complete machine-readable copy of the
1303
+ corresponding source code, to be distributed under the terms of Sections 1
1304
+ and 2 above on a medium customarily used for software interchange; or,
1305
+
1306
+ * **c)** Accompany it with the information you received as to the offer to
1307
+ distribute corresponding source code. (This alternative is allowed only for
1308
+ noncommercial distribution and only if you received the program in object
1309
+ code or executable form with such an offer, in accord with Subsection b
1310
+ above.)
1311
+
1312
+ The source code for a work means the preferred form of the work for making
1313
+ modifications to it. For an executable work, complete source code means all the
1314
+ source code for all modules it contains, plus any associated interface
1315
+ definition files, plus the scripts used to control compilation and installation
1316
+ of the executable. However, as a special exception, the source code distributed
1317
+ need not include anything that is normally distributed (in either source or
1318
+ binary form) with the major components (compiler, kernel, and so on) of the
1319
+ operating system on which the executable runs, unless that component itself
1320
+ accompanies the executable.
1321
+
1322
+ If distribution of executable or object code is made by offering access to copy
1323
+ from a designated place, then offering equivalent access to copy the source code
1324
+ from the same place counts as distribution of the source code, even though third
1325
+ parties are not compelled to copy the source along with the object code.
1326
+
1327
+ **4.** You may not copy, modify, sublicense, or distribute the Program except as
1328
+ expressly provided under this License. Any attempt otherwise to copy, modify,
1329
+ sublicense or distribute the Program is void, and will automatically terminate
1330
+ your rights under this License. However, parties who have received copies, or
1331
+ rights, from you under this License will not have their licenses terminated so
1332
+ long as such parties remain in full compliance.
1333
+
1334
+ **5.** You are not required to accept this License, since you have not signed
1335
+ it. However, nothing else grants you permission to modify or distribute the
1336
+ Program or its derivative works. These actions are prohibited by law if you do
1337
+ not accept this License. Therefore, by modifying or distributing the Program (or
1338
+ any work based on the Program), you indicate your acceptance of this License to
1339
+ do so, and all its terms and conditions for copying, distributing or modifying
1340
+ the Program or works based on it.
1341
+
1342
+ **6.** Each time you redistribute the Program (or any work based on the
1343
+ Program), the recipient automatically receives a license from the original
1344
+ licensor to copy, distribute or modify the Program subject to these terms and
1345
+ conditions. You may not impose any further restrictions on the recipients'
1346
+ exercise of the rights granted herein. You are not responsible for enforcing
1347
+ compliance by third parties to this License.
1348
+
1349
+ **7.** If, as a consequence of a court judgment or allegation of patent
1350
+ infringement or for any other reason (not limited to patent issues), conditions
1351
+ are imposed on you (whether by court order, agreement or otherwise) that
1352
+ contradict the conditions of this License, they do not excuse you from the
1353
+ conditions of this License. If you cannot distribute so as to satisfy
1354
+ simultaneously your obligations under this License and any other pertinent
1355
+ obligations, then as a consequence you may not distribute the Program at all.
1356
+ For example, if a patent license would not permit royalty-free redistribution of
1357
+ the Program by all those who receive copies directly or indirectly through you,
1358
+ then the only way you could satisfy both it and this License would be to refrain
1359
+ entirely from distribution of the Program.
1360
+
1361
+ If any portion of this section is held invalid or unenforceable under any
1362
+ particular circumstance, the balance of the section is intended to apply and the
1363
+ section as a whole is intended to apply in other circumstances.
1364
+
1365
+ It is not the purpose of this section to induce you to infringe any patents or
1366
+ other property right claims or to contest validity of any such claims; this
1367
+ section has the sole purpose of protecting the integrity of the free software
1368
+ distribution system, which is implemented by public license practices. Many
1369
+ people have made generous contributions to the wide range of software
1370
+ distributed through that system in reliance on consistent application of that
1371
+ system; it is up to the author/donor to decide if he or she is willing to
1372
+ distribute software through any other system and a licensee cannot impose that
1373
+ choice.
1374
+
1375
+ This section is intended to make thoroughly clear what is believed to be a
1376
+ consequence of the rest of this License.
1377
+
1378
+ **8.** If the distribution and/or use of the Program is restricted in certain
1379
+ countries either by patents or by copyrighted interfaces, the original copyright
1380
+ holder who places the Program under this License may add an explicit
1381
+ geographical distribution limitation excluding those countries, so that
1382
+ distribution is permitted only in or among countries not thus excluded. In such
1383
+ case, this License incorporates the limitation as if written in the body of this
1384
+ License.
1385
+
1386
+ **9.** The Free Software Foundation may publish revised and/or new versions of
1387
+ the General Public License from time to time. Such new versions will be similar
1388
+ in spirit to the present version, but may differ in detail to address new
1389
+ problems or concerns.
1390
+
1391
+ Each version is given a distinguishing version number. If the Program specifies
1392
+ a version number of this License which applies to it and "any later version",
1393
+ you have the option of following the terms and conditions either of that version
1394
+ or of any later version published by the Free Software Foundation. If the
1395
+ Program does not specify a version number of this License, you may choose any
1396
+ version ever published by the Free Software Foundation.
1397
+
1398
+ **10.** If you wish to incorporate parts of the Program into other free programs
1399
+ whose distribution conditions are different, write to the author to ask for
1400
+ permission. For software which is copyrighted by the Free Software Foundation,
1401
+ write to the Free Software Foundation; we sometimes make exceptions for this.
1402
+ Our decision will be guided by the two goals of preserving the free status of
1403
+ all derivatives of our free software and of promoting the sharing and reuse of
1404
+ software generally.
1405
+
1406
+
1407
+ No Warranty
1408
+ -----------
1409
+
1410
+ **11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
1411
+ THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
1412
+ STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
1413
+ "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
1414
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
1415
+ PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
1416
+ PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
1417
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
1418
+
1419
+ **12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
1420
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
1421
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
1422
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
1423
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
1424
+ BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
1425
+ FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
1426
+ OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
1427
+
1428
+ -----
1429
+
1430
+ The following software may be included in this product: safe-buffer. A copy of the source code may be downloaded from git://github.com/feross/is-buffer.git (is-buffer), git://github.com/feross/safe-buffer.git (safe-buffer). This software contains the following license and notice below:
1431
+
1432
+ The MIT License (MIT)
1433
+
1434
+ Copyright (c) Feross Aboukhadijeh
1435
+
1436
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1437
+ of this software and associated documentation files (the "Software"), to deal
1438
+ in the Software without restriction, including without limitation the rights
1439
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1440
+ copies of the Software, and to permit persons to whom the Software is
1441
+ furnished to do so, subject to the following conditions:
1442
+
1443
+ The above copyright notice and this permission notice shall be included in
1444
+ all copies or substantial portions of the Software.
1445
+
1446
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1447
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1448
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1449
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1450
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1451
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1452
+ THE SOFTWARE.
1453
+
1454
+ -----
1455
+
1456
+ The following software may be included in this product: is-negative-zero, is-regex, object-is. A copy of the source code may be downloaded from git://github.com/es-shims/is-nan.git (is-nan), git://github.com/inspect-js/is-negative-zero.git (is-negative-zero), git://github.com/inspect-js/is-regex.git (is-regex), git://github.com/es-shims/object-is.git (object-is). This software contains the following license and notice below:
1457
+
1458
+ The MIT License (MIT)
1459
+
1460
+ Copyright (c) 2014 Jordan Harband
1461
+
1462
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
1463
+ this software and associated documentation files (the "Software"), to deal in
1464
+ the Software without restriction, including without limitation the rights to
1465
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
1466
+ the Software, and to permit persons to whom the Software is furnished to do so,
1467
+ subject to the following conditions:
1468
+
1469
+ The above copyright notice and this permission notice shall be included in all
1470
+ copies or substantial portions of the Software.
1471
+
1472
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1473
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
1474
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
1475
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
1476
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1477
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1478
+
1479
+ -----
1480
+
1481
+ The following software may be included in this product: is-subset. A copy of the source code may be downloaded from git@github.com:studio-b12/is-subset.git. This software contains the following license and notice below:
1482
+
1483
+ Copyright © 2015 Studio B12 GmbH
1484
+
1485
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
1486
+
1487
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
1488
+
1489
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1490
+
1491
+ -----
1492
+
1493
+ The following software may be included in this product: isomorphic-fetch. A copy of the source code may be downloaded from https://github.com/matthew-andrews/isomorphic-fetch.git. This software contains the following license and notice below:
1494
+
1495
+ The MIT License (MIT)
1496
+
1497
+ Copyright (c) 2015 Matt Andrews
1498
+
1499
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1500
+ of this software and associated documentation files (the "Software"), to deal
1501
+ in the Software without restriction, including without limitation the rights
1502
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1503
+ copies of the Software, and to permit persons to whom the Software is
1504
+ furnished to do so, subject to the following conditions:
1505
+
1506
+ The above copyright notice and this permission notice shall be included in all
1507
+ copies or substantial portions of the Software.
1508
+
1509
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1510
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1511
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1512
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1513
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1514
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1515
+ SOFTWARE.
1516
+
1517
+ -----
1518
+
1519
+ The following software may be included in this product: jquery. A copy of the source code may be downloaded from https://github.com/jquery/jquery.git. This software contains the following license and notice below:
1520
+
1521
+ Copyright JS Foundation and other contributors, https://js.foundation/
1522
+
1523
+ Permission is hereby granted, free of charge, to any person obtaining
1524
+ a copy of this software and associated documentation files (the
1525
+ "Software"), to deal in the Software without restriction, including
1526
+ without limitation the rights to use, copy, modify, merge, publish,
1527
+ distribute, sublicense, and/or sell copies of the Software, and to
1528
+ permit persons to whom the Software is furnished to do so, subject to
1529
+ the following conditions:
1530
+
1531
+ The above copyright notice and this permission notice shall be
1532
+ included in all copies or substantial portions of the Software.
1533
+
1534
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1535
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1536
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1537
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1538
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1539
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1540
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1541
+
1542
+ -----
1543
+
1544
+ The following software may be included in this product: js-tokens. A copy of the source code may be downloaded from https://github.com/lydell/js-tokens.git. This software contains the following license and notice below:
1545
+
1546
+ The MIT License (MIT)
1547
+
1548
+ Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell
1549
+
1550
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1551
+ of this software and associated documentation files (the "Software"), to deal
1552
+ in the Software without restriction, including without limitation the rights
1553
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1554
+ copies of the Software, and to permit persons to whom the Software is
1555
+ furnished to do so, subject to the following conditions:
1556
+
1557
+ The above copyright notice and this permission notice shall be included in
1558
+ all copies or substantial portions of the Software.
1559
+
1560
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1561
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1562
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1563
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1564
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1565
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1566
+ THE SOFTWARE.
1567
+
1568
+ -----
1569
+
1570
+ The following software may be included in this product: json-form-data. A copy of the source code may be downloaded from git+https://github.com/hyperatom/json-form-data.git. This software contains the following license and notice below:
1571
+
1572
+ MIT License
1573
+
1574
+ Copyright (c) 2018 Adam Barrell
1575
+
1576
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1577
+ of this software and associated documentation files (the "Software"), to deal
1578
+ in the Software without restriction, including without limitation the rights
1579
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1580
+ copies of the Software, and to permit persons to whom the Software is
1581
+ furnished to do so, subject to the following conditions:
1582
+
1583
+ The above copyright notice and this permission notice shall be included in all
1584
+ copies or substantial portions of the Software.
1585
+
1586
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1587
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1588
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1589
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1590
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1591
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1592
+ SOFTWARE.
1593
+
1594
+ -----
1595
+
1596
+ The following software may be included in this product: lil-uri. A copy of the source code may be downloaded from https://github.com/lil-js/uri.git. This software contains the following license and notice below:
1597
+
1598
+ The MIT License
1599
+
1600
+ Copyright (c) Tomas Aparicio and contributors
1601
+
1602
+ Permission is hereby granted, free of charge, to any person
1603
+ obtaining a copy of this software and associated documentation
1604
+ files (the "Software"), to deal in the Software without
1605
+ restriction, including without limitation the rights to use,
1606
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
1607
+ copies of the Software, and to permit persons to whom the
1608
+ Software is furnished to do so, subject to the following
1609
+ conditions:
1610
+
1611
+ The above copyright notice and this permission notice shall be
1612
+ included in all copies or substantial portions of the Software.
1613
+
1614
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1615
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1616
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1617
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
1618
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1619
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1620
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
1621
+ OTHER DEALINGS IN THE SOFTWARE.
1622
+
1623
+ -----
1624
+
1625
+ The following software may be included in this product: lodash, lodash.template, lodash.templatesettings. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git (lodash), https://github.com/lodash/lodash.git (lodash.template), https://github.com/lodash/lodash.git (lodash.templatesettings). This software contains the following license and notice below:
1626
+
1627
+ Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
1628
+
1629
+ Based on Underscore.js, copyright Jeremy Ashkenas,
1630
+ DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
1631
+
1632
+ This software consists of voluntary contributions made by many
1633
+ individuals. For exact contribution history, see the revision history
1634
+ available at https://github.com/lodash/lodash
1635
+
1636
+ The following license applies to all parts of this software except as
1637
+ documented below:
1638
+
1639
+ ====
1640
+
1641
+ Permission is hereby granted, free of charge, to any person obtaining
1642
+ a copy of this software and associated documentation files (the
1643
+ "Software"), to deal in the Software without restriction, including
1644
+ without limitation the rights to use, copy, modify, merge, publish,
1645
+ distribute, sublicense, and/or sell copies of the Software, and to
1646
+ permit persons to whom the Software is furnished to do so, subject to
1647
+ the following conditions:
1648
+
1649
+ The above copyright notice and this permission notice shall be
1650
+ included in all copies or substantial portions of the Software.
1651
+
1652
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1653
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1654
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1655
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1656
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1657
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1658
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1659
+
1660
+ ====
1661
+
1662
+ Copyright and related rights for sample code are waived via CC0. Sample
1663
+ code is defined as all source code displayed within the prose of the
1664
+ documentation.
1665
+
1666
+ CC0: http://creativecommons.org/publicdomain/zero/1.0/
1667
+
1668
+ ====
1669
+
1670
+ Files located in the node_modules and vendor directories are externally
1671
+ maintained libraries used by this software which have their own
1672
+ licenses; we recommend you read them, as their terms may differ from the
1673
+ terms above.
1674
+
1675
+ -----
1676
+
1677
+ The following software may be included in this product: lodash._reinterpolate. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git. This software contains the following license and notice below:
1678
+
1679
+ Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
1680
+ Based on Underscore.js 1.7.0, copyright 2009-2015 Jeremy Ashkenas,
1681
+ DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
1682
+
1683
+ Permission is hereby granted, free of charge, to any person obtaining
1684
+ a copy of this software and associated documentation files (the
1685
+ "Software"), to deal in the Software without restriction, including
1686
+ without limitation the rights to use, copy, modify, merge, publish,
1687
+ distribute, sublicense, and/or sell copies of the Software, and to
1688
+ permit persons to whom the Software is furnished to do so, subject to
1689
+ the following conditions:
1690
+
1691
+ The above copyright notice and this permission notice shall be
1692
+ included in all copies or substantial portions of the Software.
1693
+
1694
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1695
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1696
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1697
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1698
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1699
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1700
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1701
+
1702
+ -----
1703
+
1704
+ The following software may be included in this product: lodash.camelcase, lodash.clonedeep, lodash.debounce, lodash.escape, lodash.flattendeep, lodash.get, lodash.includes, lodash.isinteger, lodash.ismatch, lodash.isplainobject, lodash.once, lodash.set, lodash.sortby, lodash.throttle, lodash.uniq. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git (lodash.camelcase), https://github.com/lodash/lodash.git (lodash.clonedeep), https://github.com/lodash/lodash.git (lodash.debounce), https://github.com/lodash/lodash.git (lodash.escape), https://github.com/lodash/lodash.git (lodash.flattendeep), https://github.com/lodash/lodash.git (lodash.get), https://github.com/lodash/lodash.git (lodash.includes), https://github.com/lodash/lodash.git (lodash.isinteger), https://github.com/lodash/lodash.git (lodash.ismatch), https://github.com/lodash/lodash.git (lodash.isplainobject), https://github.com/lodash/lodash.git (lodash.once), https://github.com/lodash/lodash.git (lodash.set), https://github.com/lodash/lodash.git (lodash.sortby), https://github.com/lodash/lodash.git (lodash.throttle), https://github.com/lodash/lodash.git (lodash.uniq). This software contains the following license and notice below:
1705
+
1706
+ Copyright jQuery Foundation and other contributors <https://jquery.org/>
1707
+
1708
+ Based on Underscore.js, copyright Jeremy Ashkenas,
1709
+ DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
1710
+
1711
+ This software consists of voluntary contributions made by many
1712
+ individuals. For exact contribution history, see the revision history
1713
+ available at https://github.com/lodash/lodash
1714
+
1715
+ The following license applies to all parts of this software except as
1716
+ documented below:
1717
+
1718
+ ====
1719
+
1720
+ Permission is hereby granted, free of charge, to any person obtaining
1721
+ a copy of this software and associated documentation files (the
1722
+ "Software"), to deal in the Software without restriction, including
1723
+ without limitation the rights to use, copy, modify, merge, publish,
1724
+ distribute, sublicense, and/or sell copies of the Software, and to
1725
+ permit persons to whom the Software is furnished to do so, subject to
1726
+ the following conditions:
1727
+
1728
+ The above copyright notice and this permission notice shall be
1729
+ included in all copies or substantial portions of the Software.
1730
+
1731
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1732
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1733
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1734
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1735
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1736
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1737
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1738
+
1739
+ ====
1740
+
1741
+ Copyright and related rights for sample code are waived via CC0. Sample
1742
+ code is defined as all source code displayed within the prose of the
1743
+ documentation.
1744
+
1745
+ CC0: http://creativecommons.org/publicdomain/zero/1.0/
1746
+
1747
+ ====
1748
+
1749
+ Files located in the node_modules and vendor directories are externally
1750
+ maintained libraries used by this software which have their own
1751
+ licenses; we recommend you read them, as their terms may differ from the
1752
+ terms above.
1753
+
1754
+ -----
1755
+
1756
+ The following software may be included in this product: lodash.isboolean, lodash.isnumber, lodash.isstring. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git (lodash.isboolean), https://github.com/lodash/lodash.git (lodash.isnumber), https://github.com/lodash/lodash.git (lodash.isstring). This software contains the following license and notice below:
1757
+
1758
+ Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
1759
+ Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
1760
+ DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
1761
+
1762
+ Permission is hereby granted, free of charge, to any person obtaining
1763
+ a copy of this software and associated documentation files (the
1764
+ "Software"), to deal in the Software without restriction, including
1765
+ without limitation the rights to use, copy, modify, merge, publish,
1766
+ distribute, sublicense, and/or sell copies of the Software, and to
1767
+ permit persons to whom the Software is furnished to do so, subject to
1768
+ the following conditions:
1769
+
1770
+ The above copyright notice and this permission notice shall be
1771
+ included in all copies or substantial portions of the Software.
1772
+
1773
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1774
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1775
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1776
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1777
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1778
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1779
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1780
+
1781
+ -----
1782
+
1783
+ The following software may be included in this product: lodash.isequal. A copy of the source code may be downloaded from https://github.com/lodash/lodash.git. This software contains the following license and notice below:
1784
+
1785
+ Copyright JS Foundation and other contributors <https://js.foundation/>
1786
+
1787
+ Based on Underscore.js, copyright Jeremy Ashkenas,
1788
+ DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
1789
+
1790
+ This software consists of voluntary contributions made by many
1791
+ individuals. For exact contribution history, see the revision history
1792
+ available at https://github.com/lodash/lodash
1793
+
1794
+ The following license applies to all parts of this software except as
1795
+ documented below:
1796
+
1797
+ ====
1798
+
1799
+ Permission is hereby granted, free of charge, to any person obtaining
1800
+ a copy of this software and associated documentation files (the
1801
+ "Software"), to deal in the Software without restriction, including
1802
+ without limitation the rights to use, copy, modify, merge, publish,
1803
+ distribute, sublicense, and/or sell copies of the Software, and to
1804
+ permit persons to whom the Software is furnished to do so, subject to
1805
+ the following conditions:
1806
+
1807
+ The above copyright notice and this permission notice shall be
1808
+ included in all copies or substantial portions of the Software.
1809
+
1810
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1811
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1812
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1813
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
1814
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
1815
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
1816
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1817
+
1818
+ ====
1819
+
1820
+ Copyright and related rights for sample code are waived via CC0. Sample
1821
+ code is defined as all source code displayed within the prose of the
1822
+ documentation.
1823
+
1824
+ CC0: http://creativecommons.org/publicdomain/zero/1.0/
1825
+
1826
+ ====
1827
+
1828
+ Files located in the node_modules and vendor directories are externally
1829
+ maintained libraries used by this software which have their own
1830
+ licenses; we recommend you read them, as their terms may differ from the
1831
+ terms above.
1832
+
1833
+ -----
1834
+
1835
+ The following software may be included in this product: loose-envify. A copy of the source code may be downloaded from git://github.com/zertosh/loose-envify.git. This software contains the following license and notice below:
1836
+
1837
+ The MIT License (MIT)
1838
+
1839
+ Copyright (c) 2015 Andres Suarez <zertosh@gmail.com>
1840
+
1841
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1842
+ of this software and associated documentation files (the "Software"), to deal
1843
+ in the Software without restriction, including without limitation the rights
1844
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1845
+ copies of the Software, and to permit persons to whom the Software is
1846
+ furnished to do so, subject to the following conditions:
1847
+
1848
+ The above copyright notice and this permission notice shall be included in
1849
+ all copies or substantial portions of the Software.
1850
+
1851
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1852
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1853
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1854
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1855
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1856
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1857
+ THE SOFTWARE.
1858
+
1859
+ -----
1860
+
1861
+ The following software may be included in this product: mobx, mobx-react, mobx-react-lite. A copy of the source code may be downloaded from https://github.com/mobxjs/mobx.git (mobx), https://github.com/mobxjs/mobx-react.git (mobx-react), https://github.com/mobxjs/mobx-react-lite.git (mobx-react-lite). This software contains the following license and notice below:
1862
+
1863
+ The MIT License (MIT)
1864
+
1865
+ Copyright (c) 2015 Michel Weststrate
1866
+
1867
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1868
+ of this software and associated documentation files (the "Software"), to deal
1869
+ in the Software without restriction, including without limitation the rights
1870
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1871
+ copies of the Software, and to permit persons to whom the Software is
1872
+ furnished to do so, subject to the following conditions:
1873
+
1874
+ The above copyright notice and this permission notice shall be included in all
1875
+ copies or substantial portions of the Software.
1876
+
1877
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1878
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1879
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1880
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1881
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1882
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1883
+ SOFTWARE.
1884
+
1885
+ -----
1886
+
1887
+ The following software may be included in this product: mobx-state-tree. A copy of the source code may be downloaded from https://github.com/mobxjs/mobx-state-tree.git. This software contains the following license and notice below:
1888
+
1889
+ MIT License
1890
+
1891
+ Copyright (c) 2016 Michel Weststrate
1892
+
1893
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1894
+ of this software and associated documentation files (the "Software"), to deal
1895
+ in the Software without restriction, including without limitation the rights
1896
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1897
+ copies of the Software, and to permit persons to whom the Software is
1898
+ furnished to do so, subject to the following conditions:
1899
+
1900
+ The above copyright notice and this permission notice shall be included in all
1901
+ copies or substantial portions of the Software.
1902
+
1903
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1904
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1905
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1906
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1907
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1908
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1909
+ SOFTWARE.
1910
+
1911
+ -----
1912
+
1913
+ The following software may be included in this product: moment. A copy of the source code may be downloaded from https://github.com/moment/moment.git. This software contains the following license and notice below:
1914
+
1915
+ Copyright (c) JS Foundation and other contributors
1916
+
1917
+ Permission is hereby granted, free of charge, to any person
1918
+ obtaining a copy of this software and associated documentation
1919
+ files (the "Software"), to deal in the Software without
1920
+ restriction, including without limitation the rights to use,
1921
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
1922
+ copies of the Software, and to permit persons to whom the
1923
+ Software is furnished to do so, subject to the following
1924
+ conditions:
1925
+
1926
+ The above copyright notice and this permission notice shall be
1927
+ included in all copies or substantial portions of the Software.
1928
+
1929
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1930
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1931
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1932
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
1933
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1934
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1935
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
1936
+ OTHER DEALINGS IN THE SOFTWARE.
1937
+
1938
+ -----
1939
+
1940
+ The following software may be included in this product: moo. A copy of the source code may be downloaded from https://github.com/tjvr/moo.git. This software contains the following license and notice below:
1941
+
1942
+ BSD 3-Clause License
1943
+
1944
+ Copyright (c) 2017, Tim Radvan (tjvr)
1945
+ All rights reserved.
1946
+
1947
+ Redistribution and use in source and binary forms, with or without
1948
+ modification, are permitted provided that the following conditions are met:
1949
+
1950
+ * Redistributions of source code must retain the above copyright notice, this
1951
+ list of conditions and the following disclaimer.
1952
+
1953
+ * Redistributions in binary form must reproduce the above copyright notice,
1954
+ this list of conditions and the following disclaimer in the documentation
1955
+ and/or other materials provided with the distribution.
1956
+
1957
+ * Neither the name of the copyright holder nor the names of its
1958
+ contributors may be used to endorse or promote products derived from
1959
+ this software without specific prior written permission.
1960
+
1961
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1962
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1963
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1964
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
1965
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1966
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1967
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
1968
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1969
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1970
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1971
+
1972
+ -----
1973
+
1974
+ The following software may be included in this product: nearley. A copy of the source code may be downloaded from https://github.com/hardmath123/nearley.git. This software contains the following license and notice below:
1975
+
1976
+ The MIT License (MIT)
1977
+
1978
+ Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019 Kartik Chandra, Tim Radvan
1979
+
1980
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1981
+ of this software and associated documentation files (the "Software"), to deal
1982
+ in the Software without restriction, including without limitation the rights
1983
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1984
+ copies of the Software, and to permit persons to whom the Software is
1985
+ furnished to do so, subject to the following conditions:
1986
+
1987
+ The above copyright notice and this permission notice shall be included in all
1988
+ copies or substantial portions of the Software.
1989
+
1990
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1991
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1992
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1993
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1994
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1995
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1996
+ SOFTWARE.
1997
+
1998
+ -----
1999
+
2000
+ The following software may be included in this product: node-fetch. A copy of the source code may be downloaded from https://github.com/bitinn/node-fetch.git (node-fetch), https://github.com/npm/node-fetch-npm.git (node-fetch-npm). This software contains the following license and notice below:
2001
+
2002
+ The MIT License (MIT)
2003
+
2004
+ Copyright (c) 2016 David Frank
2005
+
2006
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2007
+ of this software and associated documentation files (the "Software"), to deal
2008
+ in the Software without restriction, including without limitation the rights
2009
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2010
+ copies of the Software, and to permit persons to whom the Software is
2011
+ furnished to do so, subject to the following conditions:
2012
+
2013
+ The above copyright notice and this permission notice shall be included in all
2014
+ copies or substantial portions of the Software.
2015
+
2016
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2017
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2018
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2019
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2020
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2021
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2022
+ SOFTWARE.
2023
+
2024
+ -----
2025
+
2026
+ The following software may be included in this product: object-inspect. A copy of the source code may be downloaded from git://github.com/inspect-js/object-inspect.git. This software contains the following license and notice below:
2027
+
2028
+ MIT License
2029
+
2030
+ Copyright (c) 2013 James Halliday
2031
+
2032
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2033
+ of this software and associated documentation files (the "Software"), to deal
2034
+ in the Software without restriction, including without limitation the rights
2035
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2036
+ copies of the Software, and to permit persons to whom the Software is
2037
+ furnished to do so, subject to the following conditions:
2038
+
2039
+ The above copyright notice and this permission notice shall be included in all
2040
+ copies or substantial portions of the Software.
2041
+
2042
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2043
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2044
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2045
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2046
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2047
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2048
+ SOFTWARE.
2049
+
2050
+ -----
2051
+
2052
+ The following software may be included in this product: object-keys. A copy of the source code may be downloaded from git://github.com/ljharb/object-keys.git. This software contains the following license and notice below:
2053
+
2054
+ The MIT License (MIT)
2055
+
2056
+ Copyright (C) 2013 Jordan Harband
2057
+
2058
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2059
+ of this software and associated documentation files (the "Software"), to deal
2060
+ in the Software without restriction, including without limitation the rights
2061
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2062
+ copies of the Software, and to permit persons to whom the Software is
2063
+ furnished to do so, subject to the following conditions:
2064
+
2065
+ The above copyright notice and this permission notice shall be included in
2066
+ all copies or substantial portions of the Software.
2067
+
2068
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2069
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2070
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2071
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2072
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2073
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2074
+ THE SOFTWARE.
2075
+
2076
+ -----
2077
+
2078
+ The following software may be included in this product: querystringify, requires-port, url-parse. A copy of the source code may be downloaded from https://github.com/3rd-Eden/one-time.git (one-time), https://github.com/unshiftio/querystringify (querystringify), https://github.com/unshiftio/requires-port (requires-port), https://github.com/unshiftio/url-parse.git (url-parse). This software contains the following license and notice below:
2079
+
2080
+ The MIT License (MIT)
2081
+
2082
+ Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors.
2083
+
2084
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2085
+ of this software and associated documentation files (the "Software"), to deal
2086
+ in the Software without restriction, including without limitation the rights
2087
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2088
+ copies of the Software, and to permit persons to whom the Software is
2089
+ furnished to do so, subject to the following conditions:
2090
+
2091
+ The above copyright notice and this permission notice shall be included in all
2092
+ copies or substantial portions of the Software.
2093
+
2094
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2095
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2096
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2097
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2098
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2099
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2100
+ SOFTWARE.
2101
+
2102
+ -----
2103
+
2104
+ The following software may be included in this product: parse5. A copy of the source code may be downloaded from git://github.com/inikulin/parse5.git (parse5), git://github.com/inikulin/parse5.git (parse5-htmlparser2-tree-adapter). This software contains the following license and notice below:
2105
+
2106
+ Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin)
2107
+
2108
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2109
+ of this software and associated documentation files (the "Software"), to deal
2110
+ in the Software without restriction, including without limitation the rights
2111
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2112
+ copies of the Software, and to permit persons to whom the Software is
2113
+ furnished to do so, subject to the following conditions:
2114
+
2115
+ The above copyright notice and this permission notice shall be included in
2116
+ all copies or substantial portions of the Software.
2117
+
2118
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2119
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2120
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2121
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2122
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2123
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2124
+ THE SOFTWARE.
2125
+
2126
+ -----
2127
+
2128
+ The following software may be included in this product: performance-now. A copy of the source code may be downloaded from git://github.com/braveg1rl/performance-now.git. This software contains the following license and notice below:
2129
+
2130
+ Copyright (c) 2013 Braveg1rl
2131
+
2132
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2133
+
2134
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2135
+
2136
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2137
+
2138
+ -----
2139
+
2140
+ The following software may be included in this product: process-nextick-args. A copy of the source code may be downloaded from https://github.com/calvinmetcalf/process-nextick-args.git. This software contains the following license and notice below:
2141
+
2142
+ # Copyright (c) 2015 Calvin Metcalf
2143
+
2144
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2145
+ of this software and associated documentation files (the "Software"), to deal
2146
+ in the Software without restriction, including without limitation the rights
2147
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2148
+ copies of the Software, and to permit persons to whom the Software is
2149
+ furnished to do so, subject to the following conditions:
2150
+
2151
+ The above copyright notice and this permission notice shall be included in all
2152
+ copies or substantial portions of the Software.
2153
+
2154
+ **THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2155
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2156
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2157
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2158
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2159
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2160
+ SOFTWARE.**
2161
+
2162
+ -----
2163
+
2164
+ The following software may be included in this product: promise. A copy of the source code may be downloaded from https://github.com/then/promise.git. This software contains the following license and notice below:
2165
+
2166
+ Copyright (c) 2014 Forbes Lindesay
2167
+
2168
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2169
+ of this software and associated documentation files (the "Software"), to deal
2170
+ in the Software without restriction, including without limitation the rights
2171
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2172
+ copies of the Software, and to permit persons to whom the Software is
2173
+ furnished to do so, subject to the following conditions:
2174
+
2175
+ The above copyright notice and this permission notice shall be included in
2176
+ all copies or substantial portions of the Software.
2177
+
2178
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2179
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2180
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2181
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2182
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2183
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2184
+ THE SOFTWARE.
2185
+
2186
+ -----
2187
+
2188
+ The following software may be included in this product: prop-types-exact. A copy of the source code may be downloaded from git+https://github.com/airbnb/prop-types-exact.git. This software contains the following license and notice below:
2189
+
2190
+ MIT License
2191
+
2192
+ Copyright (c) 2017 Airbnb
2193
+
2194
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2195
+ of this software and associated documentation files (the "Software"), to deal
2196
+ in the Software without restriction, including without limitation the rights
2197
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2198
+ copies of the Software, and to permit persons to whom the Software is
2199
+ furnished to do so, subject to the following conditions:
2200
+
2201
+ The above copyright notice and this permission notice shall be included in all
2202
+ copies or substantial portions of the Software.
2203
+
2204
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2205
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2206
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2207
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2208
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2209
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2210
+ SOFTWARE.
2211
+
2212
+ -----
2213
+
2214
+ The following software may be included in this product: raf. A copy of the source code may be downloaded from git://github.com/chrisdickinson/raf.git. This software contains the following license and notice below:
2215
+
2216
+ Copyright 2013 Chris Dickinson <chris@neversaw.us>
2217
+
2218
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2219
+
2220
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2221
+
2222
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2223
+
2224
+ -----
2225
+
2226
+ The following software may be included in this product: randexp, ret. A copy of the source code may be downloaded from git://github.com/fent/randexp.js.git (randexp), git://github.com/fent/ret.js.git (ret). This software contains the following license and notice below:
2227
+
2228
+ Copyright (C) 2011 by Roly Fentanes
2229
+
2230
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2231
+ of this software and associated documentation files (the "Software"), to deal
2232
+ in the Software without restriction, including without limitation the rights
2233
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2234
+ copies of the Software, and to permit persons to whom the Software is
2235
+ furnished to do so, subject to the following conditions:
2236
+
2237
+ The above copyright notice and this permission notice shall be included in
2238
+ all copies or substantial portions of the Software.
2239
+
2240
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2241
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2242
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2243
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2244
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2245
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2246
+ THE SOFTWARE.
2247
+
2248
+ -----
2249
+
2250
+ The following software may be included in this product: rc-cascader, rc-select. A copy of the source code may be downloaded from https://github.com/react-component/cascader.git (rc-cascader), https://github.com/react-component/mention.git (rc-editor-mention), git@github.com:react-component/select.git (rc-select). This software contains the following license and notice below:
2251
+
2252
+ The MIT License (MIT)
2253
+
2254
+ Copyright (c) 2014-present alipay.com
2255
+
2256
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2257
+
2258
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2259
+
2260
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2261
+
2262
+ -----
2263
+
2264
+ The following software may be included in this product: rc-checkbox. A copy of the source code may be downloaded from git@github.com:react-component/checkbox.git. This software contains the following license and notice below:
2265
+
2266
+ The MIT License (MIT) Copyright (c) 2016 React Components
2267
+
2268
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2269
+
2270
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2271
+
2272
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2273
+
2274
+ -----
2275
+
2276
+ The following software may be included in this product: rc-dropdown, rc-slider, rc-tooltip, rc-trigger. A copy of the source code may be downloaded from git@github.com:react-component/dropdown.git (rc-dropdown), git@github.com:react-component/slider.git (rc-slider), git@github.com:react-component/tooltip.git (rc-tooltip), https://github.com/react-component/trigger.git (rc-trigger). This software contains the following license and notice below:
2277
+
2278
+ The MIT License (MIT)
2279
+ Copyright (c) 2015-present Alipay.com, https://www.alipay.com/
2280
+
2281
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2282
+ of this software and associated documentation files (the "Software"), to deal
2283
+ in the Software without restriction, including without limitation the rights
2284
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2285
+ copies of the Software, and to permit persons to whom the Software is
2286
+ furnished to do so, subject to the following conditions:
2287
+
2288
+ The above copyright notice and this permission notice shall be included in
2289
+ all copies or substantial portions of the Software.
2290
+
2291
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2292
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2293
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2294
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
2295
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2296
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2297
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2298
+
2299
+ -----
2300
+
2301
+ The following software may be included in this product: rc-field-form. A copy of the source code may be downloaded from https://github.com/react-component/field-form.git. This software contains the following license and notice below:
2302
+
2303
+ MIT License
2304
+
2305
+ Copyright (c) 2019-present react-component
2306
+
2307
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2308
+ of this software and associated documentation files (the "Software"), to deal
2309
+ in the Software without restriction, including without limitation the rights
2310
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2311
+ copies of the Software, and to permit persons to whom the Software is
2312
+ furnished to do so, subject to the following conditions:
2313
+
2314
+ The above copyright notice and this permission notice shall be included in all
2315
+ copies or substantial portions of the Software.
2316
+
2317
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2318
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2319
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2320
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2321
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2322
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2323
+ SOFTWARE.
2324
+
2325
+ -----
2326
+
2327
+ The following software may be included in this product: rc-mentions. A copy of the source code may be downloaded from git@github.com:react-component/mentions.git. This software contains the following license and notice below:
2328
+
2329
+ The MIT License (MIT)
2330
+
2331
+ Copyright (c) 2019-present alipay.com
2332
+
2333
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2334
+
2335
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2336
+
2337
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2338
+
2339
+ -----
2340
+
2341
+ The following software may be included in this product: rc-motion, rc-picker, rc-resize-observer, rc-textarea. A copy of the source code may be downloaded from git@github.com:react-component/motion.git (rc-motion), git@github.com:react-component/picker.git (rc-picker), git@github.com:react-component/resize-observer.git (rc-resize-observer), git@github.com:react-component/textarea.git (rc-textarea). This software contains the following license and notice below:
2342
+
2343
+ The MIT License (MIT)
2344
+
2345
+ Copyright (c) 2019-present afc163
2346
+
2347
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2348
+
2349
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2350
+
2351
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2352
+
2353
+ -----
2354
+
2355
+ The following software may be included in this product: rc-table. A copy of the source code may be downloaded from git@github.com:react-component/table.git. This software contains the following license and notice below:
2356
+
2357
+ MIT LICENSE
2358
+
2359
+ Copyright (c) 2015-present Alipay.com, https://www.alipay.com/
2360
+
2361
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
2362
+
2363
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2364
+
2365
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2366
+
2367
+ -----
2368
+
2369
+ The following software may be included in this product: rc-tooltip. A copy of the source code may be downloaded from git@github.com:react-component/tooltip.git. This software contains the following license and notice below:
2370
+
2371
+ The MIT License (MIT)
2372
+
2373
+ Copyright (c) 2015-present Alipay.com, https://www.alipay.com/
2374
+
2375
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2376
+ of this software and associated documentation files (the "Software"), to deal
2377
+ in the Software without restriction, including without limitation the rights
2378
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2379
+ copies of the Software, and to permit persons to whom the Software is
2380
+ furnished to do so, subject to the following conditions:
2381
+
2382
+ The above copyright notice and this permission notice shall be included in
2383
+ all copies or substantial portions of the Software.
2384
+
2385
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2386
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2387
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2388
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
2389
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2390
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2391
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2392
+
2393
+ -----
2394
+
2395
+ The following software may be included in this product: rc-upload. A copy of the source code may be downloaded from git@github.com:react-component/upload.git. This software contains the following license and notice below:
2396
+
2397
+ The MIT License (MIT)
2398
+
2399
+ Copyright (c) 2016-present react-component
2400
+
2401
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2402
+ of this software and associated documentation files (the "Software"), to deal
2403
+ in the Software without restriction, including without limitation the rights
2404
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2405
+ copies of the Software, and to permit persons to whom the Software is
2406
+ furnished to do so, subject to the following conditions:
2407
+
2408
+ The above copyright notice and this permission notice shall be included in
2409
+ all copies or substantial portions of the Software.
2410
+
2411
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2412
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2413
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2414
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
2415
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2416
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2417
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2418
+
2419
+ -----
2420
+
2421
+ The following software may be included in this product: rc-util. A copy of the source code may be downloaded from git@github.com:react-component/util.git. This software contains the following license and notice below:
2422
+
2423
+ The MIT License (MIT)
2424
+
2425
+ Copyright (c) 2014-present yiminghe
2426
+ Copyright (c) 2015-present Alipay.com, https://www.alipay.com/
2427
+
2428
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2429
+ of this software and associated documentation files (the "Software"), to deal
2430
+ in the Software without restriction, including without limitation the rights
2431
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2432
+ copies of the Software, and to permit persons to whom the Software is
2433
+ furnished to do so, subject to the following conditions:
2434
+
2435
+ The above copyright notice and this permission notice shall be included in
2436
+ all copies or substantial portions of the Software.
2437
+
2438
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2439
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2440
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2441
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
2442
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2443
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2444
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2445
+
2446
+ -----
2447
+
2448
+ The following software may be included in this product: react, react-dom, react-is, react-test-renderer, scheduler. A copy of the source code may be downloaded from git+https://github.com/facebook/react.git (react), git+https://github.com/facebook/react.git (react-dom), https://github.com/facebook/react.git (react-is), git+https://github.com/facebook/react.git (react-test-renderer), https://github.com/facebook/react.git (scheduler). This software contains the following license and notice below:
2449
+
2450
+ MIT License
2451
+
2452
+ Copyright (c) Facebook, Inc. and its affiliates.
2453
+
2454
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2455
+ of this software and associated documentation files (the "Software"), to deal
2456
+ in the Software without restriction, including without limitation the rights
2457
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2458
+ copies of the Software, and to permit persons to whom the Software is
2459
+ furnished to do so, subject to the following conditions:
2460
+
2461
+ The above copyright notice and this permission notice shall be included in all
2462
+ copies or substantial portions of the Software.
2463
+
2464
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2465
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2466
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2467
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2468
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2469
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2470
+ SOFTWARE.
2471
+
2472
+ -----
2473
+
2474
+ The following software may be included in this product: react-aiot. A copy of the source code may be downloaded from https://bitbucket.org/matthiasweb/react-aiot. This software contains the following license and notice below:
2475
+
2476
+ GNU GENERAL PUBLIC LICENSE
2477
+ Version 2, June 1991
2478
+ React AIOT by Matthias Günter -
2479
+ matthias-web.com
2480
+
2481
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
2482
+ 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
2483
+
2484
+ Everyone is permitted to copy and distribute verbatim
2485
+ copies of this license document, but changing it is not
2486
+ allowed.
2487
+
2488
+ Preamble
2489
+
2490
+ The licenses for most software are designed to take away
2491
+ your freedom to share and change it. By contrast, the GNU
2492
+ General Public License is intended to guarantee your
2493
+ freedom to share and change free software — to make sure
2494
+ the software is free for all its users. This General Public
2495
+ License applies to most of the Free Software Foundation’s
2496
+ software and to any other program whose authors commit to
2497
+ using it. (Some other Free Software Foundation software is
2498
+ covered by the GNU Library General Public License instead.)
2499
+ You can apply it to your programs, too.
2500
+
2501
+ When we speak of free software, we are referring to
2502
+ freedom, not price. Our General Public Licenses are
2503
+ designed to make sure that you have the freedom to
2504
+ distribute copies of free software (and charge for this
2505
+ service if you wish), that you receive source code or can
2506
+ get it if you want it, that you can change the software or
2507
+ use pieces of it in new free programs; and that you know
2508
+ you can do these things.
2509
+
2510
+ To protect your rights, we need to make restrictions that
2511
+ forbid anyone to deny you these rights or to ask you to
2512
+ surrender the rights. These restrictions translate to
2513
+ certain responsibilities for you if you distribute copies
2514
+ of the software, or if you modify it.
2515
+
2516
+ For example, if you distribute copies of such a program,
2517
+ whether gratis or for a fee, you must give the recipients
2518
+ all the rights that you have. You must make sure that they,
2519
+ too, receive or can get the source code. And you must show
2520
+ them these terms so they know their rights.
2521
+
2522
+ We protect your rights with two steps: (1) copyright the
2523
+ software, and (2) offer you this license which gives you
2524
+ legal permission to copy, distribute and/or modify the
2525
+ software.
2526
+
2527
+ Also, for each author’s protection and ours, we want to
2528
+ make certain that everyone understands that there is no
2529
+ warranty for this free software. If the software is
2530
+ modified by someone else and passed on, we want its
2531
+ recipients to know that what they have is not the original,
2532
+ so that any problems introduced by others will not reflect
2533
+ on the original authors' reputations.
2534
+
2535
+ Finally, any free program is threatened constantly by
2536
+ software patents. We wish to avoid the danger that
2537
+ redistributors of a free program will individually obtain
2538
+ patent licenses, in effect making the program proprietary.
2539
+ To prevent this, we have made it clear that any patent must
2540
+ be licensed for everyone’s free use or not licensed at
2541
+ all.
2542
+
2543
+ The precise terms and conditions for copying, distribution
2544
+ and modification follow.
2545
+
2546
+ GNU General Public License Terms and
2547
+ Conditions for Copying, Distribution, and Modification
2548
+ This License applies to any program or other work which
2549
+ contains a notice placed by the copyright holder saying it
2550
+ may be distributed under the terms of this General Public
2551
+ License. The "Program", below, refers to any such program
2552
+ or work, and a "work based on the Program" means either the
2553
+ Program or any derivative work under copyright law: that is
2554
+ to say, a work containing the Program or a portion of it,
2555
+ either verbatim or with modifications and/or translated
2556
+ into another language. (Hereinafter, translation is
2557
+ included without limitation in the term "modification".)
2558
+ Each licensee is addressed as "you". Activities other than
2559
+ copying, distribution and modification are not covered by
2560
+ this License; they are outside its scope. The act of
2561
+ running the Program is not restricted, and the output from
2562
+ the Program is covered only if its contents constitute a
2563
+ work based on the Program (independent of having been made
2564
+ by running the Program). Whether that is true depends on
2565
+ what the Program does.
2566
+ You may copy and distribute verbatim copies of the
2567
+ Program’s source code as you receive it, in any medium,
2568
+ provided that you conspicuously and appropriately publish
2569
+ on each copy an appropriate copyright notice and disclaimer
2570
+ of warranty; keep intact all the notices that refer to this
2571
+ License and to the absence of any warranty; and give any
2572
+ other recipients of the Program a copy of this License
2573
+ along with the Program. You may charge a fee for the
2574
+ physical act of transferring a copy, and you may at your
2575
+ option offer warranty protection in exchange for a fee.
2576
+ You may modify your copy or copies of the Program or any
2577
+ portion of it, thus forming a work based on the Program,
2578
+ and copy and distribute such modifications or work under
2579
+ the terms of Section 1 above, provided that you also meet
2580
+ all of these conditions:
2581
+ You must cause the modified files to carry prominent
2582
+ notices stating that you changed the files and the date of
2583
+ any change.
2584
+ You must cause any work that you distribute or publish,
2585
+ that in whole or in part contains or is derived from the
2586
+ Program or any part thereof, to be licensed as a whole at
2587
+ no charge to all third parties under the terms of this
2588
+ License.
2589
+ If the modified program normally reads commands
2590
+ interactively when run, you must cause it, when started
2591
+ running for such interactive use in the most ordinary way,
2592
+ to print or display an announcement including an
2593
+ appropriate copyright notice and a notice that there is no
2594
+ warranty (or else, saying that you provide a warranty) and
2595
+ that users may redistribute the program under these
2596
+ conditions, and telling the user how to view a copy of this
2597
+ License. (Exception: if the Program itself is interactive
2598
+ but does not normally print such an announcement, your work
2599
+ based on the Program is not required to print an
2600
+ announcement.)
2601
+ These requirements apply to the modified work as a whole.
2602
+ If identifiable sections of that work are not derived from
2603
+ the Program, and can be reasonably considered independent
2604
+ and separate works in themselves, then this License, and
2605
+ its terms, do not apply to those sections when you
2606
+ distribute them as separate works. But when you distribute
2607
+ the same sections as part of a whole which is a work based
2608
+ on the Program, the distribution of the whole must be on
2609
+ the terms of this License, whose permissions for other
2610
+ licensees extend to the entire whole, and thus to each and
2611
+ every part regardless of who wrote it. Thus, it is not the
2612
+ intent of this section to claim rights or contest your
2613
+ rights to work written entirely by you; rather, the intent
2614
+ is to exercise the right to control the distribution of
2615
+ derivative or collective works based on the Program. In
2616
+ addition, mere aggregation of another work not based on the
2617
+ Program with the Program (or with a work based on the
2618
+ Program) on a volume of a storage or distribution medium
2619
+ does not bring the other work under the scope of this
2620
+ License.
2621
+ You may copy and distribute the Program (or a work based on
2622
+ it, under Section 2) in object code or executable form
2623
+ under the terms of Sections 1 and 2 above provided that you
2624
+ also do one of the following:
2625
+ Accompany it with the complete corresponding
2626
+ machine-readable source code, which must be distributed
2627
+ under the terms of Sections 1 and 2 above on a medium
2628
+ customarily used for software interchange; or,
2629
+ Accompany it with a written offer, valid for at least three
2630
+ years, to give any third party, for a charge no more than
2631
+ your cost of physically performing source distribution, a
2632
+ complete machine-readable copy of the corresponding source
2633
+ code, to be distributed under the terms of Sections 1 and 2
2634
+ above on a medium customarily used for software
2635
+ interchange; or,
2636
+ Accompany it with the information you received as to the
2637
+ offer to distribute corresponding source code. (This
2638
+ alternative is allowed only for noncommercial distribution
2639
+ and only if you received the program in object code or
2640
+ executable form with such an offer, in accord with
2641
+ Subsection b above.) The source code for a work means the
2642
+ preferred form of the work for making modifications to it.
2643
+ For an executable work, complete source code means all the
2644
+ source code for all modules it contains, plus any
2645
+ associated interface definition files, plus the scripts
2646
+ used to control compilation and installation of the
2647
+ executable. However, as a special exception, the source
2648
+ code distributed need not include anything that is normally
2649
+ distributed (in either source or binary form) with the
2650
+ major components (compiler, kernel, and so on) of the
2651
+ operating system on which the executable runs, unless that
2652
+ component itself accompanies the executable. If
2653
+ distribution of executable or object code is made by
2654
+ offering access to copy from a designated place, then
2655
+ offering equivalent access to copy the source code from the
2656
+ same place counts as distribution of the source code, even
2657
+ though third parties are not compelled to copy the source
2658
+ along with the object code.
2659
+ You may not copy, modify, sublicense, or distribute the
2660
+ Program except as expressly provided under this License.
2661
+ Any attempt otherwise to copy, modify, sublicense or
2662
+ distribute the Program is void, and will automatically
2663
+ terminate your rights under this License. However, parties
2664
+ who have received copies, or rights, from you under this
2665
+ License will not have their licenses terminated so long as
2666
+ such parties remain in full compliance.
2667
+ You are not required to accept this License, since you have
2668
+ not signed it. However, nothing else grants you permission
2669
+ to modify or distribute the Program or its derivative
2670
+ works. These actions are prohibited by law if you do not
2671
+ accept this License. Therefore, by modifying or
2672
+ distributing the Program (or any work based on the
2673
+ Program), you indicate your acceptance of this License to
2674
+ do so, and all its terms and conditions for copying,
2675
+ distributing or modifying the Program or works based on
2676
+ it.
2677
+ Each time you redistribute the Program (or any work based
2678
+ on the Program), the recipient automatically receives a
2679
+ license from the original licensor to copy, distribute or
2680
+ modify the Program subject to these terms and conditions.
2681
+ You may not impose any further restrictions on the
2682
+ recipients' exercise of the rights granted herein. You are
2683
+ not responsible for enforcing compliance by third parties
2684
+ to this License.
2685
+ If, as a consequence of a court judgment or allegation of
2686
+ patent infringement or for any other reason (not limited to
2687
+ patent issues), conditions are imposed on you (whether by
2688
+ court order, agreement or otherwise) that contradict the
2689
+ conditions of this License, they do not excuse you from the
2690
+ conditions of this License. If you cannot distribute so as
2691
+ to satisfy simultaneously your obligations under this
2692
+ License and any other pertinent obligations, then as a
2693
+ consequence you may not distribute the Program at all. For
2694
+ example, if a patent license would not permit royalty-free
2695
+ redistribution of the Program by all those who receive
2696
+ copies directly or indirectly through you, then the only
2697
+ way you could satisfy both it and this License would be to
2698
+ refrain entirely from distribution of the Program. If any
2699
+ portion of this section is held invalid or unenforceable
2700
+ under any particular circumstance, the balance of the
2701
+ section is intended to apply and the section as a whole is
2702
+ intended to apply in other circumstances. It is not the
2703
+ purpose of this section to induce you to infringe any
2704
+ patents or other property right claims or to contest
2705
+ validity of any such claims; this section has the sole
2706
+ purpose of protecting the integrity of the free software
2707
+ distribution system, which is implemented by public license
2708
+ practices. Many people have made generous contributions to
2709
+ the wide range of software distributed through that system
2710
+ in reliance on consistent application of that system; it is
2711
+ up to the author/donor to decide if he or she is willing to
2712
+ distribute software through any other system and a licensee
2713
+ cannot impose that choice. This section is intended to make
2714
+ thoroughly clear what is believed to be a consequence of
2715
+ the rest of this License.
2716
+ If the distribution and/or use of the Program is restricted
2717
+ in certain countries either by patents or by copyrighted
2718
+ interfaces, the original copyright holder who places the
2719
+ Program under this License may add an explicit geographical
2720
+ distribution limitation excluding those countries, so that
2721
+ distribution is permitted only in or among countries not
2722
+ thus excluded. In such case, this License incorporates the
2723
+ limitation as if written in the body of this License.
2724
+ The Free Software Foundation may publish revised and/or new
2725
+ versions of the General Public License from time to time.
2726
+ Such new versions will be similar in spirit to the present
2727
+ version, but may differ in detail to address new problems
2728
+ or concerns. Each version is given a distinguishing version
2729
+ number. If the Program specifies a version number of this
2730
+ License which applies to it and "any later version", you
2731
+ have the option of following the terms and conditions
2732
+ either of that version or of any later version published by
2733
+ the Free Software Foundation. If the Program does not
2734
+ specify a version number of this License, you may choose
2735
+ any version ever published by the Free Software
2736
+ Foundation.
2737
+ If you wish to incorporate parts of the Program into other
2738
+ free programs whose distribution conditions are different,
2739
+ write to the author to ask for permission. For software
2740
+ which is copyrighted by the Free Software Foundation, write
2741
+ to the Free Software Foundation; we sometimes make
2742
+ exceptions for this. Our decision will be guided by the two
2743
+ goals of preserving the free status of all derivatives of
2744
+ our free software and of promoting the sharing and reuse of
2745
+ software generally.
2746
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
2747
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
2748
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
2749
+ COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
2750
+ "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
2751
+ IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2752
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2753
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
2754
+ OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
2755
+ DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
2756
+ REPAIR OR CORRECTION.
2757
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO
2758
+ IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY
2759
+ WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
2760
+ ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
2761
+ SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF
2762
+ THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
2763
+ LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE
2764
+ OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
2765
+ THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
2766
+ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
2767
+ POSSIBILITY OF SUCH DAMAGES.
2768
+
2769
+ -----
2770
+
2771
+ The following software may be included in this product: react-lifecycles-compat. A copy of the source code may be downloaded from https://github.com/reactjs/react-lifecycles-compat.git. This software contains the following license and notice below:
2772
+
2773
+ MIT License
2774
+
2775
+ Copyright (c) 2013-present, Facebook, Inc.
2776
+
2777
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2778
+ of this software and associated documentation files (the "Software"), to deal
2779
+ in the Software without restriction, including without limitation the rights
2780
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2781
+ copies of the Software, and to permit persons to whom the Software is
2782
+ furnished to do so, subject to the following conditions:
2783
+
2784
+ The above copyright notice and this permission notice shall be included in all
2785
+ copies or substantial portions of the Software.
2786
+
2787
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2788
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2789
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2790
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2791
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2792
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2793
+ SOFTWARE.
2794
+
2795
+ -----
2796
+
2797
+ The following software may be included in this product: react-stickynode, subscribe-ui-event. A copy of the source code may be downloaded from https://github.com/yahoo/react-stickynode (react-stickynode), https://github.com/yahoo/subscribe-ui-event (subscribe-ui-event). This software contains the following license and notice below:
2798
+
2799
+ Software License Agreement (BSD License)
2800
+ ========================================
2801
+
2802
+ Copyright (c) 2015, Yahoo Inc. All rights reserved.
2803
+ ----------------------------------------------------
2804
+
2805
+ Redistribution and use of this software in source and binary forms, with or
2806
+ without modification, are permitted provided that the following conditions are
2807
+ met:
2808
+
2809
+ * Redistributions of source code must retain the above copyright notice, this
2810
+ list of conditions and the following disclaimer.
2811
+ * Redistributions in binary form must reproduce the above copyright notice,
2812
+ this list of conditions and the following disclaimer in the documentation
2813
+ and/or other materials provided with the distribution.
2814
+ * Neither the name of Yahoo Inc. nor the names of YUI's contributors may be
2815
+ used to endorse or promote products derived from this software without
2816
+ specific prior written permission of Yahoo Inc.
2817
+
2818
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2819
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2820
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2821
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
2822
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2823
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2824
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2825
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2826
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2827
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828
+
2829
+ -----
2830
+
2831
+ The following software may be included in this product: readable-stream. A copy of the source code may be downloaded from git://github.com/nodejs/readable-stream. This software contains the following license and notice below:
2832
+
2833
+ Node.js is licensed for use as follows:
2834
+
2835
+ """
2836
+ Copyright Node.js contributors. All rights reserved.
2837
+
2838
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2839
+ of this software and associated documentation files (the "Software"), to
2840
+ deal in the Software without restriction, including without limitation the
2841
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
2842
+ sell copies of the Software, and to permit persons to whom the Software is
2843
+ furnished to do so, subject to the following conditions:
2844
+
2845
+ The above copyright notice and this permission notice shall be included in
2846
+ all copies or substantial portions of the Software.
2847
+
2848
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2849
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2850
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2851
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2852
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2853
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2854
+ IN THE SOFTWARE.
2855
+ """
2856
+
2857
+ This license applies to parts of Node.js originating from the
2858
+ https://github.com/joyent/node repository:
2859
+
2860
+ """
2861
+ Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2862
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2863
+ of this software and associated documentation files (the "Software"), to
2864
+ deal in the Software without restriction, including without limitation the
2865
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
2866
+ sell copies of the Software, and to permit persons to whom the Software is
2867
+ furnished to do so, subject to the following conditions:
2868
+
2869
+ The above copyright notice and this permission notice shall be included in
2870
+ all copies or substantial portions of the Software.
2871
+
2872
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2873
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2874
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2875
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2876
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2877
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2878
+ IN THE SOFTWARE.
2879
+ """
2880
+
2881
+ -----
2882
+
2883
+ The following software may be included in this product: readable-stream. A copy of the source code may be downloaded from git://github.com/isaacs/readable-stream. This software contains the following license and notice below:
2884
+
2885
+ Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2886
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2887
+ of this software and associated documentation files (the "Software"), to
2888
+ deal in the Software without restriction, including without limitation the
2889
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
2890
+ sell copies of the Software, and to permit persons to whom the Software is
2891
+ furnished to do so, subject to the following conditions:
2892
+
2893
+ The above copyright notice and this permission notice shall be included in
2894
+ all copies or substantial portions of the Software.
2895
+
2896
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2897
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2898
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2899
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2900
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2901
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2902
+ IN THE SOFTWARE.
2903
+
2904
+ -----
2905
+
2906
+ The following software may be included in this product: resize-observer-polyfill. A copy of the source code may be downloaded from https://github.com/que-etc/resize-observer-polyfill.git. This software contains the following license and notice below:
2907
+
2908
+ The MIT License (MIT)
2909
+
2910
+ Copyright (c) 2016 Denis Rul
2911
+
2912
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2913
+ of this software and associated documentation files (the "Software"), to deal
2914
+ in the Software without restriction, including without limitation the rights
2915
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2916
+ copies of the Software, and to permit persons to whom the Software is
2917
+ furnished to do so, subject to the following conditions:
2918
+
2919
+ The above copyright notice and this permission notice shall be included in all
2920
+ copies or substantial portions of the Software.
2921
+
2922
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2923
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2924
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2925
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2926
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2927
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2928
+ SOFTWARE.
2929
+
2930
+ -----
2931
+
2932
+ The following software may be included in this product: rst-selector-parser. A copy of the source code may be downloaded from https://github.com/aweary/rst-selector-parser. This software contains the following license and notice below:
2933
+
2934
+ Copyright (c) 2017, Gajus Kuizinas (http://gajus.com/)
2935
+ All rights reserved.
2936
+
2937
+ Redistribution and use in source and binary forms, with or without
2938
+ modification, are permitted provided that the following conditions are met:
2939
+ * Redistributions of source code must retain the above copyright
2940
+ notice, this list of conditions and the following disclaimer.
2941
+ * Redistributions in binary form must reproduce the above copyright
2942
+ notice, this list of conditions and the following disclaimer in the
2943
+ documentation and/or other materials provided with the distribution.
2944
+ * Neither the name of the Gajus Kuizinas (http://gajus.com/) nor the
2945
+ names of its contributors may be used to endorse or promote products
2946
+ derived from this software without specific prior written permission.
2947
+
2948
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2949
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2950
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2951
+ DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY
2952
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2953
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2954
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
2955
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2956
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2957
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2958
+
2959
+ -----
2960
+
2961
+ The following software may be included in this product: safer-buffer. A copy of the source code may be downloaded from git+https://github.com/ChALkeR/safer-buffer.git. This software contains the following license and notice below:
2962
+
2963
+ MIT License
2964
+
2965
+ Copyright (c) 2018 Nikita Skovoroda <chalkerx@gmail.com>
2966
+
2967
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2968
+ of this software and associated documentation files (the "Software"), to deal
2969
+ in the Software without restriction, including without limitation the rights
2970
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2971
+ copies of the Software, and to permit persons to whom the Software is
2972
+ furnished to do so, subject to the following conditions:
2973
+
2974
+ The above copyright notice and this permission notice shall be included in all
2975
+ copies or substantial portions of the Software.
2976
+
2977
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2978
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2979
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2980
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2981
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2982
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2983
+ SOFTWARE.
2984
+
2985
+ -----
2986
+
2987
+ The following software may be included in this product: scroll-into-view-if-needed. A copy of the source code may be downloaded from git+https://github.com/stipsan/scroll-into-view-if-needed.git. This software contains the following license and notice below:
2988
+
2989
+ MIT License
2990
+
2991
+ Copyright (c) 2017 Stian Didriksen
2992
+
2993
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2994
+ of this software and associated documentation files (the "Software"), to deal
2995
+ in the Software without restriction, including without limitation the rights
2996
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2997
+ copies of the Software, and to permit persons to whom the Software is
2998
+ furnished to do so, subject to the following conditions:
2999
+
3000
+ The above copyright notice and this permission notice shall be included in all
3001
+ copies or substantial portions of the Software.
3002
+
3003
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3004
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3005
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3006
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3007
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3008
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3009
+ SOFTWARE.
3010
+
3011
+ -----
3012
+
3013
+ The following software may be included in this product: setimmediate. A copy of the source code may be downloaded from https://github.com/YuzuJS/setImmediate.git. This software contains the following license and notice below:
3014
+
3015
+ Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola
3016
+
3017
+ Permission is hereby granted, free of charge, to any person obtaining
3018
+ a copy of this software and associated documentation files (the
3019
+ "Software"), to deal in the Software without restriction, including
3020
+ without limitation the rights to use, copy, modify, merge, publish,
3021
+ distribute, sublicense, and/or sell copies of the Software, and to
3022
+ permit persons to whom the Software is furnished to do so, subject to
3023
+ the following conditions:
3024
+
3025
+ The above copyright notice and this permission notice shall be
3026
+ included in all copies or substantial portions of the Software.
3027
+
3028
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
3029
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3030
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3031
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
3032
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
3033
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3034
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3035
+
3036
+ -----
3037
+
3038
+ The following software may be included in this product: shallowequal. A copy of the source code may be downloaded from https://github.com/dashed/shallowequal.git. This software contains the following license and notice below:
3039
+
3040
+ MIT License
3041
+
3042
+ Copyright (c) 2017 Alberto Leal <mailforalberto@gmail.com> (github.com/dashed)
3043
+
3044
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3045
+ of this software and associated documentation files (the "Software"), to deal
3046
+ in the Software without restriction, including without limitation the rights
3047
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
3048
+ copies of the Software, and to permit persons to whom the Software is
3049
+ furnished to do so, subject to the following conditions:
3050
+
3051
+ The above copyright notice and this permission notice shall be included in all
3052
+ copies or substantial portions of the Software.
3053
+
3054
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3055
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3056
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3057
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3058
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3059
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3060
+ SOFTWARE.
3061
+
3062
+ -----
3063
+
3064
+ The following software may be included in this product: sortablejs. A copy of the source code may be downloaded from git://github.com/SortableJS/Sortable.git. This software contains the following license and notice below:
3065
+
3066
+ MIT License
3067
+
3068
+ Copyright (c) 2019 All contributors to Sortable
3069
+
3070
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3071
+ of this software and associated documentation files (the "Software"), to deal
3072
+ in the Software without restriction, including without limitation the rights
3073
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
3074
+ copies of the Software, and to permit persons to whom the Software is
3075
+ furnished to do so, subject to the following conditions:
3076
+
3077
+ The above copyright notice and this permission notice shall be included in all
3078
+ copies or substantial portions of the Software.
3079
+
3080
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3081
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3082
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3083
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3084
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3085
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3086
+ SOFTWARE.
3087
+
3088
+ -----
3089
+
3090
+ The following software may be included in this product: sprintf-js. A copy of the source code may be downloaded from https://github.com/alexei/sprintf.js.git. This software contains the following license and notice below:
3091
+
3092
+ Copyright (c) 2007-2014, Alexandru Marasteanu <hello [at) alexei (dot] ro>
3093
+ All rights reserved.
3094
+
3095
+ Redistribution and use in source and binary forms, with or without
3096
+ modification, are permitted provided that the following conditions are met:
3097
+ * Redistributions of source code must retain the above copyright
3098
+ notice, this list of conditions and the following disclaimer.
3099
+ * Redistributions in binary form must reproduce the above copyright
3100
+ notice, this list of conditions and the following disclaimer in the
3101
+ documentation and/or other materials provided with the distribution.
3102
+ * Neither the name of this software nor the names of its contributors may be
3103
+ used to endorse or promote products derived from this software without
3104
+ specific prior written permission.
3105
+
3106
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
3107
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
3108
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3109
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
3110
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3111
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3112
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
3113
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3114
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3115
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3116
+
3117
+ -----
3118
+
3119
+ The following software may be included in this product: sprintf-js. A copy of the source code may be downloaded from https://github.com/alexei/sprintf.js.git. This software contains the following license and notice below:
3120
+
3121
+ Copyright (c) 2007-present, Alexandru Mărășteanu <hello@alexei.ro>
3122
+ All rights reserved.
3123
+
3124
+ Redistribution and use in source and binary forms, with or without
3125
+ modification, are permitted provided that the following conditions are met:
3126
+ * Redistributions of source code must retain the above copyright
3127
+ notice, this list of conditions and the following disclaimer.
3128
+ * Redistributions in binary form must reproduce the above copyright
3129
+ notice, this list of conditions and the following disclaimer in the
3130
+ documentation and/or other materials provided with the distribution.
3131
+ * Neither the name of this software nor the names of its contributors may be
3132
+ used to endorse or promote products derived from this software without
3133
+ specific prior written permission.
3134
+
3135
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
3136
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
3137
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3138
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
3139
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3140
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3141
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
3142
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3143
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3144
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3145
+
3146
+ -----
3147
+
3148
+ The following software may be included in this product: string_decoder. A copy of the source code may be downloaded from git://github.com/nodejs/string_decoder.git. This software contains the following license and notice below:
3149
+
3150
+ Node.js is licensed for use as follows:
3151
+
3152
+ """
3153
+ Copyright Node.js contributors. All rights reserved.
3154
+
3155
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3156
+ of this software and associated documentation files (the "Software"), to
3157
+ deal in the Software without restriction, including without limitation the
3158
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3159
+ sell copies of the Software, and to permit persons to whom the Software is
3160
+ furnished to do so, subject to the following conditions:
3161
+
3162
+ The above copyright notice and this permission notice shall be included in
3163
+ all copies or substantial portions of the Software.
3164
+
3165
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3166
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3167
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3168
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3169
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3170
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
3171
+ IN THE SOFTWARE.
3172
+ """
3173
+
3174
+ This license applies to parts of Node.js originating from the
3175
+ https://github.com/joyent/node repository:
3176
+
3177
+ """
3178
+ Copyright Joyent, Inc. and other Node contributors. All rights reserved.
3179
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3180
+ of this software and associated documentation files (the "Software"), to
3181
+ deal in the Software without restriction, including without limitation the
3182
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3183
+ sell copies of the Software, and to permit persons to whom the Software is
3184
+ furnished to do so, subject to the following conditions:
3185
+
3186
+ The above copyright notice and this permission notice shall be included in
3187
+ all copies or substantial portions of the Software.
3188
+
3189
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3190
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3191
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3192
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3193
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3194
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
3195
+ IN THE SOFTWARE.
3196
+ """
3197
+
3198
+ -----
3199
+
3200
+ The following software may be included in this product: string_decoder. A copy of the source code may be downloaded from git://github.com/rvagg/string_decoder.git. This software contains the following license and notice below:
3201
+
3202
+ Copyright Joyent, Inc. and other Node contributors.
3203
+
3204
+ Permission is hereby granted, free of charge, to any person obtaining a
3205
+ copy of this software and associated documentation files (the
3206
+ "Software"), to deal in the Software without restriction, including
3207
+ without limitation the rights to use, copy, modify, merge, publish,
3208
+ distribute, sublicense, and/or sell copies of the Software, and to permit
3209
+ persons to whom the Software is furnished to do so, subject to the
3210
+ following conditions:
3211
+
3212
+ The above copyright notice and this permission notice shall be included
3213
+ in all copies or substantial portions of the Software.
3214
+
3215
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
3216
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3217
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
3218
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
3219
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
3220
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
3221
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
3222
+
3223
+ -----
3224
+
3225
+ The following software may be included in this product: string-convert. A copy of the source code may be downloaded from https://github.com/akiran/string-convert. This software contains the following license and notice below:
3226
+
3227
+ The MIT License (MIT)
3228
+
3229
+ Copyright (c) 2014 Kiran Abburi
3230
+
3231
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3232
+ of this software and associated documentation files (the "Software"), to deal
3233
+ in the Software without restriction, including without limitation the rights
3234
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
3235
+ copies of the Software, and to permit persons to whom the Software is
3236
+ furnished to do so, subject to the following conditions:
3237
+
3238
+ The above copyright notice and this permission notice shall be included in all
3239
+ copies or substantial portions of the Software.
3240
+
3241
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3242
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3243
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3244
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3245
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3246
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3247
+ SOFTWARE.
3248
+
3249
+ -----
3250
+
3251
+ The following software may be included in this product: ua-parser-js. A copy of the source code may be downloaded from https://github.com/faisalman/ua-parser-js.git. This software contains the following license and notice below:
3252
+
3253
+ MIT License
3254
+
3255
+ Copyright (c) 2012-2021 Faisal Salman <<f@faisalman.com>>
3256
+
3257
+ Permission is hereby granted, free of charge, to any person obtaining a copy
3258
+ of this software and associated documentation files (the "Software"), to deal
3259
+ in the Software without restriction, including without limitation the rights
3260
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
3261
+ copies of the Software, and to permit persons to whom the Software is
3262
+ furnished to do so, subject to the following conditions:
3263
+
3264
+ The above copyright notice and this permission notice shall be included in all
3265
+ copies or substantial portions of the Software.
3266
+
3267
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3268
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3269
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3270
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3271
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3272
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3273
+ SOFTWARE.
3274
+
3275
+ -----
3276
+
3277
+ The following software may be included in this product: util-deprecate. A copy of the source code may be downloaded from git://github.com/TooTallNate/util-deprecate.git. This software contains the following license and notice below:
3278
+
3279
+ (The MIT License)
3280
+
3281
+ Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
3282
+
3283
+ Permission is hereby granted, free of charge, to any person
3284
+ obtaining a copy of this software and associated documentation
3285
+ files (the "Software"), to deal in the Software without
3286
+ restriction, including without limitation the rights to use,
3287
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
3288
+ copies of the Software, and to permit persons to whom the
3289
+ Software is furnished to do so, subject to the following
3290
+ conditions:
3291
+
3292
+ The above copyright notice and this permission notice shall be
3293
+ included in all copies or substantial portions of the Software.
3294
+
3295
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
3296
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
3297
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3298
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
3299
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
3300
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3301
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
3302
+ OTHER DEALINGS IN THE SOFTWARE.
3303
+
3304
+ -----
3305
+
3306
+ The following software may be included in this product: warning. A copy of the source code may be downloaded from https://github.com/r3dm/warning.git. This software contains the following license and notice below:
3307
+
3308
+ BSD License
3309
+
3310
+ For React software
3311
+
3312
+ Copyright (c) 2013-2015, Facebook, Inc.
3313
+ All rights reserved.
3314
+
3315
+ Redistribution and use in source and binary forms, with or without modification,
3316
+ are permitted provided that the following conditions are met:
3317
+
3318
+ * Redistributions of source code must retain the above copyright notice, this
3319
+ list of conditions and the following disclaimer.
3320
+
3321
+ * Redistributions in binary form must reproduce the above copyright notice,
3322
+ this list of conditions and the following disclaimer in the documentation
3323
+ and/or other materials provided with the distribution.
3324
+
3325
+ * Neither the name Facebook nor the names of its contributors may be used to
3326
+ endorse or promote products derived from this software without specific
3327
+ prior written permission.
3328
+
3329
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
3330
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
3331
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3332
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
3333
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3334
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3335
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
3336
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3337
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3338
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3339
+
3340
+ -----
3341
+
3342
+ The following software may be included in this product: whatwg-fetch. A copy of the source code may be downloaded from https://github.com/github/fetch.git. This software contains the following license and notice below:
3343
+
3344
+ Copyright (c) 2014-2016 GitHub, Inc.
3345
+
3346
+ Permission is hereby granted, free of charge, to any person obtaining
3347
+ a copy of this software and associated documentation files (the
3348
+ "Software"), to deal in the Software without restriction, including
3349
+ without limitation the rights to use, copy, modify, merge, publish,
3350
+ distribute, sublicense, and/or sell copies of the Software, and to
3351
+ permit persons to whom the Software is furnished to do so, subject to
3352
+ the following conditions:
3353
+
3354
+ The above copyright notice and this permission notice shall be
3355
+ included in all copies or substantial portions of the Software.
3356
+
3357
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
3358
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3359
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
3360
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
3361
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
3362
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3363
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3364
+
3365
+ -----
3366
+
3367
+ The following software may be included in this product: wp-media-picker. A copy of the source code may be downloaded from git://github.com/felixarntz/wp-media-picker.git. This software contains the following license and notice below:
3368
+
3369
+ ### GNU GENERAL PUBLIC LICENSE
3370
+
3371
+ Version 2, June 1991
3372
+
3373
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
3374
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
3375
+
3376
+ Everyone is permitted to copy and distribute verbatim copies
3377
+ of this license document, but changing it is not allowed.
3378
+
3379
+ ### Preamble
3380
+
3381
+ The licenses for most software are designed to take away your freedom
3382
+ to share and change it. By contrast, the GNU General Public License is
3383
+ intended to guarantee your freedom to share and change free
3384
+ software--to make sure the software is free for all its users. This
3385
+ General Public License applies to most of the Free Software
3386
+ Foundation's software and to any other program whose authors commit to
3387
+ using it. (Some other Free Software Foundation software is covered by
3388
+ the GNU Lesser General Public License instead.) You can apply it to
3389
+ your programs, too.
3390
+
3391
+ When we speak of free software, we are referring to freedom, not
3392
+ price. Our General Public Licenses are designed to make sure that you
3393
+ have the freedom to distribute copies of free software (and charge for
3394
+ this service if you wish), that you receive source code or can get it
3395
+ if you want it, that you can change the software or use pieces of it
3396
+ in new free programs; and that you know you can do these things.
3397
+
3398
+ To protect your rights, we need to make restrictions that forbid
3399
+ anyone to deny you these rights or to ask you to surrender the rights.
3400
+ These restrictions translate to certain responsibilities for you if
3401
+ you distribute copies of the software, or if you modify it.
3402
+
3403
+ For example, if you distribute copies of such a program, whether
3404
+ gratis or for a fee, you must give the recipients all the rights that
3405
+ you have. You must make sure that they, too, receive or can get the
3406
+ source code. And you must show them these terms so they know their
3407
+ rights.
3408
+
3409
+ We protect your rights with two steps: (1) copyright the software, and
3410
+ (2) offer you this license which gives you legal permission to copy,
3411
+ distribute and/or modify the software.
3412
+
3413
+ Also, for each author's protection and ours, we want to make certain
3414
+ that everyone understands that there is no warranty for this free
3415
+ software. If the software is modified by someone else and passed on,
3416
+ we want its recipients to know that what they have is not the
3417
+ original, so that any problems introduced by others will not reflect
3418
+ on the original authors' reputations.
3419
+
3420
+ Finally, any free program is threatened constantly by software
3421
+ patents. We wish to avoid the danger that redistributors of a free
3422
+ program will individually obtain patent licenses, in effect making the
3423
+ program proprietary. To prevent this, we have made it clear that any
3424
+ patent must be licensed for everyone's free use or not licensed at
3425
+ all.
3426
+
3427
+ The precise terms and conditions for copying, distribution and
3428
+ modification follow.
3429
+
3430
+ ### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
3431
+
3432
+ **0.** This License applies to any program or other work which
3433
+ contains a notice placed by the copyright holder saying it may be
3434
+ distributed under the terms of this General Public License. The
3435
+ "Program", below, refers to any such program or work, and a "work
3436
+ based on the Program" means either the Program or any derivative work
3437
+ under copyright law: that is to say, a work containing the Program or
3438
+ a portion of it, either verbatim or with modifications and/or
3439
+ translated into another language. (Hereinafter, translation is
3440
+ included without limitation in the term "modification".) Each licensee
3441
+ is addressed as "you".
3442
+
3443
+ Activities other than copying, distribution and modification are not
3444
+ covered by this License; they are outside its scope. The act of
3445
+ running the Program is not restricted, and the output from the Program
3446
+ is covered only if its contents constitute a work based on the Program
3447
+ (independent of having been made by running the Program). Whether that
3448
+ is true depends on what the Program does.
3449
+
3450
+ **1.** You may copy and distribute verbatim copies of the Program's
3451
+ source code as you receive it, in any medium, provided that you
3452
+ conspicuously and appropriately publish on each copy an appropriate
3453
+ copyright notice and disclaimer of warranty; keep intact all the
3454
+ notices that refer to this License and to the absence of any warranty;
3455
+ and give any other recipients of the Program a copy of this License
3456
+ along with the Program.
3457
+
3458
+ You may charge a fee for the physical act of transferring a copy, and
3459
+ you may at your option offer warranty protection in exchange for a
3460
+ fee.
3461
+
3462
+ **2.** You may modify your copy or copies of the Program or any
3463
+ portion of it, thus forming a work based on the Program, and copy and
3464
+ distribute such modifications or work under the terms of Section 1
3465
+ above, provided that you also meet all of these conditions:
3466
+
3467
+
3468
+ **a)** You must cause the modified files to carry prominent notices
3469
+ stating that you changed the files and the date of any change.
3470
+
3471
+
3472
+ **b)** You must cause any work that you distribute or publish, that in
3473
+ whole or in part contains or is derived from the Program or any part
3474
+ thereof, to be licensed as a whole at no charge to all third parties
3475
+ under the terms of this License.
3476
+
3477
+
3478
+ **c)** If the modified program normally reads commands interactively
3479
+ when run, you must cause it, when started running for such interactive
3480
+ use in the most ordinary way, to print or display an announcement
3481
+ including an appropriate copyright notice and a notice that there is
3482
+ no warranty (or else, saying that you provide a warranty) and that
3483
+ users may redistribute the program under these conditions, and telling
3484
+ the user how to view a copy of this License. (Exception: if the
3485
+ Program itself is interactive but does not normally print such an
3486
+ announcement, your work based on the Program is not required to print
3487
+ an announcement.)
3488
+
3489
+ These requirements apply to the modified work as a whole. If
3490
+ identifiable sections of that work are not derived from the Program,
3491
+ and can be reasonably considered independent and separate works in
3492
+ themselves, then this License, and its terms, do not apply to those
3493
+ sections when you distribute them as separate works. But when you
3494
+ distribute the same sections as part of a whole which is a work based
3495
+ on the Program, the distribution of the whole must be on the terms of
3496
+ this License, whose permissions for other licensees extend to the
3497
+ entire whole, and thus to each and every part regardless of who wrote
3498
+ it.
3499
+
3500
+ Thus, it is not the intent of this section to claim rights or contest
3501
+ your rights to work written entirely by you; rather, the intent is to
3502
+ exercise the right to control the distribution of derivative or
3503
+ collective works based on the Program.
3504
+
3505
+ In addition, mere aggregation of another work not based on the Program
3506
+ with the Program (or with a work based on the Program) on a volume of
3507
+ a storage or distribution medium does not bring the other work under
3508
+ the scope of this License.
3509
+
3510
+ **3.** You may copy and distribute the Program (or a work based on it,
3511
+ under Section 2) in object code or executable form under the terms of
3512
+ Sections 1 and 2 above provided that you also do one of the following:
3513
+
3514
+
3515
+ **a)** Accompany it with the complete corresponding machine-readable
3516
+ source code, which must be distributed under the terms of Sections 1
3517
+ and 2 above on a medium customarily used for software interchange; or,
3518
+
3519
+
3520
+ **b)** Accompany it with a written offer, valid for at least three
3521
+ years, to give any third party, for a charge no more than your cost of
3522
+ physically performing source distribution, a complete machine-readable
3523
+ copy of the corresponding source code, to be distributed under the
3524
+ terms of Sections 1 and 2 above on a medium customarily used for
3525
+ software interchange; or,
3526
+
3527
+
3528
+ **c)** Accompany it with the information you received as to the offer
3529
+ to distribute corresponding source code. (This alternative is allowed
3530
+ only for noncommercial distribution and only if you received the
3531
+ program in object code or executable form with such an offer, in
3532
+ accord with Subsection b above.)
3533
+
3534
+ The source code for a work means the preferred form of the work for
3535
+ making modifications to it. For an executable work, complete source
3536
+ code means all the source code for all modules it contains, plus any
3537
+ associated interface definition files, plus the scripts used to
3538
+ control compilation and installation of the executable. However, as a
3539
+ special exception, the source code distributed need not include
3540
+ anything that is normally distributed (in either source or binary
3541
+ form) with the major components (compiler, kernel, and so on) of the
3542
+ operating system on which the executable runs, unless that component
3543
+ itself accompanies the executable.
3544
+
3545
+ If distribution of executable or object code is made by offering
3546
+ access to copy from a designated place, then offering equivalent
3547
+ access to copy the source code from the same place counts as
3548
+ distribution of the source code, even though third parties are not
3549
+ compelled to copy the source along with the object code.
3550
+
3551
+ **4.** You may not copy, modify, sublicense, or distribute the Program
3552
+ except as expressly provided under this License. Any attempt otherwise
3553
+ to copy, modify, sublicense or distribute the Program is void, and
3554
+ will automatically terminate your rights under this License. However,
3555
+ parties who have received copies, or rights, from you under this
3556
+ License will not have their licenses terminated so long as such
3557
+ parties remain in full compliance.
3558
+
3559
+ **5.** You are not required to accept this License, since you have not
3560
+ signed it. However, nothing else grants you permission to modify or
3561
+ distribute the Program or its derivative works. These actions are
3562
+ prohibited by law if you do not accept this License. Therefore, by
3563
+ modifying or distributing the Program (or any work based on the
3564
+ Program), you indicate your acceptance of this License to do so, and
3565
+ all its terms and conditions for copying, distributing or modifying
3566
+ the Program or works based on it.
3567
+
3568
+ **6.** Each time you redistribute the Program (or any work based on
3569
+ the Program), the recipient automatically receives a license from the
3570
+ original licensor to copy, distribute or modify the Program subject to
3571
+ these terms and conditions. You may not impose any further
3572
+ restrictions on the recipients' exercise of the rights granted herein.
3573
+ You are not responsible for enforcing compliance by third parties to
3574
+ this License.
3575
+
3576
+ **7.** If, as a consequence of a court judgment or allegation of
3577
+ patent infringement or for any other reason (not limited to patent
3578
+ issues), conditions are imposed on you (whether by court order,
3579
+ agreement or otherwise) that contradict the conditions of this
3580
+ License, they do not excuse you from the conditions of this License.
3581
+ If you cannot distribute so as to satisfy simultaneously your
3582
+ obligations under this License and any other pertinent obligations,
3583
+ then as a consequence you may not distribute the Program at all. For
3584
+ example, if a patent license would not permit royalty-free
3585
+ redistribution of the Program by all those who receive copies directly
3586
+ or indirectly through you, then the only way you could satisfy both it
3587
+ and this License would be to refrain entirely from distribution of the
3588
+ Program.
3589
+
3590
+ If any portion of this section is held invalid or unenforceable under
3591
+ any particular circumstance, the balance of the section is intended to
3592
+ apply and the section as a whole is intended to apply in other
3593
+ circumstances.
3594
+
3595
+ It is not the purpose of this section to induce you to infringe any
3596
+ patents or other property right claims or to contest validity of any
3597
+ such claims; this section has the sole purpose of protecting the
3598
+ integrity of the free software distribution system, which is
3599
+ implemented by public license practices. Many people have made
3600
+ generous contributions to the wide range of software distributed
3601
+ through that system in reliance on consistent application of that
3602
+ system; it is up to the author/donor to decide if he or she is willing
3603
+ to distribute software through any other system and a licensee cannot
3604
+ impose that choice.
3605
+
3606
+ This section is intended to make thoroughly clear what is believed to
3607
+ be a consequence of the rest of this License.
3608
+
3609
+ **8.** If the distribution and/or use of the Program is restricted in
3610
+ certain countries either by patents or by copyrighted interfaces, the
3611
+ original copyright holder who places the Program under this License
3612
+ may add an explicit geographical distribution limitation excluding
3613
+ those countries, so that distribution is permitted only in or among
3614
+ countries not thus excluded. In such case, this License incorporates
3615
+ the limitation as if written in the body of this License.
3616
+
3617
+ **9.** The Free Software Foundation may publish revised and/or new
3618
+ versions of the General Public License from time to time. Such new
3619
+ versions will be similar in spirit to the present version, but may
3620
+ differ in detail to address new problems or concerns.
3621
+
3622
+ Each version is given a distinguishing version number. If the Program
3623
+ specifies a version number of this License which applies to it and
3624
+ "any later version", you have the option of following the terms and
3625
+ conditions either of that version or of any later version published by
3626
+ the Free Software Foundation. If the Program does not specify a
3627
+ version number of this License, you may choose any version ever
3628
+ published by the Free Software Foundation.
3629
+
3630
+ **10.** If you wish to incorporate parts of the Program into other
3631
+ free programs whose distribution conditions are different, write to
3632
+ the author to ask for permission. For software which is copyrighted by
3633
+ the Free Software Foundation, write to the Free Software Foundation;
3634
+ we sometimes make exceptions for this. Our decision will be guided by
3635
+ the two goals of preserving the free status of all derivatives of our
3636
+ free software and of promoting the sharing and reuse of software
3637
+ generally.
3638
+
3639
+ **NO WARRANTY**
3640
+
3641
+ **11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
3642
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
3643
+ EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
3644
+ OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
3645
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
3646
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
3647
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
3648
+ PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
3649
+ THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
3650
+
3651
+ **12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
3652
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
3653
+ AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
3654
+ FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
3655
+ CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
3656
+ PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
3657
+ RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
3658
+ FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
3659
+ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
3660
+ DAMAGES.
3661
+
3662
+ ### END OF TERMS AND CONDITIONS
3663
+
3664
+ ### How to Apply These Terms to Your New Programs
3665
+
3666
+ If you develop a new program, and you want it to be of the greatest
3667
+ possible use to the public, the best way to achieve this is to make it
3668
+ free software which everyone can redistribute and change under these
3669
+ terms.
3670
+
3671
+ To do so, attach the following notices to the program. It is safest to
3672
+ attach them to the start of each source file to most effectively
3673
+ convey the exclusion of warranty; and each file should have at least
3674
+ the "copyright" line and a pointer to where the full notice is found.
3675
+
3676
+ one line to give the program's name and an idea of what it does.
3677
+ Copyright (C) yyyy name of author
3678
+
3679
+ This program is free software; you can redistribute it and/or
3680
+ modify it under the terms of the GNU General Public License
3681
+ as published by the Free Software Foundation; either version 2
3682
+ of the License, or (at your option) any later version.
3683
+
3684
+ This program is distributed in the hope that it will be useful,
3685
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
3686
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3687
+ GNU General Public License for more details.
3688
+
3689
+ You should have received a copy of the GNU General Public License
3690
+ along with this program; if not, write to the Free Software
3691
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
3692
+
3693
+ Also add information on how to contact you by electronic and paper
3694
+ mail.
3695
+
3696
+ If the program is interactive, make it output a short notice like this
3697
+ when it starts in an interactive mode:
3698
+
3699
+ Gnomovision version 69, Copyright (C) year name of author
3700
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
3701
+ type `show w'. This is free software, and you are welcome
3702
+ to redistribute it under certain conditions; type `show c'
3703
+ for details.
3704
+
3705
+ The hypothetical commands \`show w' and \`show c' should show the
3706
+ appropriate parts of the General Public License. Of course, the
3707
+ commands you use may be called something other than \`show w' and
3708
+ \`show c'; they could even be mouse-clicks or menu items--whatever
3709
+ suits your program.
3710
+
3711
+ You should also get your employer (if you work as a programmer) or
3712
+ your school, if any, to sign a "copyright disclaimer" for the program,
3713
+ if necessary. Here is a sample; alter the names:
3714
+
3715
+ Yoyodyne, Inc., hereby disclaims all copyright
3716
+ interest in the program `Gnomovision'
3717
+ (which makes passes at compilers) written
3718
+ by James Hacker.
3719
+
3720
+ signature of Ty Coon, 1 April 1989
3721
+ Ty Coon, President of Vice
3722
+
3723
+ This General Public License does not permit incorporating your program
3724
+ into proprietary programs. If your program is a subroutine library,
3725
+ you may consider it more useful to permit linking proprietary
3726
+ applications with the library. If this is what you want to do, use the
3727
+ [GNU Lesser General Public
3728
+ License](https://www.gnu.org/licenses/lgpl.html) instead of this
3729
+ License.
LICENSE_3RD_PARTY_PHP.md ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Project Licenses
2
+ This file was generated by the [PHP Legal Licenses](https://github.com/Comcast/php-legal-licenses) utility. It contains the name, version and commit sha, description, homepage, and license information for every dependency in this project.
3
+
4
+ ## Dependencies
5
+
6
+ ### devowl-wp/freemium (Version dev-develop | no sha)
7
+ Make your plugin to a freemium plugin with predefined Envato support
8
+ Homepage: Not configured.
9
+ Licenses Used: GPL-3.0-or-later
10
+ Make your plugin to a freemium plugin with predefined Envato support
11
+ Copyright (C) 2020 devowl
12
+
13
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
14
+
15
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
18
+
19
+ ### devowl-wp/real-utils (Version dev-feat/real-utils | no sha)
20
+ Create cross-selling ads, about page, rating and newsletter input for WP Real plugins.
21
+ Homepage: Not configured.
22
+ Licenses Used: GPL-3.0-or-later
23
+ Create cross-selling ads, about page, rating and newsletter input for WP Real plugins.
24
+ Copyright (C) 2020 devowl.io GmbH
25
+
26
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
27
+
28
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
29
+
30
+ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
31
+
32
+ ### devowl-wp/utils (Version dev-feat/multipackage | no sha)
33
+ Utility functionality for all your WordPress plugins
34
+ Homepage: Not configured.
35
+ Licenses Used: MIT
36
+ Organize your wordpress media library in a nice way with folders.
37
+ Copyright (C) 2020 devowl.io GmbH
38
+
39
+ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
40
+
41
+ This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
42
+
43
+ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
44
+
45
+ ### matthiasweb/wordpress-plugin-updater (Version dev-master | c801fd8)
46
+ A library for WordPress plugins, to utilize license verification and auto-updating using WordPress License Server.
47
+ Homepage: Not configured.
48
+ Licenses Used: MIT
49
+ MIT License
50
+
51
+ Copyright (c) 2018 Lukas von Mateffy
52
+
53
+ Permission is hereby granted, free of charge, to any person obtaining a copy
54
+ of this software and associated documentation files (the "Software"), to deal
55
+ in the Software without restriction, including without limitation the rights
56
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
57
+ copies of the Software, and to permit persons to whom the Software is
58
+ furnished to do so, subject to the following conditions:
59
+
60
+ The above copyright notice and this permission notice shall be included in all
61
+ copies or substantial portions of the Software.
62
+
63
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
64
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
65
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
66
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
67
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
68
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
69
+ SOFTWARE.
70
+
71
+
README.txt ADDED
@@ -0,0 +1,239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === WordPress Real Media Library: Media Library Folder & File Manager ===
2
+ Contributors: devowl, mguenter, jankarres
3
+ Tags: wordpress media library folders, media library folders, file manager, media folder, media library folder, media library category, media library categories, media category, subfolders, file manager, directories, folder, folders, organize, media library, enhanced Media, enhanced media library, media management, media directory, folder manager, wordpress, media library wizard, folders manager, media library folder, media folders, media directories, media categories, wordpress media library folders, wordpress media folder, wordpress media folders, wordpress media library
4
+ Stable tag: trunk
5
+ Requires at least: 5.0
6
+ Requires PHP: 7.0.0
7
+ Tested up to: 5.8
8
+ License: GPLv2 or later
9
+ License URI: https://www.gnu.org/licenses/gpl-2.0.en.html
10
+
11
+ Organize uploaded media in folders, collections and galleries: A file manager for WordPress. Media management made easy with Real Media Library! (Alternative to FileBird, Folders and Enhanced Media Library)
12
+
13
+ == Description ==
14
+
15
+ **Organize uploaded media in folders: A file manager for WordPress**
16
+
17
+ Real Media Library helps you with media management. Organize thousands of uploaded **files into folders, collections and galleries**. A real file manager that allows you to **manage large amounts of files such as pictures, videos or documents in WordPress.** Media library folders for everyone!
18
+
19
+ Create **UNLIMITED main folders** in the free version!
20
+
21
+ [youtube https://www.youtube.com/watch?v=INJ_sS81ua8]
22
+
23
+ === Free Sandbox ===
24
+
25
+ You want to try Real Media Library before installing? **Take a free sandbox** and play around!
26
+
27
+ [Create sandbox](https://try.devowl.io/?product=RML)
28
+
29
+ === Features ===
30
+
31
+ **Complete file and _folder manager_**: Create, rename, move and delete a folder
32
+
33
+ **_Drag & Drop_ your files in folders**: Drag & Drop and image to move it into a folder, where you can find other files
34
+
35
+ **Create _shortcuts_ for files**: Hold SHIFT and move a file with drag & drop to another folder in order to create a shortcut
36
+
37
+ **_Filter_ in inserting media dialog**: In the WordPress inserting media dialog, you find the folder on the left hand side to filter your files
38
+
39
+ **Custom _image order_**: Move files per drag & drop to change their order or use some order function e.g. to oder all files of the folder your are currently in by title ascending
40
+
41
+ **Works also great in _list-mode_**: Real Media library with a the WordPress media library in list-mode
42
+
43
+ **Advanced _upload management_**: On uploading a file, a modal appears, which shows the current status, remaining time of the upload and the upload speed
44
+
45
+ **Upload files _directly to folders_**: In the WordPress media upload dialog you choose in which folder your file should be uploaded
46
+
47
+ **_Create galleries_ from folder**: Create a gallery with the images of one gallery folder in the Gutenberg editor]
48
+
49
+ You want a list of all features? _Get it by scrolling down!_
50
+
51
+ === Supported Languages ===
52
+
53
+ Real Media Library is **in multiple languages available**:
54
+
55
+ * English
56
+ * German
57
+ * Dutch
58
+ * Spanish
59
+ * French
60
+ * Italian
61
+ * Porguese
62
+ * Swedish
63
+ * Turkish
64
+ * Indian
65
+ * Chinese
66
+ * Russian
67
+ * Persian
68
+ * Croatian
69
+
70
+ === All Features of Real Media Library ===
71
+
72
+ * WordPress 5.x / Gutenberg ready
73
+ * Folder for the WordPress media library
74
+ * Drag & Drop your files
75
+ * Works great on touch devices
76
+ * Create shortcuts of files in multiple folders. Shortcuts do not require physical storage space (0 kb).
77
+ * Full control over your folders in one toolbar (create, rename, delete)
78
+ * Rearrange folders by drag & drop or by criterium (e.g. name in ascending order)
79
+ * Sort folder contents by drag & drop or criteria (e.g. A-Z) automatically or once
80
+ * Bulk select folders and delete multiple folders at once
81
+ * Filter in the WordPress insert media dialog
82
+ * Advanced media library uploader
83
+ * Upload files directly to a folder
84
+ * Create dynamic galleries from a folder with Gutenberg block or shortcode
85
+ * Order folder contents by drag & drop or by criterion (date, name, ...)
86
+ * Quickly navigate to folders with quick folder search
87
+ * Translated into several languages
88
+ * Compatible with all major themes, page builders and many plugins
89
+ * Supports WordPress Multisite (each page has its own folder tree)
90
+ * GPDR/DSGVO: The plugin does not collect personal data without your consent!
91
+ * Import categories/folders from plugins like FileBird, FileBase, Folders, Media Library Assistant, Enhanced Media Library, Media Library Organizer, WordPress Media Library Folders by Mediamatic, Media Library Folders and more
92
+
93
+ === Compatibility ===
94
+
95
+ Real Media Library is **compatible with the most popular page builders, themes and popular WordPress plugins.** You can buy our plugin in the security that it works with your WordPress. In the rare case that the Real Media Library is not compatible with a popular page builder, theme or plugin, just [open a support ticket](https://devowl.io/support/) and **we will make it work**.
96
+
97
+ **Page Builders**
98
+
99
+ * [Gutenberg](https://wordpress.org/plugins/gutenberg/)
100
+ * [Visual Composer](https://visualcomposer.com/)
101
+ * [WPBakery Page Builder](https://wpbakery.com/)
102
+ * [Elementor](https://elementor.com/)
103
+ * [Divi Builder](https://www.elegantthemes.com/gallery/divi/)
104
+ * [Beaver Builder](https://www.wpbeaverbuilder.com/)
105
+
106
+ **Themes**
107
+
108
+ * [Avada](https://themeforest.net/item/avada-responsive-multipurpose-theme/2833226)
109
+ * [X The Theme](https://themeforest.net/item/x-the-theme/5871901)
110
+ * [Enfold](https://themeforest.net/item/enfold-responsive-multipurpose-theme/4519990)
111
+ * [BeTheme](https://themeforest.net/item/betheme-responsive-multipurpose-wordpress-theme/7758048)
112
+ * [The7](https://themeforest.net/item/the7-responsive-multipurpose-wordpress-theme/5556590)
113
+ * [Jupiter](https://themeforest.net/item/jupiter-multipurpose-responsive-theme/5177775)
114
+ * [Bridge](https://themeforest.net/item/bridge-creative-multipurpose-wordpress-theme/7315054)
115
+ * [Flatsome](https://themeforest.net/item/flatsome-multipurpose-responsive-woocommerce-theme/5484319)
116
+ * [Salient](https://themeforest.net/item/salient-responsive-multipurpose-theme/4363266)
117
+ * [Divi](https://www.elegantthemes.com/gallery/divi/)
118
+ * [Newspaper](https://themeforest.net/item/newspaper/5489609)
119
+ * [Uncode](https://themeforest.net/item/uncode-creative-multiuse-wordpress-theme/13373220)
120
+ * [YOOtheme](https://yootheme.com/)
121
+
122
+ **Plugins**
123
+
124
+ * [WooCommerce](https://woocommerce.com/)
125
+ * [WPML](https://wpml.org/)
126
+ * [PolyLang](https://polylang.pro/)
127
+ * [Justified Image Grid](https://codecanyon.net/item/justified-image-grid-premium-wordpress-gallery/2594251)
128
+ * [FooGallery](https://foo.gallery/)
129
+ * [Slider Revolution](https://codecanyon.net/item/slider-revolution-responsive-wordpress-plugin/2751380)
130
+ * [WP Slick Slider and Image Carousel](https://de.wordpress.org/plugins/wp-slick-slider-and-image-carousel/)
131
+ * [Essential Grid](https://codecanyon.net/item/essential-grid-wordpress-plugin/7563340)
132
+ * [Responsive Gallery Grid](https://de.wordpress.org/plugins/responsive-gallery-grid/)
133
+ * [WP/LR Sync](https://meowapps.com/plugin/wplr-sync/)
134
+ * [Thrive Quiz Builder](https://thrivethemes.com/quizbuilder/)
135
+ * [Dark Mode](https://wordpress.org/plugins/dark-mode/)
136
+ * [Medialist](https://wordpress.org/plugins/media-list/)
137
+
138
+
139
+ === Full-featured file manager for media management ===
140
+
141
+ Real Media Library is a WordPress plugin that empowers you with advanced media management. With this plugin you are able to organize the thousands of images, audio, video and PDF files in your media library into folders. Basically it is a file manager like Windows Explorer or Mac Finder, but for WordPress.
142
+
143
+ **Why do you need this plugin?**
144
+
145
+ A growing WordPress blog or website means that you add a lot of new media files to your database every day. In a few weeks your website will be filled with thousands of media files. How will you be able to find one of these files in a flat list? Of course, you can use the WordPress search function and spend a few hours to find a file, but who can remember the names of thousands of files?
146
+
147
+ **Organize your media with ease**
148
+
149
+ This is where the Real Media Library Plugin comes in. With this plugin you can easily create folders, collections and galleries for your pictures to organize your media library properly. Next time you're looking for a file, it's just a click away in the file manager.
150
+
151
+ Organizing your blog media files with the Real Media Library plugin is as easy as dragging and dropping them into folders. You can rearrange the order of your files by dragging them around to move the important files to the top of the list for faster access.
152
+
153
+ Additionally, you can use the Real Media Library plugin to add media galleries into your posts directly from the WordPress 'New Post' editor. This allows you to add an entire media folder as a customizable gallery to your WordPress posts.
154
+
155
+ The Real Media Library is the must-have WordPress plugin for media management, which can save you a lot of time that you have to spend on managing your media files.
156
+
157
+ **Folders, Collections and Galleries**
158
+
159
+ As you can see from the Real Media Library plugin screenshots (GIFs), it supports three ways to order your files:
160
+
161
+ Folder: A folder can contain any type of file and collections, but not galleries. To create a subfolder, simply select a folder from the list and click this button.
162
+
163
+ Collection: A collection cannot contain files. But you can create other collections and galleries there. The above mentioned gallery is only a gallery data folder, which means that they are not automatically placed in your frontend (your website). You can create a visual gallery from this gallery data folder using the Gutenberg editor in your page/post.
164
+
165
+ Gallery: A gallery data folder can only contain images. It is easier for you to distinguish where your visual galleries are located. You can also drag and drop the images into your own image order.
166
+
167
+ === Developer Friendly ===
168
+
169
+ You are a developer and want to write an add-on for Real Media Library or make your plugin compatible with ours? We are happy to help you!
170
+
171
+ **Frontend API**
172
+
173
+ Our plugin is written in React and we provide you with a JavaScript API that you can use inside a React application or with plain JavaScript.
174
+
175
+ [Read frontend documentation](https://devowl.io/wordpress-real-media-library/developer-api/)
176
+
177
+ **Backend API**
178
+
179
+ Our modern PHP backends offer WordPress actions & filters, an extensible PHP API and REST API endpoints. Work with what you prefer.
180
+
181
+ [Read backend documentation](https://devowl.io/wordpress-real-media-library/developer-api/)
182
+
183
+ **Free Support**
184
+
185
+ We like to work with other WordPress developers. If you need assistants to use our product for your code projects, just open a support ticket.
186
+
187
+ [Open a support ticket](https://devowl.io/support/)
188
+
189
+ === Go PRO of Real Media Library ===
190
+
191
+ You will download the free version of this plugin, which **contains all the core features and the ability to create unlimited main folders**.
192
+
193
+ Our PRO version offers even more useful features and subfolders to help you manage your media library in WordPress. [**Learn more about the PRO version.**](https://devowl.io/go/real-media-library?source=wordpress-org-description)
194
+
195
+ == Installation ==
196
+
197
+ 1. Go to your WordPress backend
198
+ 2. Navigate to "Plugins" > "Add New"
199
+ 3. Search for "Real Media Library"
200
+ 4. Install and activate the plugin
201
+ 5. Go to "Media" in the left sidebar and enjoy the advanced media management with folders
202
+
203
+ == Frequently Asked Questions ==
204
+
205
+ = Is this plugin compatible with WordPress 5? =
206
+ **Yes, we support WordPress 5.x** and regularly update your Real Media Library to support future versions.
207
+
208
+ = Does the plugin touch the file structure of my uploads? =
209
+ **No, only a virtual folder structure is created.** If you want to rearrange the file structure, please have a look at our add-on
210
+ [Real Physical Media](https://devowl.io/go/real-physical-media?source=wordpress-org-description).
211
+
212
+ = Whats happens then I uninstall Real Media Library? =
213
+ **Don't worry, you won't have any problems.** We're just creating a virtual folder structure. As a result of uninstalling, your media library will be the same as before the installation.
214
+
215
+ = Where can I find documentation or support for the plugin? =
216
+ We offer a [knowledge base and fast support](https://devowl.io/support/) on our website. **Please feel free to open a support ticket if you have questions, issues or feedback about the plugin.** We love to make Real Media Library better!
217
+
218
+ = Is Real Media Library free? =
219
+ **Yes, all core features of Real Media Library are free and you are able to create unlimited main folders.** You want more features like subfolders? [**Learn more about the PRO version.**](https://devowl.io/go/real-media-library?source=wordpress-org-description)
220
+
221
+ == Screenshots ==
222
+
223
+ 1. Complete file and folder manager
224
+ 2. Drag & Drop your files in folders
225
+ 3. Create shortcuts for files
226
+ 4. Filter in inserting media dialog
227
+ 5. Custom image order
228
+ 6. Works also great in list-mode
229
+ 7. Advanced upload management
230
+ 8. Upload files directly to folders
231
+ 9. Create galleries from folder
232
+
233
+ == Changelog ==
234
+
235
+ You can view the changelog and release notes [here](https://devowlio.gitbook.io/changelogs/plugins/real-media-library).
236
+
237
+ Real Media Library 4.14.1 or older had an XSS vulnerability. It could be exploited by logged in WordPress users with permissions to upload files, create folders and edit folders. We strongly recommend to install updates to 4.14.2 or newer!
238
+
239
+ == Upgrade Notice ==
inc/Activator.php ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Activator as UtilsActivator;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * The activator class handles the plugin relevant activation hooks: Uninstall, activation,
13
+ * deactivation and installation. The "installation" means installing needed database tables.
14
+ */
15
+ class Activator {
16
+ use UtilsProvider;
17
+ use UtilsActivator;
18
+ const DB_CHILD_QUERY_SUPPORTED = '_cqs';
19
+ const CHILD_UDF_NAME = 'fn_realmedialibrary_childs';
20
+ private $childSupportCurrentType = null;
21
+ /**
22
+ * Method gets fired when the user activates the plugin.
23
+ */
24
+ public function activate() {
25
+ /**
26
+ * This hook is fired when RML gets activated.
27
+ *
28
+ * @hook RML/Activate
29
+ */
30
+ do_action('RML/Activate');
31
+ }
32
+ /**
33
+ * Method gets fired when the user deactivates the plugin.
34
+ */
35
+ public function deactivate() {
36
+ // Your implementation...
37
+ }
38
+ /**
39
+ * Install tables, stored procedures or whatever in the database.
40
+ * This method is always called when the version bumps up or for
41
+ * the first initial activation.
42
+ *
43
+ * @param boolean $errorlevel If true throw errors
44
+ */
45
+ public function dbDelta($errorlevel) {
46
+ global $wpdb;
47
+ $charset_collate = $wpdb->get_charset_collate();
48
+ $this->supportsChildQuery(\true);
49
+ $max_index_length = $this->getMaxIndexLength();
50
+ // wp_realmedialibrary
51
+ $table_name = $this->getTableName();
52
+ $sql = "CREATE TABLE {$table_name} (\n id mediumint(9) NOT NULL AUTO_INCREMENT,\n parent mediumint(9) DEFAULT '-1' NOT NULL,\n name tinytext NOT NULL,\n slug text DEFAULT '' NOT NULL,\n absolute text DEFAULT '' NOT NULL,\n owner bigint(20) NOT NULL,\n ord mediumint(10) DEFAULT 0 NOT NULL,\n oldCustomOrder mediumint(10) DEFAULT NULL,\n contentCustomOrder tinyint(1) DEFAULT 0 NOT NULL,\n type varchar(10) DEFAULT '0' NOT NULL,\n restrictions varchar(255) DEFAULT '' NOT NULL,\n cnt mediumint(10) DEFAULT NULL,\n importId bigint(20) DEFAULT NULL,\n PRIMARY KEY (id)\n ) {$charset_collate};";
53
+ dbDelta($sql);
54
+ if ($errorlevel) {
55
+ $wpdb->print_error();
56
+ }
57
+ // Table wp_realmedialibrary_posts
58
+ $table_name = $this->getTableName('posts');
59
+ $sql = "CREATE TABLE {$table_name} (\n attachment bigint(20) NOT NULL,\n fid mediumint(9) NOT NULL DEFAULT '-1',\n isShortcut bigint(20) NOT NULL DEFAULT 0,\n nr bigint(20),\n oldCustomNr bigint(20) DEFAULT NULL,\n importData text,\n KEY rmljoin (attachment,fid),\n PRIMARY KEY (attachment,isShortcut)\n ) {$charset_collate};";
60
+ dbDelta($sql);
61
+ // Table wp_realmedialibrary_meta
62
+ $table_name = $this->getTableName('meta');
63
+ $sql = "CREATE TABLE {$table_name} (\n `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n `realmedialibrary_id` bigint(20) unsigned NOT NULL DEFAULT '0',\n `meta_key` varchar(255) DEFAULT NULL,\n `meta_value` longtext,\n PRIMARY KEY (meta_id),\n KEY realmedialibrary_id (realmedialibrary_id),\n KEY meta_key (meta_key({$max_index_length}))\n ) {$charset_collate};";
64
+ dbDelta($sql);
65
+ if ($errorlevel) {
66
+ $wpdb->print_error();
67
+ }
68
+ }
69
+ /**
70
+ * Create a MySQL function wp_realmedialibrary_childs to read recursively
71
+ * children of a folder.
72
+ */
73
+ public function createChildQueryFunction() {
74
+ global $wpdb;
75
+ $function_name = $wpdb->prefix . self::CHILD_UDF_NAME;
76
+ $table_name = $this->getTableName();
77
+ // phpcs:disable WordPress.DB.PreparedSQL
78
+ $wpdb->query("DROP FUNCTION IF EXISTS {$function_name}");
79
+ // phpcs:enable WordPress.DB.PreparedSQL
80
+ $sql =
81
+ "CREATE FUNCTION {$function_name}(rootId INT, _useTempChildTableForCheck BOOLEAN)\n RETURNS varchar(1000)\n NOT DETERMINISTIC\n READS SQL DATA\n SQL SECURITY INVOKER\n BEGIN\n \tDECLARE sTemp VARCHAR(1000);\n \tDECLARE sTempChd VARCHAR(1000);\n \tSET sTemp = '\$';\n \tSET sTempChd = CAST(rootId AS CHAR);\n\t\t SET SESSION group_concat_max_len = 100000;\n \tWHILE sTempChd IS NOT NULL DO\n \t\tSET sTemp = CONCAT(sTemp,',',sTempChd);\n \t\tIF _useTempChildTableForCheck IS NULL OR _useTempChildTableForCheck = false THEN\n \t\t SELECT GROUP_CONCAT(id) INTO sTempChd FROM {$table_name} WHERE FIND_IN_SET(parent,sTempChd) > 0;\n \t\tELSE\n \t\t SELECT GROUP_CONCAT(id) INTO sTempChd FROM " .
82
+ $this->getTableName('tmp') .
83
+ ' WHERE FIND_IN_SET(parent,sTempChd) > 0;
84
+ END IF;
85
+ END WHILE;
86
+ RETURN sTemp;
87
+ END';
88
+ $suppress = $wpdb->suppress_errors();
89
+ // phpcs:disable WordPress.DB.PreparedSQL
90
+ $wpdb->query($sql);
91
+ // phpcs:enable WordPress.DB.PreparedSQL
92
+ $wpdb->suppress_errors($suppress);
93
+ }
94
+ /**
95
+ * Checks if the current database supports functions or recursive drill-down query.
96
+ *
97
+ * @param boolean $force
98
+ * @param string $type Can be 'legacy' or 'function'.
99
+ * @see wp_rml_all_children_sql_supported
100
+ * @return boolean
101
+ */
102
+ public function supportsChildQuery($force = \false, $type = 'legacy') {
103
+ global $wpdb;
104
+ $value = get_option(RML_OPT_PREFIX . self::DB_CHILD_QUERY_SUPPORTED, null);
105
+ $function_exists = $this->checkDirtyFunction($wpdb->prefix . self::CHILD_UDF_NAME);
106
+ // The function does not exist but the option says, that it is supported -> force
107
+ if (!$function_exists && ($value === '2' || $force)) {
108
+ $this->debug(
109
+ 'The database function does not exist but the option says, it is supported... force recreation',
110
+ __METHOD__
111
+ );
112
+ $this->install(\false, [$this, 'createChildQueryFunction']);
113
+ $force = \true;
114
+ }
115
+ if ($value === null || $force) {
116
+ $this->childSupportCurrentType = 'function';
117
+ $this->install(\false, [$this, 'checkChildQuery']);
118
+ $value = get_option(RML_OPT_PREFIX . self::DB_CHILD_QUERY_SUPPORTED, null);
119
+ if ($type === 'function') {
120
+ return $value > 0;
121
+ }
122
+ // Fallback to the legacy
123
+ if ($value === '0') {
124
+ $this->childSupportCurrentType = 'legacy';
125
+ $this->install(\false, [$this, 'checkChildQuery']);
126
+ $value = get_option(RML_OPT_PREFIX . self::DB_CHILD_QUERY_SUPPORTED, null);
127
+ }
128
+ }
129
+ if ($type === 'function') {
130
+ return $value === '2';
131
+ }
132
+ return $value > 0;
133
+ }
134
+ /**
135
+ * Check if the current instance type works as expected.
136
+ */
137
+ public function checkChildQuery() {
138
+ // phpcs:disable WordPress.DB.PreparedSQL
139
+ global $wpdb;
140
+ $charset_collate = $wpdb->get_charset_collate();
141
+ $suppress = $wpdb->suppress_errors();
142
+ $table_name = $this->getTableName('tmp');
143
+ // Main table
144
+ $sql = "CREATE TABLE {$table_name} (\n\t\t\tid mediumint(9) NOT NULL AUTO_INCREMENT,\n\t\t\tparent mediumint(9) DEFAULT '-1' NOT NULL,\n\t\t\tname tinytext NOT NULL,\n\t\t\tord mediumint(10) DEFAULT 0 NOT NULL,\n\t\t\tPRIMARY KEY (id)\n\t\t) {$charset_collate};";
145
+ dbDelta($sql);
146
+ $wpdb->query('DELETE FROM ' . $table_name);
147
+ // Create hierarchy
148
+ $wpdb->query('INSERT INTO ' . $table_name . ' VALUES(NULL, -1, "Root", 0)');
149
+ $wpdb->query(
150
+ 'INSERT INTO ' . $table_name . ' VALUES(NULL, ' . $wpdb->insert_id . ', "Roots 1st child (Bob)", 0)'
151
+ );
152
+ $bob = $wpdb->insert_id;
153
+ $wpdb->query('INSERT INTO ' . $table_name . ' VALUES(NULL, ' . $bob . ', "Bobs 1st child", 0)');
154
+ $wpdb->query('INSERT INTO ' . $table_name . ' VALUES(NULL, ' . $bob . ', "Bobs 2nd child (Marie)", 1)');
155
+ $wpdb->query('INSERT INTO ' . $table_name . ' VALUES(NULL, ' . $wpdb->insert_id . ', "Maries 1st child", 0)');
156
+ // Check query result
157
+ $sql = \MatthiasWeb\RealMediaLibrary\Util::getInstance()->createSQLForAllChildren(
158
+ $bob,
159
+ \true,
160
+ null,
161
+ $this->childSupportCurrentType
162
+ );
163
+ $sql = \str_replace($this->getTableName(), $table_name, $sql);
164
+ $supported = \count($wpdb->get_results($sql)) === 4;
165
+ $onSuccess = $this->childSupportCurrentType === 'function' ? '2' : '1';
166
+ $option_value = $supported ? $onSuccess : '0';
167
+ update_option(RML_OPT_PREFIX . self::DB_CHILD_QUERY_SUPPORTED, $option_value, \true);
168
+ $this->debug(
169
+ 'Your system supports recursive child SQL queries: ' . $this->childSupportCurrentType . '=' . $option_value,
170
+ __METHOD__
171
+ );
172
+ $wpdb->query('DELETE FROM ' . $table_name);
173
+ // phpcs:enable WordPress.DB.PreparedSQL
174
+ $wpdb->suppress_errors($suppress);
175
+ }
176
+ /**
177
+ * Checks if the Database supports functions but the function is not yet created (due to exports for example).
178
+ *
179
+ * @param string $function_name
180
+ * @return boolean
181
+ */
182
+ public function checkDirtyFunction($function_name) {
183
+ global $wpdb;
184
+ return $wpdb->get_var($wpdb->prepare('SHOW FUNCTION STATUS LIKE %s', $function_name), 1) === $function_name;
185
+ }
186
+ }
inc/AdInitiator.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\AbstractInitiator;
6
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\WelcomePage;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * Initiate real-utils functionality.
14
+ */
15
+ class AdInitiator extends \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\AbstractInitiator {
16
+ use UtilsProvider;
17
+ /**
18
+ * Documented in AbstractInitiator.
19
+ *
20
+ * @codeCoverageIgnore
21
+ */
22
+ public function getPluginBase() {
23
+ return $this;
24
+ }
25
+ /**
26
+ * Documented in AbstractInitiator.
27
+ *
28
+ * @codeCoverageIgnore
29
+ */
30
+ public function getPluginAssets() {
31
+ return $this->getCore()->getAssets();
32
+ }
33
+ /**
34
+ * Documented in AbstractInitiator.
35
+ *
36
+ * @codeCoverageIgnore
37
+ */
38
+ public function getRateLink() {
39
+ return $this->isPro()
40
+ ? 'https://devowl.io/go/codecanyon/real-media-library/rate'
41
+ : 'https://devowl.io/go/wordpress-org/real-media-library/rate';
42
+ }
43
+ /**
44
+ * Documented in AbstractInitiator.
45
+ *
46
+ * @codeCoverageIgnore
47
+ */
48
+ public function getKeyFeatures() {
49
+ $isPro = $this->isPro();
50
+ return [
51
+ [
52
+ 'image' => $this->getAssetsUrl('full-control.gif'),
53
+ 'title' => __('Complete file and folder manager', RML_TD),
54
+ 'description' => __(
55
+ 'Real Media Library is a WordPress plugin that empowers you with advanced media management. You can use this plugin to organize the thousands of images, audio, video and PDF files in your media library into folders. Basically it is a file manager like Windows Explorer or Mac Finder, but for WordPress.',
56
+ RML_TD
57
+ ),
58
+ 'available_in' => $isPro
59
+ ? null
60
+ : [
61
+ ['Lite', \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\WelcomePage::COLOR_BADGE_LITE],
62
+ ['Pro', \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\WelcomePage::COLOR_BADGE_PRO]
63
+ ]
64
+ ],
65
+ [
66
+ 'image' => $this->getAssetsUrl('inserting-media-dialog.gif'),
67
+ 'title' => __('Filter in insert media dialog', RML_TD),
68
+ 'description' => __(
69
+ 'No matter where you are, the folder structure of Real Media Library is always where you can select files. For example in the dialog for selecting a "Featured Image".',
70
+ RML_TD
71
+ ),
72
+ 'available_in' => $isPro
73
+ ? null
74
+ : [['Pro', \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\WelcomePage::COLOR_BADGE_PRO]],
75
+ 'highlight_badge' => $isPro
76
+ ? null
77
+ : [
78
+ 'Lite',
79
+ \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\WelcomePage::COLOR_BADGE_LITE,
80
+ __('In the Lite version you can only select the folder by a simple dropdown.', RML_TD)
81
+ ]
82
+ ],
83
+ [
84
+ 'image' => $this->getAssetsUrl('order-content.gif'),
85
+ 'title' => __('Custom image order', RML_TD),
86
+ 'description' => __(
87
+ 'Organizing your media files is really easy with the Real Media Library plugin. You can arrange the order of your files yourself by dragging and dropping. This allows you to move important files to the top for faster access.',
88
+ RML_TD
89
+ ),
90
+ 'available_in' => $isPro
91
+ ? null
92
+ : [['Pro', \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\WelcomePage::COLOR_BADGE_PRO]]
93
+ ]
94
+ ];
95
+ }
96
+ /**
97
+ * Documented in AbstractInitiator.
98
+ *
99
+ * @codeCoverageIgnore
100
+ */
101
+ public function getHeroButton() {
102
+ return $this->isPro() ? null : [__('Get your PRO license now!', RML_TD), RML_PRO_VERSION];
103
+ }
104
+ /**
105
+ * Documented in AbstractInitiator.
106
+ *
107
+ * @param boolean $isFirstTime
108
+ * @codeCoverageIgnore
109
+ */
110
+ public function getNextRatingPopup($isFirstTime) {
111
+ return $this->isPro() ? \strtotime('+90 days') : parent::getNextRatingPopup($isFirstTime);
112
+ }
113
+ }
inc/Assets.php ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\Assets as FreemiumAssets;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\comp\ExImport;
8
+ use MatthiasWeb\RealMediaLibrary\folder\Creatable;
9
+ use MatthiasWeb\RealMediaLibrary\order\Sortable;
10
+ use MatthiasWeb\RealMediaLibrary\view\Lang;
11
+ use MatthiasWeb\RealMediaLibrary\view\Options;
12
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Assets as UtilsAssets;
13
+ use WP_Post;
14
+ // @codeCoverageIgnoreStart
15
+ \defined('ABSPATH') or die('No script kiddies please!');
16
+ // Avoid direct file request
17
+ // @codeCoverageIgnoreEnd
18
+ /**
19
+ * Asset management for frontend scripts and styles.
20
+ */
21
+ class Assets {
22
+ use UtilsProvider;
23
+ use UtilsAssets;
24
+ use FreemiumAssets;
25
+ public static $TYPE_CUSTOMIZE = 'customize_controls_print_scripts';
26
+ /**
27
+ * Media Library Assistant screen base.
28
+ */
29
+ const MLA_SCREEN_BASE = 'media_page_mla-menu';
30
+ /**
31
+ * Enqueue gutenberg specific files.
32
+ */
33
+ public function enqueue_block_editor_assets() {
34
+ $this->enqueuePolyfills();
35
+ $this->enqueueScript(
36
+ RML_SLUG . '-gutenberg',
37
+ [[$this->isPro(), 'rml_gutenberg.pro.js'], 'rml_gutenberg.lite.js'],
38
+ ['wp-blocks', 'wp-i18n', 'wp-element', 'es6-shim', 'es7-shim']
39
+ );
40
+ }
41
+ /**
42
+ * Enqueue ES6 and ES7 shims.
43
+ *
44
+ * Due to LEGACY purposes the usual way by core-js built-ins is not used. Also, antd is
45
+ * not yet compatible with core-js@3 + plugin-transform-runtime disables helpers.
46
+ */
47
+ private function enqueuePolyfills() {
48
+ $this->enqueueLibraryScript('es6-shim', 'es6-shim/es6-shim.min.js');
49
+ $this->enqueueLibraryScript('es7-shim', 'es7-shim/dist/es7-shim.min.js', ['es6-shim']);
50
+ }
51
+ /**
52
+ * Enqueue scripts and styles depending on the type. This function is called
53
+ * from both admin_enqueue_scripts and wp_enqueue_scripts. You can check the
54
+ * type through the $type parameter. In this function you can include your
55
+ * external libraries from src/public/lib, too.
56
+ *
57
+ * Due to LEGACY transformation the devowl-wp-utils package was removed from package.json.
58
+ *
59
+ * @param string $type The type (see utils Assets constants)
60
+ * @param string $hook_suffix The current admin page
61
+ */
62
+ public function enqueue_scripts_and_styles($type, $hook_suffix = null) {
63
+ /**
64
+ * Checks if assets for RML should be skipped. This can be useful in
65
+ * combination with page builders.
66
+ *
67
+ * @param {boolean} $skip True for skip and false for load
68
+ * @param {string} $type The context type
69
+ * @return {boolean}
70
+ * @hook RML/Scripts/Skip
71
+ * @since 4.5.2
72
+ */
73
+ $skip = apply_filters('RML/Scripts/Skip', \false, $type);
74
+ if (!wp_rml_active() || $skip) {
75
+ return;
76
+ }
77
+ // Generally check if an entrypoint should be loaded
78
+ if (
79
+ !\in_array($type, [self::$TYPE_ADMIN, self::$TYPE_CUSTOMIZE], \true) &&
80
+ !\MatthiasWeb\RealMediaLibrary\view\Options::load_frontend()
81
+ ) {
82
+ return;
83
+ }
84
+ // jQuery scripts (Helper) core.js, widget.js, mouse.js, draggable.js, droppable.js, sortable.js
85
+ $requires = [
86
+ 'jquery',
87
+ 'jquery-ui-core',
88
+ 'jquery-ui-widget',
89
+ 'jquery-ui-mouse',
90
+ 'jquery-ui-draggable',
91
+ 'jquery-ui-droppable',
92
+ 'jquery-ui-sortable',
93
+ 'jquery-touch-punch'
94
+ ];
95
+ $realUtils = RML_ROOT_SLUG . '-real-utils-helper';
96
+ \array_walk($requires, 'wp_enqueue_script');
97
+ // Your assets implementation here... See utils Assets for enqueue* methods
98
+ $useNonMinifiedSources = $this->useNonMinifiedSources();
99
+ // Use this variable if you need to differ between minified or non minified sources
100
+ // Our utils package relies on jQuery, but this shouldn't be a problem as the most themes still use jQuery (might be replaced with https://github.com/github/fetch)
101
+ // Enqueue external utils package
102
+ $scriptDeps = $this->enqueueUtils();
103
+ $scriptDeps = \array_merge(
104
+ $scriptDeps,
105
+ [$realUtils, 'es6-shim', 'es7-shim', 'i18n-react', 'react-aiot.vendor', 'react-aiot'],
106
+ $requires
107
+ );
108
+ // Enqueue plugin entry points
109
+ wp_enqueue_media(['post' => get_query_var('post-id', null)]);
110
+ add_thickbox();
111
+ wp_enqueue_script('wp-api');
112
+ $this->enqueuePolyfills();
113
+ $this->enqueueLibraryScript(
114
+ 'i18n-react',
115
+ [[$useNonMinifiedSources, 'i18n-react/dist/i18n-react.umd.js'], 'i18n-react/dist/i18n-react.umd.min.js'],
116
+ [self::$HANDLE_REACT_DOM]
117
+ );
118
+ $this->enqueueLibraryScript(
119
+ 'mobx-state-tree',
120
+ [
121
+ [$useNonMinifiedSources, 'mobx-state-tree/dist/mobx-state-tree.umd.js'],
122
+ 'mobx-state-tree/dist/mobx-state-tree.umd.min.js'
123
+ ],
124
+ [self::$HANDLE_MOBX]
125
+ );
126
+ $this->enqueueLibraryScript('react-aiot.vendor', 'react-aiot/umd/react-aiot.vendor.umd.js', [
127
+ self::$HANDLE_REACT_DOM
128
+ ]);
129
+ $this->enqueueLibraryScript('react-aiot', 'react-aiot/umd/react-aiot.umd.js', ['react-aiot.vendor']);
130
+ $this->enqueueLibraryStyle('react-aiot.vendor', 'react-aiot/umd/react-aiot.vendor.umd.css');
131
+ $this->enqueueLibraryStyle('react-aiot', 'react-aiot/umd/react-aiot.umd.css', ['react-aiot.vendor']);
132
+ $handle = $this->enqueueScript('rml', [[$this->isPro(), 'rml.pro.js'], 'rml.lite.js'], $scriptDeps);
133
+ $this->enqueueStyle('rml', 'rml.css', [$realUtils]);
134
+ // Plugin icon font
135
+ wp_enqueue_style('rml-font', plugins_url('public/others/icons/css/rml.css', RML_FILE), [], RML_VERSION);
136
+ // Localize script with server-side variables (RML_SLUG_CAMELCASE can not be used in lite environment, use LEGACY rmlOpts)
137
+ wp_localize_script($handle, RML_OPT_PREFIX . 'Opts', $this->localizeScript($type));
138
+ // Add inline-style to avoid flickering effect
139
+ if ($this->isScreenBase('upload') || $this->isScreenBase(self::MLA_SCREEN_BASE)) {
140
+ wp_add_inline_style($handle, '#wpbody { display: none; }');
141
+ }
142
+ /**
143
+ * This action is fired when RML has enqueued scripts and styles.
144
+ *
145
+ * @param {Assets} $assets The assets instance
146
+ * @hook RML/Scripts
147
+ */
148
+ do_action('RML/Scripts', $this);
149
+ }
150
+ /**
151
+ * Enqueue scripts in customize (sidebar). This is essential e. g. for YOOTheme page builder.
152
+ *
153
+ * @param string $hook_suffix
154
+ */
155
+ public function customize_controls_print_scripts($hook_suffix) {
156
+ $this->enqueue_scripts_and_styles(self::$TYPE_CUSTOMIZE, $hook_suffix);
157
+ }
158
+ /**
159
+ * Localize the WordPress backend and frontend. If you want to provide URLs to the
160
+ * frontend you have to consider that some JS libraries do not support umlauts
161
+ * in their URI builder. For this you can use utils Assets#getAsciiUrl.
162
+ *
163
+ * Also, if you want to use the options typed in your frontend you should
164
+ * adjust the following file too: src/public/ts/store/option.tsx
165
+ *
166
+ * @param string $context
167
+ * @return array
168
+ */
169
+ public function overrideLocalizeScript($context) {
170
+ $mode = get_user_option('media_library_mode', get_current_user_id());
171
+ $mode = $mode ? $mode : 'grid';
172
+ // Compatibility with MLA plugin
173
+ if ($this->isScreenBase(self::MLA_SCREEN_BASE)) {
174
+ $mode = 'list';
175
+ }
176
+ $core = $this->getCore();
177
+ $isLicenseActivated = $this->isPro() ? $core->getUpdater()->isActivated() : \true;
178
+ $isLicenseNoticeDismissed = $core->isLicenseNoticeDismissed();
179
+ $exImport = \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance();
180
+ // Media Library notices
181
+ if ($this->isScreenBase('upload') || $this->isScreenBase(self::MLA_SCREEN_BASE)) {
182
+ $mlNotices = [
183
+ 'showLicenseNotice' =>
184
+ !$isLicenseActivated && !$isLicenseNoticeDismissed && current_user_can('activate_plugins'),
185
+ 'showTaxImportNotice' =>
186
+ !$exImport->isImportTaxNoticeDismissed() &&
187
+ (\count($exImport->getHierarchicalTaxos()) > 0 ||
188
+ $exImport->hasMediaLibraryFolders() ||
189
+ $exImport->hasFileBird())
190
+ ];
191
+ } else {
192
+ $mlNotices = ['showLicenseNotice' => \false, 'showTaxImportNotice' => \false];
193
+ }
194
+ return apply_filters(
195
+ 'RML/Localize',
196
+ \array_merge(
197
+ [
198
+ 'canManageOptions' => current_user_can('manage_options'),
199
+ 'lang' => (new \MatthiasWeb\RealMediaLibrary\view\Lang())->getItems($this),
200
+ 'childrenSql' => \intval(
201
+ get_option(
202
+ RML_OPT_PREFIX . \MatthiasWeb\RealMediaLibrary\Activator::DB_CHILD_QUERY_SUPPORTED,
203
+ null
204
+ )
205
+ ),
206
+ 'lastQueried' => wp_rml_last_queried_folder(),
207
+ 'blogId' => get_current_blog_id(),
208
+ 'rootId' => _wp_rml_root(),
209
+ 'listMode' => $mode,
210
+ 'userSettings' => has_filter('RML/User/Settings/Content'),
211
+ 'sortables' => [
212
+ 'content' => \MatthiasWeb\RealMediaLibrary\order\Sortable::getAvailableContentOrders(\true),
213
+ 'tree' => \MatthiasWeb\RealMediaLibrary\folder\Creatable::getAvailableSubfolderOrders(\true)
214
+ ],
215
+ 'taxImportNoticeLink' => admin_url('options-media.php#rml-rml_export_data'),
216
+ 'pluginsUrl' => admin_url('plugins.php')
217
+ ],
218
+ $mlNotices,
219
+ $this->localizeFreemiumScript()
220
+ )
221
+ );
222
+ }
223
+ /**
224
+ * Add an "Add-On" link to the plugin row links.
225
+ *
226
+ * @param string[] $links
227
+ * @param string $file
228
+ * @return string[]
229
+ */
230
+ public function plugin_row_meta($links, $file) {
231
+ if (\false !== \strpos($file, plugin_basename(RML_FILE))) {
232
+ $links[] =
233
+ '<a target="_blank" href="https://devowl.io/wordpress-real-media-library/#complementary-plugins"><strong>' .
234
+ __('Complementary Plugins', RML_TD) .
235
+ '</strong></a>';
236
+ }
237
+ return $links;
238
+ }
239
+ /**
240
+ * Modify the media view strings for a shortcut hint in the media grid view.
241
+ * This function is also used to return the single string for the note when
242
+ * $strings is false.
243
+ *
244
+ * 'warnDelete'
245
+ * 'warnBulkDelete'
246
+ *
247
+ * @param string[] $strings
248
+ * @return string[]
249
+ */
250
+ public function media_view_strings($strings) {
251
+ $str = __(
252
+ "\n\nNote: If you want to delete a shortcut file, the source file will NOT be deleted.\nIf you want to delete a non-shortcut file, all associated shortcuts are deleted, too.",
253
+ RML_TD
254
+ );
255
+ if ($strings === \false) {
256
+ return $str;
257
+ }
258
+ if (isset($strings['warnDelete'])) {
259
+ $strings['warnDelete'] .= $str;
260
+ }
261
+ if (isset($strings['warnBulkDelete'])) {
262
+ $strings['warnBulkDelete'] .= $str;
263
+ }
264
+ return $strings;
265
+ }
266
+ /**
267
+ * Modify the media view strings for a shortcut hint in the media table view.
268
+ *
269
+ * @param array $actions
270
+ * @param WP_Post $post
271
+ * @return array
272
+ */
273
+ public function media_row_actions($actions, $post) {
274
+ if (isset($actions['delete'])) {
275
+ $actions['delete'] = \str_replace('showNotice.warn();', 'window.rmlWarnDelete();', $actions['delete']);
276
+ }
277
+ // Add a table mode "helper" to create the rml icon
278
+ if (wp_attachment_is_shortcut($post)) {
279
+ $actions['rmlShortcutSpan'] = '&nbsp;';
280
+ }
281
+ return $actions;
282
+ }
283
+ }
inc/Core.php ADDED
@@ -0,0 +1,341 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\CountCache;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\CustomField;
7
+ use MatthiasWeb\RealMediaLibrary\attachment\Filter;
8
+ use MatthiasWeb\RealMediaLibrary\attachment\Permissions;
9
+ use MatthiasWeb\RealMediaLibrary\attachment\Shortcut;
10
+ use MatthiasWeb\RealMediaLibrary\attachment\Upload;
11
+ use MatthiasWeb\RealMediaLibrary\base\Core as BaseCore;
12
+ use MatthiasWeb\RealMediaLibrary\comp\ExImport;
13
+ use MatthiasWeb\RealMediaLibrary\comp\ExportMediaLibrary;
14
+ use MatthiasWeb\RealMediaLibrary\comp\PageBuilders;
15
+ use MatthiasWeb\RealMediaLibrary\comp\PolyLang;
16
+ use MatthiasWeb\RealMediaLibrary\comp\WPML;
17
+ use MatthiasWeb\RealMediaLibrary\folder\Folder as FolderFolder;
18
+ use MatthiasWeb\RealMediaLibrary\lite\Core as LiteCore;
19
+ use MatthiasWeb\RealMediaLibrary\metadata\CoverImage;
20
+ use MatthiasWeb\RealMediaLibrary\metadata\Description;
21
+ use MatthiasWeb\RealMediaLibrary\metadata\Meta;
22
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\IOverrideCore;
23
+ use MatthiasWeb\RealMediaLibrary\rest\Attachment;
24
+ use MatthiasWeb\RealMediaLibrary\rest\Folder;
25
+ use MatthiasWeb\RealMediaLibrary\rest\Reset;
26
+ use MatthiasWeb\RealMediaLibrary\rest\Service;
27
+ use MatthiasWeb\RealMediaLibrary\usersettings\AllFilesShortcuts;
28
+ use MatthiasWeb\RealMediaLibrary\usersettings\DefaultFolder;
29
+ use MatthiasWeb\RealMediaLibrary\usersettings\InfiniteScrolling;
30
+ use MatthiasWeb\RealMediaLibrary\view\FolderShortcode;
31
+ use MatthiasWeb\RealMediaLibrary\view\Gutenberg;
32
+ use MatthiasWeb\RealMediaLibrary\view\Options;
33
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\Core as RealUtilsCore;
34
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Service as UtilsService;
35
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\ServiceNoStore;
36
+ // @codeCoverageIgnoreStart
37
+ \defined('ABSPATH') or die('No script kiddies please!');
38
+ // Avoid direct file request
39
+ require_once 'base/others/class-alias.php';
40
+ // @codeCoverageIgnoreEnd
41
+ /**
42
+ * Singleton core class which handles the main system for plugin. It includes
43
+ * registering of the autoload, all hooks (actions & filters) (see BaseCore class).
44
+ */
45
+ class Core extends \MatthiasWeb\RealMediaLibrary\base\Core implements
46
+ \MatthiasWeb\RealMediaLibrary\overrides\interfce\IOverrideCore {
47
+ use LiteCore;
48
+ /**
49
+ * Singleton instance.
50
+ */
51
+ private static $me;
52
+ /**
53
+ * Application core constructor.
54
+ */
55
+ protected function __construct() {
56
+ parent::__construct();
57
+ // Load no-namespace API functions
58
+ foreach (['attachment', 'folders', 'meta'] as $apiInclude) {
59
+ require_once RML_PATH . '/inc/api/' . $apiInclude . '.php';
60
+ }
61
+ // Enable `no-store` for our relevant WP REST API endpoints
62
+ \MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\ServiceNoStore::hook(
63
+ '/' . \MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Service::getNamespace($this)
64
+ );
65
+ \MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\ServiceNoStore::hook(
66
+ '/' . \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE
67
+ );
68
+ // Register creatables
69
+ wp_rml_register_creatable(\MatthiasWeb\RealMediaLibrary\folder\Folder::class, RML_TYPE_FOLDER);
70
+ // Register all your before init hooks here
71
+ add_action('admin_init', [\MatthiasWeb\RealMediaLibrary\view\Options::getInstance(), 'register_fields']);
72
+ add_filter(
73
+ 'RML/Validate/Insert',
74
+ [\MatthiasWeb\RealMediaLibrary\attachment\Permissions::getInstance(), 'insert'],
75
+ 10,
76
+ 3
77
+ );
78
+ add_filter(
79
+ 'RML/Validate/Create',
80
+ [\MatthiasWeb\RealMediaLibrary\attachment\Permissions::getInstance(), 'create'],
81
+ 10,
82
+ 4
83
+ );
84
+ add_filter(
85
+ 'RML/Validate/Rename',
86
+ [\MatthiasWeb\RealMediaLibrary\attachment\Permissions::getInstance(), 'setName'],
87
+ 10,
88
+ 3
89
+ );
90
+ add_filter(
91
+ 'RML/Validate/Delete',
92
+ [\MatthiasWeb\RealMediaLibrary\attachment\Permissions::getInstance(), 'deleteFolder'],
93
+ 10,
94
+ 3
95
+ );
96
+ add_filter('wp_die_ajax_handler', [$this, 'update_count'], 1);
97
+ add_filter('wp_die_handler', [$this, 'update_count'], 1);
98
+ add_filter('rest_post_dispatch', [$this, 'update_count']);
99
+ add_filter('wp_die_xmlrpc_handler', [$this, 'update_count'], 1);
100
+ add_filter('wp_redirect', [$this, 'update_count'], 1);
101
+ $this->overrideConstruct();
102
+ $this->overrideConstructFreemium();
103
+ $this->compatibilities(\false);
104
+ (new \MatthiasWeb\RealMediaLibrary\AdInitiator())->start();
105
+ }
106
+ /**
107
+ * The init function is fired even the init hook of WordPress. If possible
108
+ * it should register all hooks to have them in one place.
109
+ */
110
+ public function init() {
111
+ // Add our folder shortcode
112
+ global $shortcode_tags;
113
+ add_shortcode('folder-gallery', $shortcode_tags['gallery']);
114
+ \MatthiasWeb\RealMediaLibrary\view\FolderShortcode::getInstance();
115
+ $restService = new \MatthiasWeb\RealMediaLibrary\rest\Service();
116
+ $restAttachment = new \MatthiasWeb\RealMediaLibrary\rest\Attachment();
117
+ // Register all your hooks here
118
+ add_action('rest_api_init', [$restService, 'rest_api_init']);
119
+ add_action('rest_api_init', [new \MatthiasWeb\RealMediaLibrary\rest\Folder(), 'rest_api_init']);
120
+ add_action('rest_api_init', [$restAttachment, 'rest_api_init']);
121
+ add_action('rest_api_init', [new \MatthiasWeb\RealMediaLibrary\rest\Reset(), 'rest_api_init']);
122
+ add_action('rest_attachment_collection_params', [$restAttachment, 'rest_attachment_collection_params']);
123
+ add_action('rest_attachment_query', [$restAttachment, 'rest_attachment_query'], 10, 2);
124
+ add_action('admin_enqueue_scripts', [$this->getAssets(), 'admin_enqueue_scripts']);
125
+ add_action('wp_enqueue_scripts', [$this->getAssets(), 'wp_enqueue_scripts']);
126
+ add_action('customize_controls_print_scripts', [$this->getAssets(), 'customize_controls_print_scripts']);
127
+ add_action(
128
+ 'pre_get_posts',
129
+ [\MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(), 'pre_get_posts'],
130
+ 998
131
+ );
132
+ add_action('delete_attachment', [
133
+ \MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance(),
134
+ 'delete_attachment'
135
+ ]);
136
+ add_action('delete_attachment', [
137
+ \MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(),
138
+ 'delete_attachment'
139
+ ]);
140
+ add_action('plugin_row_meta', [$this->getAssets(), 'plugin_row_meta'], 10, 2);
141
+ add_action('pre-upload-ui', [\MatthiasWeb\RealMediaLibrary\attachment\Upload::getInstance(), 'pre_upload_ui']);
142
+ add_action('add_attachment', [
143
+ \MatthiasWeb\RealMediaLibrary\attachment\Upload::getInstance(),
144
+ 'add_attachment'
145
+ ]);
146
+ add_action(
147
+ 'wp_prepare_attachment_for_js',
148
+ [\MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(), 'wp_prepare_attachment_for_js'],
149
+ 10,
150
+ 3
151
+ );
152
+ add_action('RML/Options/Register', [
153
+ \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance(),
154
+ 'options_register'
155
+ ]);
156
+ add_action(
157
+ 'RML/Folder/Deleted',
158
+ [\MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance(), 'folder_deleted'],
159
+ 10,
160
+ 2
161
+ );
162
+ add_action('RML/Scripts', [
163
+ \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\RealUtils\Core::getInstance()->getAssets(),
164
+ 'admin_enqueue_scripts'
165
+ ]);
166
+ add_filter(
167
+ 'posts_clauses',
168
+ [\MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(), 'posts_clauses'],
169
+ 10,
170
+ 2
171
+ );
172
+ add_filter('media_view_strings', [$this->getAssets(), 'media_view_strings']);
173
+ add_filter('media_row_actions', [$this->getAssets(), 'media_row_actions'], 10, 2);
174
+ add_filter(
175
+ 'add_post_metadata',
176
+ [\MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance(), 'add_post_metadata'],
177
+ 999999,
178
+ 5
179
+ );
180
+ add_filter(
181
+ 'update_post_metadata',
182
+ [\MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance(), 'update_post_metadata'],
183
+ 999999,
184
+ 5
185
+ );
186
+ add_filter(
187
+ 'get_post_metadata',
188
+ [\MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance(), 'get_post_metadata'],
189
+ 999999,
190
+ 4
191
+ );
192
+ add_filter(
193
+ 'attachment_fields_to_edit',
194
+ [\MatthiasWeb\RealMediaLibrary\attachment\CustomField::getInstance(), 'attachment_fields_to_edit'],
195
+ 10,
196
+ 2
197
+ );
198
+ add_filter(
199
+ 'attachment_fields_to_save',
200
+ [\MatthiasWeb\RealMediaLibrary\attachment\CustomField::getInstance(), 'attachment_fields_to_save'],
201
+ 10,
202
+ 2
203
+ );
204
+ add_filter('restrict_manage_posts', [
205
+ \MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(),
206
+ 'restrict_manage_posts'
207
+ ]);
208
+ add_filter('ajax_query_attachments_args', [
209
+ \MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(),
210
+ 'ajax_query_attachments_args'
211
+ ]);
212
+ add_filter('mla_media_modal_query_final_terms', [
213
+ \MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance(),
214
+ 'ajax_query_attachments_args'
215
+ ]);
216
+ add_filter(
217
+ 'shortcode_atts_gallery',
218
+ [\MatthiasWeb\RealMediaLibrary\view\FolderShortcode::getInstance(), 'shortcode_atts_gallery'],
219
+ 1,
220
+ 3
221
+ );
222
+ add_filter('superpwa_sw_never_cache_urls', [$restService, 'superpwa_exclude_from_cache']);
223
+ // Predefined meta boxes
224
+ add_rml_meta_box('general', \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance(), \false, 0);
225
+ add_rml_meta_box('description', new \MatthiasWeb\RealMediaLibrary\metadata\Description(), \false, 0);
226
+ add_rml_meta_box('coverImage', new \MatthiasWeb\RealMediaLibrary\metadata\CoverImage(), \false, 0);
227
+ add_rml_user_settings_box(
228
+ 'allFilesShortcuts',
229
+ new \MatthiasWeb\RealMediaLibrary\usersettings\AllFilesShortcuts(),
230
+ \false,
231
+ 0
232
+ );
233
+ $infiniteScrolling = new \MatthiasWeb\RealMediaLibrary\usersettings\InfiniteScrolling();
234
+ if ($infiniteScrolling->isAvailable()) {
235
+ add_rml_user_settings_box('infiniteScrolling', $infiniteScrolling, \false, 0);
236
+ }
237
+ add_rml_user_settings_box(
238
+ 'defaultFolder',
239
+ new \MatthiasWeb\RealMediaLibrary\usersettings\DefaultFolder(),
240
+ \false,
241
+ 0
242
+ );
243
+ //add_rml_user_settings_box('demo', new \MatthiasWeb\RealMediaLibrary\usersettings\Demo(), false, 0);
244
+ // Gutenberg blocks
245
+ if (\function_exists('register_block_type')) {
246
+ \MatthiasWeb\RealMediaLibrary\view\Gutenberg::getInstance();
247
+ add_action('enqueue_block_editor_assets', [$this->getAssets(), 'enqueue_block_editor_assets']);
248
+ }
249
+ $this->compatibilities(\true);
250
+ $this->overrideInit();
251
+ }
252
+ /**
253
+ * Allow a better compatibility for other plugins.
254
+ *
255
+ * Have a look at the class' constructors for all needed filters and actions.
256
+ *
257
+ * @param boolean $init
258
+ */
259
+ private function compatibilities($init) {
260
+ if ($init) {
261
+ // @see https://wordpress.org/plugins/export-media-library/
262
+ if (\defined('MASSEDGE_WORDPRESS_PLUGIN_EXPORT_MEDIA_LIBRARY_PLUGIN_PATH')) {
263
+ $data = get_plugin_data(
264
+ \constant('MASSEDGE_WORDPRESS_PLUGIN_EXPORT_MEDIA_LIBRARY_PLUGIN_PATH'),
265
+ \true,
266
+ \false
267
+ );
268
+ if (\version_compare($data['Version'], '2.0.0', '>=')) {
269
+ new \MatthiasWeb\RealMediaLibrary\comp\ExportMediaLibrary();
270
+ }
271
+ }
272
+ } else {
273
+ add_action('init', [\MatthiasWeb\RealMediaLibrary\comp\PolyLang::getInstance(), 'init']);
274
+ add_action('init', [\MatthiasWeb\RealMediaLibrary\comp\WPML::getInstance(), 'init'], 9);
275
+ add_action('init', [\MatthiasWeb\RealMediaLibrary\comp\PageBuilders::getInstance(), 'init']);
276
+ }
277
+ }
278
+ /**
279
+ * Use the wp die filter to make the last update count;
280
+ *
281
+ * @param mixed $result
282
+ * @return mixed
283
+ */
284
+ public function update_count($result) {
285
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->wp_die();
286
+ /**
287
+ * This function is called at the end of: AJAX Handler, WP Handler, REST Handler.
288
+ * You can collect for example batch actions and merge it to one SQL query.
289
+ *
290
+ * @hook RML/Die
291
+ * @since 4.0.2
292
+ */
293
+ do_action('RML/Die');
294
+ return $result;
295
+ }
296
+ /**
297
+ * Static method to get a RML table name.
298
+ *
299
+ * @param string $name
300
+ * @return string
301
+ * @see Core::getTableName
302
+ */
303
+ public static function tableName($name = '') {
304
+ return self::getInstance()->getTableName($name);
305
+ }
306
+ /**
307
+ * Get singleton core class.
308
+ *
309
+ * @return Core
310
+ */
311
+ public static function getInstance() {
312
+ return !isset(self::$me) ? (self::$me = new \MatthiasWeb\RealMediaLibrary\Core()) : self::$me;
313
+ }
314
+ }
315
+ // can not be placed in class_alias.php because for Core the class must exist (e. g. Justified Image Grid)
316
+ \class_alias(\MatthiasWeb\RealMediaLibrary\Core::class, RML_NS . '\\general\\Core');
317
+ // Inherited from packages/utils/src/Service
318
+ /**
319
+ * See API docs.
320
+ *
321
+ * @api {get} /real-media-library/v1/plugin Get plugin information
322
+ * @apiHeader {string} X-WP-Nonce
323
+ * @apiName GetPlugin
324
+ * @apiGroup Plugin
325
+ *
326
+ * @apiSuccessExample {json} Success-Response:
327
+ * {
328
+ * Name: "My plugin",
329
+ * PluginURI: "https://example.com/my-plugin",
330
+ * Version: "0.1.0",
331
+ * Description: "This plugin is doing something.",
332
+ * Author: "<a href="https://example.com">John Smith</a>",
333
+ * AuthorURI: "https://example.com",
334
+ * TextDomain: "my-plugin",
335
+ * DomainPath: "/languages",
336
+ * Network: false,
337
+ * Title: "<a href="https://example.com">My plugin</a>",
338
+ * AuthorName: "John Smith"
339
+ * }
340
+ * @apiVersion 0.1.0
341
+ */
inc/Localization.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Localization as UtilsLocalization;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * i18n management for backend and frontend.
13
+ */
14
+ class Localization {
15
+ use UtilsProvider;
16
+ use UtilsLocalization;
17
+ /**
18
+ * Get the directory where the languages folder exists.
19
+ *
20
+ * @param string $type
21
+ * @return string[]
22
+ */
23
+ protected function getPackageInfo($type) {
24
+ if ($type === \MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Localization::$PACKAGE_INFO_BACKEND) {
25
+ return [path_join(RML_PATH, 'languages'), RML_TD];
26
+ } else {
27
+ return [path_join(RML_PATH, \MatthiasWeb\RealMediaLibrary\Assets::$PUBLIC_JSON_I18N), RML_TD];
28
+ }
29
+ }
30
+ }
inc/Util.php ADDED
@@ -0,0 +1,441 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\folder\Creatable;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * Util functionality for Real Media Library.
14
+ */
15
+ class Util {
16
+ use UtilsProvider;
17
+ private static $me = null;
18
+ /**
19
+ * C'tor.
20
+ */
21
+ private function __construct() {
22
+ // Silence is golden.
23
+ }
24
+ /**
25
+ * Query multiple sql statements.
26
+ *
27
+ * @param string... $args SQL statements
28
+ */
29
+ public function query() {
30
+ global $wpdb;
31
+ if (\is_array(\func_get_arg(0))) {
32
+ $sqls = \func_get_arg(0);
33
+ } else {
34
+ $sqls = \func_get_args();
35
+ }
36
+ foreach ($sqls as $param) {
37
+ // phpcs:disable WordPress.DB.PreparedSQL
38
+ $wpdb->query($param);
39
+ // phpcs:enable WordPress.DB.PreparedSQL
40
+ }
41
+ }
42
+ /**
43
+ * See action RML/$action/AnyParentHasMeta.
44
+ *
45
+ * @param IFolder $folder The IFolder object
46
+ * @param string $action Available action
47
+ * @param mixed[] $args The referenced arguments
48
+ */
49
+ public function doActionAnyParentHas($folder, $action, $args = null) {
50
+ global $wpdb;
51
+ if (!is_rml_folder($folder)) {
52
+ return;
53
+ }
54
+ /**
55
+ * Add a condition after a defined action ($action) to check if any parent has a metadata.
56
+ * It also includes the self folder so you can check for own folder metadata.
57
+ * <strong>Note:</strong> All found parents are grouped and passed through an action
58
+ * RML/$action/AnyParentHasMeta/$meta_key so you can execute your command. The allowed
59
+ * $actions are:
60
+ * <ul>
61
+ * <li>"Folder/Insert": Items are moved to the folder (see RML/Item/MoveFinished action for $args)</li>
62
+ * <li>"Folder/RelocatedOrMoved": A folder is relocated or moved to a given new parent (see RML/Item/Relocated action for $args), since 4.4</li>
63
+ * <li>Your action: Please contact Real Media Library developer to request another action</li>
64
+ * </ul>
65
+ *
66
+ * @param {string[]} $conditions The conditions which are joined together with OR
67
+ * @param {IFolder} $folder The IFolder object
68
+ * @param {arguments[]} $args The referenced arguments
69
+ * @example <caption>Add a condition</caption>
70
+ * $conditions[] = $wpdb->prepare("rmlmeta.meta_key = 'myMeta' AND rmlmeta.meta_value = %s", "test");
71
+ * @return {string[]} The conditions
72
+ * @see IFolder::anyParentHasMetadata()
73
+ * @see wp_rml_create_all_parents_sql()
74
+ * @see RML/$action/AnyParentHasMeta/$meta_key
75
+ * @hook RML/$action/AnyParentHasMeta
76
+ * @since 3.3
77
+ */
78
+ $conditions = apply_filters('RML/' . $action . '/AnyParentHasMeta', [], $folder, $args);
79
+ if (\count($conditions) > 0) {
80
+ $sql = wp_rml_create_all_parents_sql($folder, \true, null, [
81
+ 'fields' =>
82
+ 'rmlmeta.meta_id AS id, rmlmeta.realmedialibrary_id AS folderId, rmlmeta.meta_key, rmlmeta.meta_value AS value',
83
+ 'join' =>
84
+ 'JOIN ' . $this->getTableName('meta') . ' rmlmeta ON rmlmeta.realmedialibrary_id = rmldata.id',
85
+ 'afterWhere' => 'AND ((' . \implode(') OR (', $conditions) . '))'
86
+ ]);
87
+ if ($sql !== \false) {
88
+ // phpcs:disable WordPress.DB.PreparedSQL
89
+ $rows = $this->group_by($wpdb->get_results($sql, ARRAY_A), 'meta_key');
90
+ // phpcs:enable WordPress.DB.PreparedSQL
91
+ foreach ($rows as $meta_key => $metas) {
92
+ /**
93
+ * This action is called for the results of the RML/$action/AnyParentHasMeta filter.
94
+ * <strong>Note:</strong> The allowed $actions are: See RML/$action/AnyParentHasMeta
95
+ *
96
+ * @param {array} $metas Result array for this meta key, similar to IFolder::anyParentHasMetadata result
97
+ * @param {IFolder} $folder The IFolder object
98
+ * @param {arguments[]} $args The referenced arguments which are also passed to RML/$action/AnyParentHasMeta
99
+ * @param {array} $all_metas All found metas grouped by meta_key so you can check for multiple meta_keys
100
+ * @see RML/$action/AnyParentHasMeta
101
+ * @hook RML/$action/AnyParentHasMeta/$meta_key
102
+ * @since 3.3
103
+ */
104
+ do_action('RML/' . $action . '/AnyParentHasMeta/' . $meta_key, $metas, $folder, $args, $rows);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * Build a tree from an array.
111
+ *
112
+ * @param mixed[] $elements
113
+ * @param int $parentId
114
+ * @param string $keyParent
115
+ * @param string $key
116
+ * @param string $keyChildren
117
+ * @return mixed[]
118
+ * @see https://stackoverflow.com/questions/8840319/build-a-tree-from-a-flat-array-in-php
119
+ */
120
+ public function buildTree(
121
+ &$elements,
122
+ $parentId = -1,
123
+ $keyParent = 'parent',
124
+ $key = 'id',
125
+ $keyChildren = 'children'
126
+ ) {
127
+ $branch = [];
128
+ foreach ($elements as &$element) {
129
+ if ($element[$keyParent] === $parentId) {
130
+ $children = $this->buildTree($elements, $element[$key], $keyParent, $key, $keyChildren);
131
+ if ($children) {
132
+ $element[$keyChildren] = $children;
133
+ }
134
+ $branch[$element[$key]] = $element;
135
+ unset($element);
136
+ }
137
+ }
138
+ return $branch;
139
+ }
140
+ /**
141
+ * Clears an array of a tree of the parent and id values.
142
+ *
143
+ * @param array $tree The result of this::buildTree
144
+ * @param string[] $clear
145
+ * @param string $keyChildren
146
+ * @param mixed
147
+ */
148
+ public function clearTree(&$tree, $clear = [], $keyChildren = 'children') {
149
+ foreach ($tree as &$node) {
150
+ foreach ($clear as $c) {
151
+ if (isset($node[$c])) {
152
+ unset($node[$c]);
153
+ }
154
+ }
155
+ if (isset($node[$keyChildren])) {
156
+ $this->clearTree($node[$keyChildren], $clear, $keyChildren);
157
+ $node[$keyChildren] = \array_values($node[$keyChildren]);
158
+ }
159
+ }
160
+ return \array_values($tree);
161
+ }
162
+ /**
163
+ * Group an array by key.
164
+ *
165
+ * @param array $array
166
+ * @param string $key
167
+ * @return array
168
+ */
169
+ public function group_by($array, $key) {
170
+ $return = [];
171
+ foreach ($array as $val) {
172
+ $return[$val[$key]][] = $val;
173
+ }
174
+ return $return;
175
+ }
176
+ /**
177
+ * Fixing the missing isShortcut parameter in wp_realmedialibrary_posts
178
+ * when SC is given in the guid.
179
+ */
180
+ public function fixIsShortcutInPosts() {
181
+ $this->debug('Fixing the isShortcut parameter in posts table...', __METHOD__);
182
+ global $wpdb;
183
+ // phpcs:disable WordPress.DB.PreparedSQL
184
+ $table_name_posts = $this->getTableName('posts');
185
+ $result = $wpdb->get_results(
186
+ "SELECT rmlp.*, p.guid FROM {$table_name_posts} rmlp\n INNER JOIN {$wpdb->posts} p ON rmlp.attachment = p.ID\n WHERE rmlp.isShortcut = 0 AND p.guid LIKE '%?sc=%'",
187
+ ARRAY_A
188
+ );
189
+ // phpcs:enable WordPress.DB.PreparedSQL
190
+ $this->debug('Found ' . \count($result) . ' rows', __METHOD__);
191
+ foreach ($result as $row) {
192
+ \preg_match('/\\?sc=([0-9]+)$/', $row['guid'], $matches);
193
+ if (isset($matches) && \is_array($matches) && isset($matches[1])) {
194
+ $sc = (int) $matches[1];
195
+ // phpcs:disable WordPress.DB.PreparedSQL
196
+ $sql = $wpdb->query(
197
+ $wpdb->prepare(
198
+ "UPDATE {$table_name_posts} SET isShortcut = %d WHERE attachment = %d AND fid = %d AND isShortcut = %d",
199
+ $sc,
200
+ $row['attachment'],
201
+ $row['fid'],
202
+ $row['isShortcut']
203
+ )
204
+ );
205
+ // phpcs:enable WordPress.DB.PreparedSQL
206
+ }
207
+ }
208
+ }
209
+ /**
210
+ * Allows to reset all names with slugs and absolute path.
211
+ *
212
+ * @param callable $remap
213
+ */
214
+ public function resetAllSlugsAndAbsolutePathes($remap = null) {
215
+ global $wpdb;
216
+ $this->debug('Start resetting names, slugs and absolute path...', __METHOD__);
217
+ // Read rows
218
+ $table_name = $this->getTableName();
219
+ $sql = "SELECT t1.id, t2.name FROM ( SELECT t0.r_init AS id, IF(t0.reset_r = 1, (@r := t0.r_init), (@r := (select parent from {$table_name} where id = @r))) AS r, IF(t0.reset_r = 1, (@l := 1), (@l := @l + 1)) AS lvl FROM (SELECT m0.id as counter, m1.id AS r_init, ((SELECT min(id) FROM {$table_name}) = m0.id) AS reset_r FROM {$table_name} m0, {$table_name} m1 ORDER BY r_init, counter) t0 ORDER BY t0.r_init, t0.counter ) t1 INNER JOIN {$table_name} t2 ON t2.id = t1.r WHERE r <> -1 ORDER BY id, lvl DESC";
220
+ // phpcs:disable WordPress.DB.PreparedSQL
221
+ $rows = $wpdb->get_results($sql, ARRAY_A);
222
+ // folder|folderparentpart|name
223
+ // phpcs:enable WordPress.DB.PreparedSQL
224
+ if (\count($rows) > 0) {
225
+ // Create migration table
226
+ $table_name_reset = $this->getTableName('resetnames');
227
+ $this->getCore()
228
+ ->getActivator()
229
+ ->install(\false, [$this, 'resetAllSlugsAndAbsolutePathesTable']);
230
+ // Get rows and create
231
+ $rows = $this->group_by($rows, 'id');
232
+ $sqlInserts = [];
233
+ foreach ($rows as $fid => $parts) {
234
+ $names = [];
235
+ foreach ($parts as $part) {
236
+ $names[] = $part['name'];
237
+ }
238
+ if ($remap !== null) {
239
+ $names = \array_map($remap, $names);
240
+ }
241
+ $slugs = \array_map('_wp_rml_sanitize', $names);
242
+ $partCount = \count($names);
243
+ $lastIdx = $partCount - 1;
244
+ // Update columns
245
+ $name = $names[$lastIdx];
246
+ $slug = $slugs[$lastIdx];
247
+ $absolutePath = \implode('/', $slugs);
248
+ // Add to update statement
249
+ if (!empty($name)) {
250
+ $sqlInserts[] = $wpdb->prepare('%d,%s,%s,%s', $fid, $name, $slug, $absolutePath);
251
+ }
252
+ }
253
+ // Create SQL INSERT statements
254
+ // phpcs:disable WordPress.DB.PreparedSQL
255
+ $chunks = \array_chunk($sqlInserts, 150);
256
+ foreach ($chunks as $sqlInsert) {
257
+ $sql = "INSERT INTO {$table_name_reset} VALUES (" . \implode('),(', $sqlInsert) . ')';
258
+ $wpdb->query($sql);
259
+ }
260
+ // Create UPDATE statement
261
+ $wpdb->query(
262
+ "UPDATE {$table_name} AS rml\n LEFT JOIN {$table_name_reset} AS rmlnew ON rml.id = rmlnew.id\n SET rml.name = rmlnew.name, rml.slug = rmlnew.slug, rml.absolute = rmlnew.absolute"
263
+ );
264
+ // phpcs:enable WordPress.DB.PreparedSQL
265
+ }
266
+ // Resolve duplicate slugs
267
+ $this->debug('Reset finished', __METHOD__);
268
+ // phpcs:disable WordPress.DB.PreparedSQL
269
+ $dups = $wpdb->get_results(
270
+ "SELECT rml.id, rml.slug\n FROM {$table_name} rml\n INNER JOIN (\n SELECT rmlSlug.slug\n FROM {$table_name} rmlSlug\n GROUP BY rmlSlug.slug\n HAVING COUNT( id ) > 1\n ) j ON rml.slug = j.slug",
271
+ ARRAY_A
272
+ );
273
+ // phpcs:enable WordPress.DB.PreparedSQL
274
+ if (\count($dups) > 0) {
275
+ $this->debug('Resolving duplicate slugs...', __METHOD__);
276
+ foreach ($this->group_by($dups, 'slug') as $dupIds) {
277
+ for ($i = 1; $i < \count($dupIds); $i++) {
278
+ $folder = wp_rml_get_object_by_id($dupIds[$i]['id']);
279
+ if ($folder !== null) {
280
+ $folder->updateThisAndChildrensAbsolutePath();
281
+ }
282
+ }
283
+ }
284
+ }
285
+ }
286
+ // Documented above
287
+ public function resetAllSlugsAndAbsolutePathesTable() {
288
+ global $wpdb;
289
+ $charset_collate = $wpdb->get_charset_collate();
290
+ // Always recreate table
291
+ $table_name_reset = $this->getTableName('resetnames');
292
+ // phpcs:disable WordPress.DB.PreparedSQL
293
+ $wpdb->query("DROP TABLE IF EXISTS {$table_name_reset}");
294
+ // phpcs:enable WordPress.DB.PreparedSQL
295
+ $this->debug('Create reset table...', __METHOD__);
296
+ $table_name = $this->getTableName('resetnames');
297
+ $sql = "CREATE TABLE {$table_name} (\n\t\t\tid mediumint(9) NOT NULL,\n\t\t\tname tinytext NOT NULL,\n\t\t\tslug text DEFAULT '' NOT NULL,\n\t\t\tabsolute text DEFAULT '' NOT NULL,\n\t\t\tPRIMARY KEY (id)\n\t\t) {$charset_collate};";
298
+ dbDelta($sql);
299
+ }
300
+ // Documented in wp_rml_create_all_parents_sql()
301
+ public function createSQLForAllParents($folder, $includeSelf = \false, $until = null, $options = null) {
302
+ global $wpdb;
303
+ // Get folder id
304
+ $folderId = $folder instanceof \MatthiasWeb\RealMediaLibrary\folder\Creatable ? $folder->getId() : $folder;
305
+ if (!\is_numeric($folderId)) {
306
+ return \false;
307
+ }
308
+ // Parse options
309
+ $options = \array_merge(
310
+ [
311
+ 'fields' => 'rmldata.*, rmltmp.lvl AS lvlup',
312
+ 'join' => '',
313
+ 'where' => 'rmltmp.lvl > ' . ($includeSelf === \true ? '-1' : '0'),
314
+ 'afterWhere' => '',
315
+ 'orderby' => 'rmltmp.lvl ASC',
316
+ 'limit' => ''
317
+ ],
318
+ $options === null ? [] : $options
319
+ );
320
+ $table_name = \MatthiasWeb\RealMediaLibrary\Core::getInstance()->getTableName();
321
+ // phpcs:disable WordPress.DB.PreparedSQL
322
+ return $wpdb->prepare(
323
+ 'SELECT ' .
324
+ $options['fields'] .
325
+ "\n FROM ( SELECT @r AS _id, (SELECT @r := parent FROM {$table_name} WHERE id = _id) AS parent, @l := @l + 1 AS lvl\n FROM (SELECT @r := %d, @l := -1) vars, {$table_name} m\n WHERE @r <> %d) rmltmp\n JOIN {$table_name} rmldata ON rmltmp._id = rmldata.id " .
326
+ $options['join'] .
327
+ '
328
+ WHERE ' .
329
+ $options['where'] .
330
+ ' ' .
331
+ $options['afterWhere'] .
332
+ '
333
+ ORDER BY ' .
334
+ $options['orderby'] .
335
+ ' ' .
336
+ $options['limit'],
337
+ $folderId,
338
+ $until === null ? _wp_rml_root() : $until
339
+ );
340
+ // phpcs:enable WordPress.DB.PreparedSQL
341
+ }
342
+ // Documented in wp_rml_create_all_children_sql()
343
+ public function createSQLForAllChildren($folder, $includeSelf = \false, $options = null, $type = null) {
344
+ global $wpdb;
345
+ // Get folder id
346
+ $folderId = $folder instanceof \MatthiasWeb\RealMediaLibrary\folder\Creatable ? $folder->getId() : $folder;
347
+ if (!\is_numeric($folderId)) {
348
+ return \false;
349
+ }
350
+ // Get type
351
+ $isTempCheck = $type !== null;
352
+ if ($type === null) {
353
+ $type = get_option(
354
+ RML_OPT_PREFIX . \MatthiasWeb\RealMediaLibrary\Activator::DB_CHILD_QUERY_SUPPORTED,
355
+ null
356
+ );
357
+ $type = $type === '2' ? 'function' : 'legacy';
358
+ }
359
+ // Parse options
360
+ $options = \array_merge(
361
+ [
362
+ 'fields' => 'rmldata.*',
363
+ 'join' => '',
364
+ 'where' => '1=1 ' . ($includeSelf === \true ? '' : $wpdb->prepare(' AND rmldata.id != %d', $folderId)),
365
+ 'afterWhere' => '',
366
+ 'orderby' => 'rmldata.parent, rmldata.ord',
367
+ 'limit' => ''
368
+ ],
369
+ $options === null ? [] : $options
370
+ );
371
+ $table_name = \MatthiasWeb\RealMediaLibrary\Core::getInstance()->getTableName();
372
+ if ($type === 'function') {
373
+ // Since 4.4.1 the childs are read via mysql UDF
374
+ $function_name = $wpdb->prefix . \MatthiasWeb\RealMediaLibrary\Activator::CHILD_UDF_NAME;
375
+ return 'SELECT ' .
376
+ $options['fields'] .
377
+ '
378
+ FROM ' .
379
+ $table_name .
380
+ ' AS rmldata ' .
381
+ $options['join'] .
382
+ '
383
+ WHERE FIND_IN_SET(id, ' .
384
+ $function_name .
385
+ '(' .
386
+ $wpdb->prepare('%d', $folderId) .
387
+ ', ' .
388
+ ($isTempCheck ? 'true' : 'false') .
389
+ '))
390
+ AND ' .
391
+ $options['where'] .
392
+ ' ' .
393
+ $options['afterWhere'] .
394
+ '
395
+ ORDER BY ' .
396
+ $options['orderby'] .
397
+ ' ' .
398
+ $options['limit'];
399
+ } else {
400
+ // Set concat size for this session
401
+ $wpdb->query('SET SESSION group_concat_max_len = 100000');
402
+ return 'SELECT ' .
403
+ $options['fields'] .
404
+ ' FROM (SELECT _rmldata.*
405
+ FROM (SELECT * FROM ' .
406
+ $table_name .
407
+ ' ORDER BY parent, id) _rmldata,
408
+ (SELECT @pv := ' .
409
+ $wpdb->prepare('%d', $folderId) .
410
+ ') initialisation
411
+ WHERE (FIND_IN_SET(_rmldata.parent, @pv) > 0 AND @pv := CONCAT(@pv, \',\', _rmldata.id)) OR @pv = _rmldata.id
412
+ ) rmldata ' .
413
+ $options['join'] .
414
+ ' WHERE ' .
415
+ $options['where'] .
416
+ ' ' .
417
+ $options['afterWhere'] .
418
+ ' ORDER BY ' .
419
+ $options['orderby'] .
420
+ ' ' .
421
+ $options['limit'];
422
+ }
423
+ }
424
+ /**
425
+ * Escape a SQL name with quotes.
426
+ *
427
+ * @param string $name
428
+ * @return string
429
+ */
430
+ public function esc_sql_name($name) {
431
+ return \str_replace('`', '``', $name);
432
+ }
433
+ /**
434
+ * Get instance.
435
+ *
436
+ * @return Util
437
+ */
438
+ public static function getInstance() {
439
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\Util()) : self::$me;
440
+ }
441
+ }
inc/api/IFolder.php ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\api;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ /**
10
+ * This interface provides elementary getter and setter methods for folder objects. All folder
11
+ * types (Folder, Collection, Gallery, ...) have implemented this interface.
12
+ * Also the root ("Unorganized") is a folder and implements this interface. Usually,
13
+ * the root acts as "-1" but you should use the _wp_rml_root function to get the
14
+ * root id. If this interface does not provide an expected method, yet, have a look at the
15
+ * other API files. For example to create a folder use wp_rml_create.
16
+ *
17
+ * <strong>Check if a variable is surely a IFolder interface object:</strong>
18
+ * ```php
19
+ * $folder = wp_rml_get_object_by_id(5);
20
+ * if (is_rml_folder($folder)) {
21
+ * // It is an interface implementation of IFolder
22
+ * }
23
+ * ```
24
+ *
25
+ * <h3>Register own folder type:</h3>
26
+ * You can create your own implementation of a folder type (Gallery, Collection, Root, ...)
27
+ * just have a look at the wp-content/plugins/real-media-library/inc/folder files.
28
+ *
29
+ * Also have a look at the wp_rml_register_creatable function to register your class
30
+ * (RML_TYPE_FOLDER is an unique defined integer for your folder type):
31
+ * ```php
32
+ * wp_rml_register_creatable(Folder::class, RML_TYPE_FOLDER);
33
+ * ```
34
+ *
35
+ * @see wp_rml_root_childs
36
+ * @see wp_rml_get_object_by_id
37
+ * @see wp_rml_get_by_id
38
+ * @see wp_rml_get_by_absolute_path
39
+ * @see wp_rml_objects
40
+ * @see is_rml_folder
41
+ * @see IFolderActions
42
+ */
43
+ interface IFolder extends
44
+ \MatthiasWeb\RealMediaLibrary\api\IFolderActions,
45
+ \MatthiasWeb\RealMediaLibrary\api\IFolderContent {
46
+ /**
47
+ * Get all parents which meets a given column value or column value is not empty.
48
+ *
49
+ * @param string $column The column name for the wp_realmedialibrary SQL table. "slug", "name", "absolutePath", ... This string is not escaped when you pass it through this function
50
+ * @param mixed $value The value the column should have
51
+ * @param string $valueFormat The value format for $value ($wpdb->prepare) This string is not escaped when you pass it through this function
52
+ * @param boolean $includeSelf Set true to add self to list
53
+ * @param int $until The highest allowed folder id. If null _wp_rml_root() is used
54
+ * @return array folderId => columnValue, first id is the first found parent
55
+ * @since 3.3
56
+ */
57
+ public function anyParentHas($column, $value = null, $valueFormat = '%s', $includeSelf = \false, $until = null);
58
+ /**
59
+ * Get all parents which meets a given meta key value or meta key value is not empty.
60
+ *
61
+ * @param string $meta_key The meta key name for the wp_realmedialibrary_meta SQL table. This string is not escaped when you pass it through this function
62
+ * @param mixed $meta_value The value the meta key should have
63
+ * @param string $valueFormat The value format for $value ($wpdb->prepare) This string is not escaped when you pass it through this function
64
+ * @param boolean $includeSelf Set true to add self to list
65
+ * @param int $until The highest allowed folder id. If null _wp_rml_root() is used
66
+ * @return array Array with keys: id (meta_id), folderId, value (meta_value), first id is the first found parent
67
+ * @since 3.3
68
+ */
69
+ public function anyParentHasMetadata(
70
+ $meta_key,
71
+ $meta_value = null,
72
+ $valueFormat = '%s',
73
+ $includeSelf = \false,
74
+ $until = null
75
+ );
76
+ /**
77
+ * Get all children which meets a given column value or column value is not empty.
78
+ *
79
+ * @param string $column The column name for the wp_realmedialibrary SQL table. "slug", "name", "absolutePath", ... This string is not escaped when you pass it through this function
80
+ * @param mixed $value The value the column should have
81
+ * @param string $valueFormat The value format for $value ($wpdb->prepare) This string is not escaped when you pass it through this function
82
+ * @param boolean $includeSelf Set true to add self to list
83
+ * @return array folderId => columnValue, first id is the first found child
84
+ * @since 3.3
85
+ */
86
+ public function anyChildrenHas($column, $value = null, $valueFormat = '%s', $includeSelf = \false);
87
+ /**
88
+ * Get all chilren which meets a given meta key value or meta key value is not empty.
89
+ *
90
+ * @param string $meta_key The meta key name for the wp_realmedialibrary_meta SQL table. This string is not escaped when you pass it through this function
91
+ * @param mixed $meta_value The value the meta key should have
92
+ * @param string $valueFormat The value format for $value ($wpdb->prepare) This string is not escaped when you pass it through this function
93
+ * @param boolean $includeSelf Set true to add self to list
94
+ * @return array Array with keys: id (meta_id), folderId, value (meta_value), first id is the first found child
95
+ * @since 3.3
96
+ */
97
+ public function anyChildrenHasMetadata($meta_key, $meta_value = null, $valueFormat = '%s', $includeSelf = \false);
98
+ /**
99
+ * Checks if this folder has a children with a given name.
100
+ *
101
+ * @param string $name Name of folder
102
+ * @param boolean $returnObject If set to true and a children with this name is found, then return the object for this folder
103
+ * @return boolean
104
+ * @since 3.3 Now it checks for a given folder name instead the slug
105
+ */
106
+ public function hasChildren($name, $returnObject = \false);
107
+ /**
108
+ * Return the type for the given folder. For example: 0 = Folder, 1 = Collection, 2 = Gallery
109
+ *
110
+ * @return int
111
+ */
112
+ public function getType();
113
+ /**
114
+ * Get all allowed children folder types.
115
+ *
116
+ * @return boolean|int[] Array with allowed types or TRUE for all types allowed
117
+ */
118
+ public function getAllowedChildrenTypes();
119
+ /**
120
+ * Get the folder id.
121
+ *
122
+ * @return int
123
+ */
124
+ public function getId();
125
+ /**
126
+ * Get the parent folder id.
127
+ *
128
+ * @return int
129
+ */
130
+ public function getParent();
131
+ /**
132
+ * Get all parents of this folder.
133
+ *
134
+ * @param int $until The highest allowed folder id. If null _wp_rml_root() is used
135
+ * @param int $colIdx The index returning for the wp_rml_create_all_parents_sql() query
136
+ * @return int[] Folder ids, first id is the first parent
137
+ * @since 3.3
138
+ */
139
+ public function getAllParents($until = null, $colIdx = 0);
140
+ /**
141
+ * Get the folder name.
142
+ *
143
+ * @param boolean $htmlentities If true the name is returned htmlentitied for output
144
+ * @return string
145
+ */
146
+ public function getName($htmlentities = \false);
147
+ /**
148
+ * Returns a sanitized title for the folder. If the slug is empty
149
+ * or forced to, it will be updated in the database, too.
150
+ *
151
+ * @param boolean $force Forces to regenerate the slug
152
+ * @param boolean $fromSetName For internal usage only
153
+ * @return string
154
+ */
155
+ public function getSlug($force = \false, $fromSetName = \false);
156
+ /**
157
+ * Creates a absolute path without slugging' the names.
158
+ *
159
+ * ```php
160
+ * // Get valid physical folder name
161
+ * $folder->getPath("/", "_wp_rml_sanitize_filename");
162
+ * ```
163
+ *
164
+ * @param string $implode Delimiter for the folder names
165
+ * @param callable $map Map the names with this function. Pass null to skip this map function
166
+ * @param callable $filter Filter folders
167
+ * @return string htmlentitied path
168
+ */
169
+ public function getPath($implode = '/', $map = 'htmlentities', $filter = null);
170
+ /**
171
+ * Get the creator/owner of the folder.
172
+ *
173
+ * @return int ID of the user
174
+ * @since 3.3
175
+ */
176
+ public function getOwner();
177
+ /**
178
+ * Creates a absolute path. If the absolute path is empty
179
+ * or forced to, it will be updated in the database, too.
180
+ *
181
+ * @param boolean $force Forces to regenerate the absolute path
182
+ * @param boolean $fromSetName For internal usage only
183
+ * @return string
184
+ */
185
+ public function getAbsolutePath($force = \false, $fromSetName = \false);
186
+ /**
187
+ * Gets the count of the files in this folder.
188
+ *
189
+ * @param boolean $forceReload If true the count cache gets reloaded
190
+ * @return int
191
+ * @since 3.3.1
192
+ */
193
+ public function getCnt($forceReload = \false);
194
+ /**
195
+ * Get children of this folder.
196
+ *
197
+ * @return IFolder
198
+ */
199
+ public function getChildren();
200
+ /**
201
+ * Get the order number.
202
+ *
203
+ * @return int
204
+ * @since 3.3.1
205
+ */
206
+ public function getOrder();
207
+ /**
208
+ * Get the maximal order number of the children.
209
+ *
210
+ * @return integer Max order number
211
+ * @since 3.3.1
212
+ */
213
+ public function getMaxOrder();
214
+ /**
215
+ * Get the restrictions of this folder.
216
+ *
217
+ * @return string[]
218
+ */
219
+ public function getRestrictions();
220
+ /**
221
+ * Get the count of the restrictions.
222
+ *
223
+ * @return int
224
+ */
225
+ public function getRestrictionsCount();
226
+ /**
227
+ * Gets a plain array with folder properties.
228
+ *
229
+ * @param boolean $deep Return the children as plain object array
230
+ * @return array or null when not visible
231
+ */
232
+ public function getPlain($deep = \false);
233
+ /**
234
+ * Get the full row of the SQL query.
235
+ *
236
+ * @param string $field The field name
237
+ * @return mixed Any object or false
238
+ * @since 3.3
239
+ */
240
+ public function getRowData($field = null);
241
+ /**
242
+ * Get the type name for this folder. For example: Folder, Collection, Gallery, Unorganized.
243
+ *
244
+ * @param string $default The default (if null "Folder" is used as default)
245
+ * @return string
246
+ * @since 3.3.1
247
+ * @see Filter RML/Folder/Type/Name
248
+ */
249
+ public function getTypeName($default = null);
250
+ /**
251
+ * Get the type description for this folder.
252
+ *
253
+ * @param string $default The default (if null folder description is used as default)
254
+ * @return string
255
+ * @since 3.3.1
256
+ * @see Filter RML/Folder/Type/Description
257
+ */
258
+ public function getTypeDescription($default = null);
259
+ /**
260
+ * Check if the folder object is a given type.
261
+ *
262
+ * @param int $folder_type The folder type
263
+ * @return boolean
264
+ */
265
+ public function is($folder_type);
266
+ /**
267
+ * Check if the folder object is visible to the user.
268
+ *
269
+ * @return boolean
270
+ */
271
+ public function isVisible();
272
+ /**
273
+ * Checks if this folder has a special restriction.
274
+ *
275
+ * @param string $restriction The restriction to check
276
+ * @return boolean
277
+ * @see IFolder::setRestrictions()
278
+ */
279
+ public function isRestrictFor($restriction);
280
+ /**
281
+ * Checks if a given folder type is allowed in this folder.
282
+ *
283
+ * @param int $type The type
284
+ * @return boolean
285
+ * @see IFolder::getAllowedChildrenTypes()
286
+ * @since 4.12.1 This function returns always `true` in Lite version
287
+ */
288
+ public function isValidChildrenType($type);
289
+ }
inc/api/IFolderActions.php ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\api;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * This interface provides elementary action methods for folder objects. All folder
12
+ * types (Folder, Collection, Gallery, ...) have implemented this interface.
13
+ * Also the root ("Unorganized") is a folder and implements this interface.
14
+ *
15
+ * @since 3.3.1
16
+ */
17
+ interface IFolderActions {
18
+ /**
19
+ * Fetch all attachment ids currently in this folder. It uses the
20
+ * default WP_Query to fetch the ids. You can also use the WP_Query like:
21
+ * ```php
22
+ * $query = new \WP_Query([
23
+ * 'post_status' => 'inherit',
24
+ * 'post_type' => 'attachment',
25
+ * 'rml_folder' => 4,
26
+ * 'rml_include_children' => false // (optional) Include files of subfolder, you have to use wp_rml_all_children_sql_supported(false, 'function') for checking support
27
+ * ]);
28
+ * ```
29
+ *
30
+ * @param string $order The order "ASC" or "DESC"
31
+ * @param string $orderby Use "rml" to get ids ordered by custom order
32
+ * @return int[] Post ids
33
+ */
34
+ public function read($order = null, $orderby = null);
35
+ /**
36
+ * Relocate a folder to a given place in the folder structure.
37
+ *
38
+ * @param integer $parentId The parent id
39
+ * @param integer $nextFolderId The next folder id it should be prepend or false for the end
40
+ * @throws Exception
41
+ * @return boolean|string[] true or array with errors
42
+ * @since 4.12.1 This function ignores the `$parentId` parameter in Lite version as creating subfolders is no longer supported
43
+ */
44
+ public function relocate($parentId, $nextFolderId = \false);
45
+ /**
46
+ * (Pro only) Start to order the given folder subfolders by a given order type.
47
+ *
48
+ * @param string $orderby The order type key
49
+ * @param boolean $writeMetadata
50
+ * @return boolean
51
+ * @throws OnlyInProVersionException
52
+ * @since 4.4
53
+ */
54
+ public function orderSubfolders($orderby, $writeMetadata = \true);
55
+ /**
56
+ * (Pro only) Reset the subfolders order'.
57
+ *
58
+ * @return boolean
59
+ * @throws OnlyInProVersionException
60
+ * @since 4.4
61
+ */
62
+ public function resetSubfolderOrder();
63
+ /**
64
+ * (Pro only) Reindex the children folders so the "ord" number is set right.
65
+ *
66
+ * @since 4.12.1 This function is only available in PRO-Version.
67
+ * @param boolean $resetData If true, the structure is reset
68
+ * @return boolean
69
+ * @since 4.12.1 This function is only available in PRO-Version
70
+ */
71
+ public function reindexChildrens($resetData = \false);
72
+ /**
73
+ * Insert an amount of post ID's (attachments) to this folder.
74
+ *
75
+ * @param int[] $ids Array of post ids
76
+ * @param boolean $supress_validation Suppress the permission validation
77
+ * @param boolean $isShortcut Determines, if the post's should be "copied" to the folder (no physical copy)
78
+ * @throws \Exception
79
+ * @return true
80
+ * @see wp_rml_move()
81
+ * @see wp_rml_create_shortcuts()
82
+ */
83
+ public function insert($ids, $supress_validation = \false, $isShortcut = \false);
84
+ /**
85
+ * Iterate all children of this folder recursively and
86
+ * update the absolute path. Use this function with caution because it can be
87
+ * time intensive.
88
+ */
89
+ public function updateThisAndChildrensAbsolutePath();
90
+ /**
91
+ * For internal usage only!
92
+ *
93
+ * @param object $children
94
+ * @internal
95
+ */
96
+ public function addChildren($children);
97
+ /**
98
+ * Sets the folders visibility to the user.
99
+ *
100
+ * @param boolean $visible
101
+ */
102
+ public function setVisible($visible);
103
+ /**
104
+ * Set restrictions for this folder. Allowed restrictions for folders:
105
+ *
106
+ * <ul>
107
+ * <li><strong>par</strong> Restrict to change the parent id</li>
108
+ * <li><strong>rea</strong> Restrict to rearrange the hierarchical levels of all subfolders (it is downwards all subfolders!) and cannot be inherited</li>
109
+ * <li><strong>cre</strong> Restrict to create new subfolders</li>
110
+ * <li><strong>ins</strong> Restrict to insert/upload new attachments, automatically moved to root if upload</li>
111
+ * <li><strong>ren</strong> Restrict to rename the folder</li>
112
+ * <li><strong>del</strong> Restrict to delete the folder</li>
113
+ * <li><strong>mov</strong> Restrict to move files outside the folder</li>
114
+ * </ul>
115
+ *
116
+ * You can append a ">" after each permission so it is inherited in each created subfolder: "cre>", "ins>", ...
117
+ *
118
+ * @param string[] $restrictions Array with restrictions
119
+ * @return boolean
120
+ */
121
+ public function setRestrictions($restrictions = []);
122
+ /**
123
+ * Changes the parent folder of this folder.
124
+ *
125
+ * @param integer $id The new parent (use -1 for root)
126
+ * @param int $ord The order number
127
+ * @param boolean $force If true no permission checks are executed
128
+ * @throws \Exception
129
+ * @since 4.12.1 This function ignores the `$id` parameter in Lite version as creating subfolders is no longer supported
130
+ * @return boolean
131
+ */
132
+ public function setParent($id, $ord = -1, $force = \false);
133
+ /**
134
+ * Renames a folder and then checks, if there is no duplicate folder in the
135
+ * parent folder.
136
+ *
137
+ * @param string $name String New name of the folder
138
+ * @param boolean $supress_validation Suppress the permission validation
139
+ * @throws \Exception
140
+ * @return boolean
141
+ */
142
+ public function setName($name, $supress_validation = \false);
143
+ }
inc/api/IFolderContent.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\api;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * This interface provides elementary action methods for folder content. All folder
12
+ * types (Folder, Collection, Gallery, ...) have implemented this interface.
13
+ * Also the root ("Unorganized") is a folder and implements this interface.
14
+ *
15
+ * @since 3.3.1
16
+ */
17
+ interface IFolderContent {
18
+ /**
19
+ * (Pro only) See API function for more information.
20
+ *
21
+ * @param int $attachmentId
22
+ * @param int $nextId
23
+ * @param int|boolean $lastIdInView
24
+ * @throws \Exception
25
+ * @return true
26
+ * @see wp_attachment_order_update()
27
+ * @throws OnlyInProVersionException
28
+ */
29
+ public function contentOrder($attachmentId, $nextId, $lastIdInView = \false);
30
+ /**
31
+ * (Pro only) Start to order the given folder content by a given order type.
32
+ *
33
+ * @param string $orderby The order type key
34
+ * @param boolean $writeMetadata
35
+ * @return boolean
36
+ * @throws OnlyInProVersionException
37
+ */
38
+ public function contentOrderBy($orderby, $writeMetadata = \true);
39
+ /**
40
+ * (Pro only) Index the order table.
41
+ *
42
+ * @param boolean $delete Delete the old order
43
+ * @return boolean
44
+ * @throws OnlyInProVersionException
45
+ */
46
+ public function contentIndex($delete = \true);
47
+ /**
48
+ * (Pro only) This function retrieves the order of the order
49
+ * table and removes empty spaces, for example:
50
+ * <pre>0 1 5 7 8 9 10 =>
51
+ * 0 1 2 3 4 5 6</pre>
52
+ *
53
+ * @return boolean
54
+ * @throws OnlyInProVersionException
55
+ */
56
+ public function contentReindex();
57
+ /**
58
+ * (Pro only) Enable the order functionality for this folder.
59
+ *
60
+ * @return boolean
61
+ * @see IFolderContent::getContentCustomOrder()
62
+ * @throws OnlyInProVersionException
63
+ */
64
+ public function contentEnableOrder();
65
+ /**
66
+ * (Pro only) Deletes the complete order for this folder.
67
+ *
68
+ * @return boolean
69
+ * @see IFolderContent::getContentCustomOrder()
70
+ * @throws OnlyInProVersionException
71
+ */
72
+ public function contentDeleteOrder();
73
+ /**
74
+ * (Pro only) Restore the current order number to the old custom order number.
75
+ *
76
+ * @return boolean
77
+ * @throws OnlyInProVersionException
78
+ */
79
+ public function contentRestoreOldCustomNr();
80
+ /**
81
+ * Checks if the folder is allowed to use custom content order.
82
+ *
83
+ * @return boolean
84
+ */
85
+ public function isContentCustomOrderAllowed();
86
+ /**
87
+ * The content custom order defines the state of the content order functionality:
88
+ *
89
+ * <pre>0 = No content order defined
90
+ * 1 = Content order is enabled
91
+ * 2 = Custom content order is not allowed</pre>
92
+ *
93
+ * @return int The content custom order value
94
+ * @see IFolderContent::isContentCustomOrderAllowed()
95
+ * @see IFolderContent::contentEnableOrder()
96
+ */
97
+ public function getContentCustomOrder();
98
+ /**
99
+ * Override this functionality to force the content custom order
100
+ * in the posts_clauses.
101
+ *
102
+ * @return boolean
103
+ * @since 4.0.2
104
+ */
105
+ public function forceContentCustomOrder();
106
+ /**
107
+ * Override the default posts_clauses join and orderby instead of the RML standard.
108
+ * This can be useful if you want to take the order from another relationship.
109
+ * You have to return true if you have overwritten it.
110
+ *
111
+ * @param array $pieces The posts_clauses $pieces parameter
112
+ * @return boolean
113
+ * @since 4.0.2
114
+ */
115
+ public function postsClauses($pieces);
116
+ /**
117
+ * (Pro only) Get the next attachment row for a specific attachment. It returns false if
118
+ * the attachment is at the end or the folder has no custom content order.
119
+ *
120
+ * @param int $attachmentId The attachment id
121
+ * @return array or null
122
+ * @since 4.0.8 Now the method returns an array instead of int
123
+ * @throws OnlyInProVersionException
124
+ */
125
+ public function getAttachmentNextTo($attachmentId);
126
+ /**
127
+ * (Pro only) Gets the biggest order number;
128
+ *
129
+ * @param string $function The SQL aggregation function (MIN or MAX)
130
+ * @return int
131
+ * @throws OnlyInProVersionException
132
+ */
133
+ public function getContentAggregationNr($function = 'MAX');
134
+ /**
135
+ * (Pro only) Get the order number for a specific attachment in this folder.
136
+ *
137
+ * @param int $attachmentId The attachment id
138
+ * @return int|boolean
139
+ * @throws OnlyInProVersionException
140
+ */
141
+ public function getContentNrOf($attachmentId);
142
+ /**
143
+ * (Pro only) Get the old custom order number count so we can decide if already available.
144
+ *
145
+ * @return int
146
+ * @throws OnlyInProVersionException
147
+ */
148
+ public function getContentOldCustomNrCount();
149
+ }
inc/api/IMetadata.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\api;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Assets;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * Metadata content of a folder. The metadata can be changed in the arrow-down icon
12
+ * in the folders sidebar toolbar. To handle metadata for folders you can
13
+ * use the add_media_folder_meta function.
14
+ *
15
+ * To register the metadata class you must use the following API function add_rml_meta_box.
16
+ */
17
+ interface IMetadata {
18
+ /**
19
+ * Return modified content for the meta box.
20
+ *
21
+ * <strong>Note:</strong> If you want to use a more complex content
22
+ * in a meta table use something like this:
23
+ * ```html
24
+ * <tr>
25
+ * <th scope="row">Medium size</th>
26
+ * <td><fieldset>
27
+ * <legend class="screen-reader-text"><span>Medium size</span></legend>
28
+ * <label for="medium_size_w">Max Width</label>
29
+ * <input name="medium_size_w" type="number" step="1" min="0" id="medium_size_w" value="300" class="small-text">
30
+ * <label for="medium_size_h">Max Height</label>
31
+ * <input name="medium_size_h" type="number" step="1" min="0" id="medium_size_h" value="300" class="small-text">
32
+ * </fieldset></td>
33
+ * </tr>
34
+ * ```
35
+ *
36
+ * If you want to "group" your meta boxes you can use this code to create a empty space:
37
+ * `<tr class="rml-meta-margin"></tr>`
38
+ *
39
+ * @param string $content the HTML formatted string for the dialog
40
+ * @param IFolder|null $folder The folder object
41
+ * @return string
42
+ */
43
+ public function content($content, $folder);
44
+ /**
45
+ * Save the infos. Add an error to the array to show on the frontend dialog. Add an
46
+ * successful data to receive it in JavaScript.
47
+ *
48
+ * ```php
49
+ * $response["errors"][] = "Your error";
50
+ * $response["data"]["myData"] = "Test";
51
+ * ```
52
+ *
53
+ * Since v.4.0.8 the minimum PHP version is 4.0.8 and you can use traits in your meta
54
+ * implementation: metadata\CommonTrait, metadata\CommonFolderTrait or usersettings\CommonUserSettingsTrait.
55
+ *
56
+ * @param string[] $response Array of errors and successful data.
57
+ * @param \WP_REST_Request $request The server request
58
+ * @param IFolder|null $folder The folder object
59
+ * @return string[]
60
+ */
61
+ public function save($response, $folder, $request);
62
+ /**
63
+ * Enqueue scripts and styles for this meta box.
64
+ *
65
+ * @param Assets $assets The assets instance so you can enqueue library scripts
66
+ */
67
+ public function scripts($assets);
68
+ }
inc/api/IStructure.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\api;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ /**
10
+ * Structure implementation for Real Media Library. It handles all SQL query which
11
+ * reads all folders from the database and "collects" it into one tree. You can modify the
12
+ * structure queries by RML/Tree* filters and extending the MatthiasWeb\RealMediaLibrary\attachment\Structure
13
+ * class (implements IStructure).
14
+ *
15
+ * @see wp_rml_structure_reset()
16
+ * @see wp_rml_structure()
17
+ * @since 3.3.1
18
+ */
19
+ interface IStructure {
20
+ /**
21
+ * Start reading a structure. If you pass a $root parameter the parameter is not
22
+ * automatically respected. You should then use your own implementation or filters
23
+ * to respect the root. Use this constructor to add your filters and respect your
24
+ * custom Structure class implementation.
25
+ *
26
+ * @param int $root The root folder defined for the structure
27
+ * @param array $data Custom data for the structure
28
+ */
29
+ public function __construct($root = null, $data = null);
30
+ /**
31
+ * Checks, if the SQL result is available and load it if not.
32
+ */
33
+ public function initialLoad();
34
+ /**
35
+ * Resets the data of the structure.
36
+ *
37
+ * @param int $root The root folder
38
+ * @param boolean $fetchData Determine, if the data should be re-fetched
39
+ * @see wp_rml_structure_reset()
40
+ */
41
+ public function resetData($root = null, $fetchData = \true);
42
+ /**
43
+ * Get a folder by id.
44
+ *
45
+ * @param int $id The id of the folder
46
+ * @param boolean $nullForRoot If set to false and $id == -1 then the Root instance is returned
47
+ * @return IFolder|null
48
+ * @see wp_rml_get_object_by_id()
49
+ * @see wp_rml_get_by_id()
50
+ */
51
+ public function byId($id, $nullForRoot = \true);
52
+ /**
53
+ * Get a folder by absolute path.
54
+ *
55
+ * @param string $path The path
56
+ * @return IFolder|null
57
+ * @see wp_rml_get_by_absolute_path
58
+ */
59
+ public function byAbsolutePath($path);
60
+ /**
61
+ * Get the SQL query result instead of IFolder objects.
62
+ *
63
+ * @return object[] The SQL result
64
+ */
65
+ public function getRows();
66
+ /**
67
+ * Get all SQL query results as IFolder objects.
68
+ *
69
+ * @return IFolder[] The folders
70
+ */
71
+ public function getParsed();
72
+ /**
73
+ * Get all SQL query results placed to a tree. That means it is a "hierarchical"
74
+ * result where you work with ->getChildren(). The first level contains the top folders.
75
+ *
76
+ * @return IFolder[] The folders
77
+ */
78
+ public function getTree();
79
+ /**
80
+ * Get all SQL query results placed to a tree. It is fully resolved with all hierarchical
81
+ * plain objects of the folders expect the invisible nodes.
82
+ *
83
+ * @return object[]
84
+ */
85
+ public function getPlainTree();
86
+ /**
87
+ * Get the attachment count for this structure.
88
+ *
89
+ * @return int Count
90
+ */
91
+ public function getCntAttachments();
92
+ /**
93
+ * Get the attachment count for the "Unorganized" folder for this structure.
94
+ *
95
+ * @return int Count
96
+ */
97
+ public function getCntRoot();
98
+ /**
99
+ * Get the custom data.
100
+ *
101
+ * @return array Data
102
+ */
103
+ public function getData();
104
+ /**
105
+ * Set the custom data.
106
+ *
107
+ * @param array $data The custom data
108
+ */
109
+ public function setData($data);
110
+ }
inc/api/IUserSettings.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\api;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Assets;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * Metadata content for the general user settings. The metadata can be changed in the cog icon
12
+ * in the folders sidebar toolbar. To handle metadata for general user settings you can
13
+ * use the default WordPress add_user_meta function.
14
+ *
15
+ * To register the metadata class you must use the following API function add_rml_user_settings_box.
16
+ *
17
+ * @see https://developer.wordpress.org/reference/functions/add_user_meta/
18
+ * @since 3.2
19
+ */
20
+ interface IUserSettings {
21
+ /**
22
+ * Return modified content for the meta box.
23
+ *
24
+ * <strong>Note:</strong> If you want to use a more complex content
25
+ * in a meta table use something like this:
26
+ * ```html
27
+ * <tr>
28
+ * <th scope="row">Medium size</th>
29
+ * <td><fieldset>
30
+ * <legend class="screen-reader-text"><span>Medium size</span></legend>
31
+ * <label for="medium_size_w">Max Width</label>
32
+ * <input name="medium_size_w" type="number" step="1" min="0" id="medium_size_w" value="300" class="small-text">
33
+ * <label for="medium_size_h">Max Height</label>
34
+ * <input name="medium_size_h" type="number" step="1" min="0" id="medium_size_h" value="300" class="small-text">
35
+ * </fieldset></td>
36
+ * </tr>
37
+ * ```
38
+ *
39
+ * If you want to "group" your meta boxes you can use this code to create a empty space:
40
+ * `<tr class="rml-meta-margin"></tr>`
41
+ *
42
+ * @param string $content the HTML formatted string for the dialog
43
+ * @param int $user Current user id
44
+ * @return string Content
45
+ */
46
+ public function content($content, $user);
47
+ /**
48
+ * Save the infos. Add an error to the array to show on the frontend dialog. Add an
49
+ * successful data to receive it in JavaScript.
50
+ *
51
+ * ```php
52
+ * $response["errors"][] = "Your error";
53
+ * $response["data"]["myData"] = "Test";
54
+ * ```
55
+ *
56
+ * @param string[] $response Array of errors and successful data.
57
+ * @param int $user Current user id
58
+ * @param \WP_REST_Request $request The server request
59
+ * @return string[]
60
+ */
61
+ public function save($response, $user, $request);
62
+ /**
63
+ * Enqueue scripts and styles for this meta box.
64
+ *
65
+ * @param Assets $assets The assets instance so you can enqueue library scripts
66
+ */
67
+ public function scripts($assets);
68
+ }
inc/api/attachment.php ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * In this file you will find attachment relevant functions.
5
+ *
6
+ * DEFINED POST TYPES
7
+ *
8
+ * define('RML_TYPE_FOLDER', 0);
9
+ * define('RML_TYPE_COLLECTION', 1);
10
+ * define('RML_TYPE_GALLERY', 2);
11
+ *
12
+ * ==========================================
13
+ *
14
+ * Example scenario #1:
15
+ * 1. User navigates to /rml/collection1
16
+ * 2. Use wp_rml_get_by_absolute_path("/collection1") to get the api\IFolder Object
17
+ * 3. (Additional check) $folder->is(RML_TYPE_COLLECTION) to check, if it is a collection.
18
+ * 4. Iterate the childrens with foreach ($folder->getChildren() as $value) { }
19
+ * 5. In collection can only be other collections or galleries.
20
+ *
21
+ * 6. (Additional check) $value->is(RML_TYPE_GALLERY) to check, if it is a gallery.
22
+ * 7. Fetch the IDs with $value->read();
23
+ *
24
+ * ==========================================
25
+ *
26
+ * If you want to use more functions look into the attachment\Structure Class.
27
+ * You easily get it with attachment\Structure::getInstance() (Singleton).
28
+ *
29
+ * Meaning: Root = Unorganized Pictures
30
+ *
31
+ * ==========================================
32
+ *
33
+ * ORDER QUERY
34
+ *
35
+ * Using the custom order of galleries: In your get_posts()
36
+ * query args use the option "orderby" => "rml" to get the
37
+ * images ordered by custom user order.
38
+ *
39
+ * ==========================================
40
+ *
41
+ * CUSTOM FIELDS FOR FOLDERS, COLLECTIONS, GALLERIES, ....
42
+ *
43
+ * You want create your own custom fields for a rml object?
44
+ * Have a look at the metadata\Meta class.
45
+ */
46
+ use MatthiasWeb\RealMediaLibrary\attachment\Filter;
47
+ use MatthiasWeb\RealMediaLibrary\attachment\Shortcut;
48
+ use MatthiasWeb\RealMediaLibrary\Core;
49
+ // @codeCoverageIgnoreStart
50
+ \defined('ABSPATH') or die('No script kiddies please!');
51
+ // Avoid direct file request
52
+ // @codeCoverageIgnoreEnd
53
+ if (!\function_exists('wp_rml_get_attachments')) {
54
+ /**
55
+ * Reads content of a folder.
56
+ *
57
+ * @param int $fid The folder id
58
+ * @param string $order The order statement
59
+ * @param string $orderby The order by statement
60
+ * @return null|int[] Null if folder not exists or array of post ids
61
+ */
62
+ function wp_rml_get_attachments($fid, $order = null, $orderby = null) {
63
+ $folder = \wp_rml_get_object_by_id($fid);
64
+ return \is_rml_folder($folder) ? $folder->read($order, $orderby) : null;
65
+ }
66
+ }
67
+ if (!\function_exists('wp_attachment_folder')) {
68
+ /**
69
+ * Returns the folder id of an given attachment or more than one attachment (array). If you pass an array
70
+ * as attachment ids, then the default value does not work, only for single queries. When you pass a
71
+ * shortcut attachment id, the folder id for the shortcut is returned.
72
+ *
73
+ * @param int $attachmentId The attachment ID, if you pass an array you get an array of folder IDs
74
+ * @param int $default If no folder was found for this, this value is returned for the attachment
75
+ * @return int|mixed Folder ID or $default or Array
76
+ */
77
+ function wp_attachment_folder($attachmentId, $default = null) {
78
+ return \MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance()->getAttachmentFolder(
79
+ $attachmentId,
80
+ $default
81
+ );
82
+ }
83
+ }
84
+ if (!\function_exists('wp_attachment_order_update')) {
85
+ /**
86
+ * (Pro only) Moves an attachment before another given attachment in the order table.
87
+ *
88
+ * @param int $folderId The folder id where the attachment exists
89
+ * @param int $attachmentId The attachment which should be moved
90
+ * @param int $nextId The attachment next to the currentId, if it is false the currentId should be moved to the end of table.
91
+ * @param int $lastIdInView If you have pagination, you can pass the last id from this view
92
+ * @return boolean True or array with error strings
93
+ */
94
+ function wp_attachment_order_update($folderId, $attachmentId, $nextId, $lastIdInView = \false) {
95
+ // Get folder
96
+ $folder = \wp_rml_get_object_by_id($folderId);
97
+ if (\is_rml_folder($folder)) {
98
+ // Try to insert
99
+ try {
100
+ $folder->contentOrder($attachmentId, $nextId, $lastIdInView);
101
+ return \true;
102
+ } catch (\Exception $e) {
103
+ \MatthiasWeb\RealMediaLibrary\Core::getInstance()->debug($e->getMessage(), __FUNCTION__);
104
+ return [$e->getMessage()];
105
+ }
106
+ } else {
107
+ \MatthiasWeb\RealMediaLibrary\Core::getInstance()->debug(
108
+ "Could not find the folder with id {$folderId}",
109
+ __FUNCTION__
110
+ );
111
+ return [\__('The given folder was not found.', \RML_TD)];
112
+ }
113
+ }
114
+ }
115
+ if (!\function_exists('wp_rml_move')) {
116
+ /**
117
+ * Move or create shortcuts of a set of attachments to a specific folder.
118
+ *
119
+ * If you copy attachments, the action called is also "RML/Item/Move"... but
120
+ * there is a paramter $isShortcut.
121
+ *
122
+ * @param int $to Folder ID
123
+ * @param int[] $ids Array of attachment ids
124
+ * @param boolean $supress_validation Supress the permission validation
125
+ * @param boolean $isShortcut Determines, if the ID's are copies
126
+ * @return boolean|string[] True or Array with errors
127
+ */
128
+ function wp_rml_move($to, $ids, $supress_validation = \false, $isShortcut = \false) {
129
+ if ($to === \false || !\is_numeric($to)) {
130
+ // No movement
131
+ return [\__('The given folder was not found.', \RML_TD)];
132
+ }
133
+ // Get folder
134
+ $folder = \wp_rml_get_object_by_id($to);
135
+ if (\is_rml_folder($folder)) {
136
+ // Try to insert
137
+ try {
138
+ $folder->insert($ids, $supress_validation, $isShortcut);
139
+ return \true;
140
+ } catch (\Exception $e) {
141
+ \MatthiasWeb\RealMediaLibrary\Core::getInstance()->debug($e->getMessage(), __FUNCTION__);
142
+ return [$e->getMessage()];
143
+ }
144
+ } else {
145
+ \MatthiasWeb\RealMediaLibrary\Core::getInstance()->debug(
146
+ "Could not find the folder with id {$to}",
147
+ __FUNCTION__
148
+ );
149
+ return [\__('The given folder was not found.', \RML_TD)];
150
+ }
151
+ }
152
+ }
153
+ /*
154
+ * Shortcut relevant API.
155
+ */
156
+ if (!\function_exists('wp_rml_create_shortcuts')) {
157
+ /**
158
+ * Link/Copy a set of attachments to a specific folder. When the folder
159
+ * has already a given shortcut, the movement for the given attachment will be skipped.
160
+ *
161
+ * If you want to receive the last created shortcut ID's you can use the
162
+ * wp_rml_created_shortcuts_last_ids() function.
163
+ *
164
+ * @param int $to Folder ID, if folder not exists then root will be
165
+ * @param int[] $ids Array of attachment ids
166
+ * @param boolean $supress_validation Supress the permission validation
167
+ * @return boolean|string[] True or Array with errors
168
+ */
169
+ function wp_rml_create_shortcuts($to, $ids, $supress_validation = \false) {
170
+ return \wp_rml_move($to, $ids, $supress_validation, \true);
171
+ }
172
+ }
173
+ if (!\function_exists('wp_rml_created_shortcuts_last_ids')) {
174
+ /**
175
+ * If you create shortcuts you can get the ids for those shortcuts with this function.
176
+ *
177
+ * @return int[]
178
+ */
179
+ function wp_rml_created_shortcuts_last_ids() {
180
+ return \MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance()->getLastIds();
181
+ }
182
+ }
183
+ if (!\function_exists('wp_attachment_ensure_source_file')) {
184
+ /**
185
+ * Checks if a given attachment has already a shortcut in a given folder id
186
+ * or has generally shortcuts.
187
+ *
188
+ * @param int|WP_Post $post The attachment id or a WP_Post object
189
+ * @return int|WP_Post
190
+ */
191
+ function wp_attachment_ensure_source_file($post) {
192
+ $isShortcut = \wp_attachment_is_shortcut($post, \true);
193
+ if ($isShortcut > 0) {
194
+ return $post instanceof \WP_Post ? \get_post($isShortcut) : $isShortcut;
195
+ }
196
+ return $post;
197
+ }
198
+ }
199
+ if (!\function_exists('wp_attachment_has_shortcuts')) {
200
+ /**
201
+ * Checks if a given attachment has already a shortcut in a given folder id
202
+ * or has generally shortcuts.
203
+ *
204
+ * @param int $postId The attachment id
205
+ * @param int $fid The folder id, if false, it checks if there generally exists shortcuts
206
+ * @return boolean
207
+ */
208
+ function wp_attachment_has_shortcuts($postId, $fid = \false) {
209
+ global $wpdb;
210
+ $table_name = \MatthiasWeb\RealMediaLibrary\Core::getInstance()->getTableName('posts');
211
+ // phpcs:disable WordPress.DB.PreparedSQL
212
+ if ($fid !== \false) {
213
+ $sql = $wpdb->prepare("SELECT COUNT(*) FROM {$table_name} WHERE isShortcut=%d AND fid=%d", $postId, $fid);
214
+ } else {
215
+ $sql = $wpdb->prepare("SELECT COUNT(*) FROM {$table_name} WHERE isShortcut=%d", $postId);
216
+ }
217
+ return $wpdb->get_var($sql) > 0;
218
+ // phpcs:enable WordPress.DB.PreparedSQL
219
+ }
220
+ }
221
+ if (!\function_exists('wp_attachment_get_shortcuts')) {
222
+ /**
223
+ * Checks if a given attachment ID has shortcut and returns the shortcut IDs as array.
224
+ *
225
+ * @param int $postId The attachment id
226
+ * @param int $fid The folder id, if false, it checks if there generally exists shortcuts
227
+ * @param boolean $extended If true the result is an array with all information about the associated folder
228
+ * @return mixed
229
+ */
230
+ function wp_attachment_get_shortcuts($postId, $fid = \false, $extended = \false) {
231
+ global $wpdb;
232
+ $table_name = \MatthiasWeb\RealMediaLibrary\Core::getInstance()->getTableName('posts');
233
+ $table_name_rml = \MatthiasWeb\RealMediaLibrary\Core::getInstance()->getTableName();
234
+ $join = $extended ? "LEFT JOIN {$table_name_rml} AS rml ON rml.id = p.fid" : '';
235
+ $select = $extended ? ', rml.*' : '';
236
+ $orderby = $extended ? 'ORDER BY name' : '';
237
+ // phpcs:disable WordPress.DB.PreparedSQL
238
+ if ($fid !== \false) {
239
+ $sql = $wpdb->prepare(
240
+ "SELECT p.attachment, p.fid AS folderId {$select} FROM {$table_name} AS p {$join} WHERE p.isShortcut=%d AND p.fid=%d {$orderby}",
241
+ $postId,
242
+ $fid
243
+ );
244
+ } else {
245
+ $sql = $wpdb->prepare(
246
+ "SELECT p.attachment, p.fid AS folderId {$select} FROM {$table_name} AS p {$join} WHERE p.isShortcut=%d {$orderby}",
247
+ $postId
248
+ );
249
+ }
250
+ return $extended ? $wpdb->get_results($sql, \ARRAY_A) : $wpdb->get_col($sql);
251
+ // phpcs:enable WordPress.DB.PreparedSQL
252
+ }
253
+ }
254
+ if (!\function_exists('wp_attachment_is_shortcut')) {
255
+ /**
256
+ * Checks if a given attachment is a shortcut, use the $returnSourceId
257
+ * parameter to get the source attachment id.
258
+ *
259
+ * @param int|WP_Post $post The attachment id or a WP_Post object
260
+ * @param boolean $returnSourceId If true, the return will be the source attachment id or 0 if it is no shortcut
261
+ * @return boolean|int
262
+ */
263
+ function wp_attachment_is_shortcut($post, $returnSourceId = \false) {
264
+ $guid = \get_the_guid($post);
265
+ \preg_match('/\\?sc=([0-9]+)$/', $guid, $matches);
266
+ if (isset($matches) && \is_array($matches) && isset($matches[1])) {
267
+ return $returnSourceId ? (int) $matches[1] : \true;
268
+ } else {
269
+ return $returnSourceId ? 0 : \false;
270
+ }
271
+ }
272
+ }
273
+ if (!\function_exists('_wp_rml_synchronize_attachment')) {
274
+ /**
275
+ * Synchronizes a result with the realmedialibrary_posts table so on this
276
+ * base there can be made the folder content. It also creates shortcuts, if the
277
+ * given $isShortcut parameter is true.
278
+ *
279
+ * Do not use this directly, instead use the wp_rml_move function.
280
+ *
281
+ * @param int $postId The post ID
282
+ * @param int $fid The folder ID
283
+ * @param boolean $isShortcut true = Is shortcut in the given folder, false = Is no shortcut, mainly in this folder
284
+ * @return boolean
285
+ */
286
+ function _wp_rml_synchronize_attachment($postId, $fid, $isShortcut = \false) {
287
+ return \MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance()->create($postId, $fid, $isShortcut);
288
+ }
289
+ }
inc/api/folders.php ADDED
@@ -0,0 +1,599 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
4
+ use MatthiasWeb\RealMediaLibrary\attachment\CountCache;
5
+ use MatthiasWeb\RealMediaLibrary\attachment\Filter;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
7
+ use MatthiasWeb\RealMediaLibrary\Core;
8
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
9
+ use MatthiasWeb\RealMediaLibrary\folder\CRUD;
10
+ use MatthiasWeb\RealMediaLibrary\Util;
11
+ // @codeCoverageIgnoreStart
12
+ \defined('ABSPATH') or die('No script kiddies please!');
13
+ // Avoid direct file request
14
+ // @codeCoverageIgnoreEnd
15
+ if (!\function_exists('wp_rml_debug')) {
16
+ /**
17
+ * This function is recommend for RML add-ons. You can use this function
18
+ * to generate log entries in the database when Settings > Media > Debug
19
+ * is enabled.
20
+ *
21
+ * @param mixed|string $message The message
22
+ * @param string $methodOrFunction __METHOD__ or __FUNCTION__
23
+ * @since 4.0.2
24
+ */
25
+ function wp_rml_debug($message, $methodOrFunction = null) {
26
+ \MatthiasWeb\RealMediaLibrary\Core::getInstance()->debug($message, $methodOrFunction);
27
+ }
28
+ }
29
+ if (!\function_exists('is_rml_folder')) {
30
+ /**
31
+ * Checks, if a given variable is an implementation of the
32
+ * IFolder interface.
33
+ *
34
+ * @param int|IFolder $obj Object or int (ID)
35
+ * @return boolean
36
+ */
37
+ function is_rml_folder($obj) {
38
+ return \is_int($obj)
39
+ ? \is_rml_folder(\wp_rml_get_object_by_id($obj))
40
+ : $obj instanceof \MatthiasWeb\RealMediaLibrary\api\IFolder;
41
+ }
42
+ }
43
+ if (!\function_exists('wp_rml_get_parent_id')) {
44
+ /**
45
+ * Get the parent ID of a given folder id.
46
+ *
47
+ * @param int $id The id of the folder, collection, ...
48
+ * @return int or null
49
+ */
50
+ function wp_rml_get_parent_id($id) {
51
+ $folder = \wp_rml_get_object_by_id($id);
52
+ return \is_rml_folder($folder) ? $folder->getParent() : null;
53
+ }
54
+ }
55
+ if (!\function_exists('wp_rml_objects')) {
56
+ /**
57
+ * Get all available folders, collections, galleries, ...
58
+ *
59
+ * @return IFolder[]
60
+ */
61
+ function wp_rml_objects() {
62
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getParsed();
63
+ }
64
+ }
65
+ if (!\function_exists('wp_rml_root_childs')) {
66
+ /**
67
+ * Gets the first level childs of the media library.
68
+ *
69
+ * @return IFolder[]
70
+ */
71
+ function wp_rml_root_childs() {
72
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getTree();
73
+ }
74
+ }
75
+ if (!\function_exists('wp_rml_create')) {
76
+ /**
77
+ * Creates a folder. At first it checks if a folder in parent already exists.
78
+ * Then it checks if the given type is allowed in the parent.
79
+ *
80
+ * It is highly recommend, to use wp_rml_structure_reset after you created your folders.
81
+ *
82
+ * @param string $name String Name of the folder
83
+ * @param int $parent int ID of the parent (_wp_rml_root() for root)
84
+ * @param int $type integer 0|1|2, Folder.inc
85
+ * @param string[] $restrictions Restrictions for this folder
86
+ * @param boolean $supress_validation Supress the permission validation
87
+ * @param boolean $return_existing_id If true and the folder already exists, then return the ID of the existing folder
88
+ * @return int|string[] int (ID) when successfully array with error strings
89
+ * @throws OnlyInProVersionException
90
+ * @since 4.12.1 This function ignores the `$parent` parameter in Lite version as creating subfolders is no longer supported
91
+ */
92
+ function wp_rml_create(
93
+ $name,
94
+ $parent,
95
+ $type,
96
+ $restrictions = [],
97
+ $supress_validation = \false,
98
+ $return_existing_id = \false
99
+ ) {
100
+ return \MatthiasWeb\RealMediaLibrary\folder\CRUD::getInstance()->create(
101
+ $name,
102
+ $parent,
103
+ $type,
104
+ $restrictions,
105
+ $supress_validation,
106
+ $return_existing_id
107
+ );
108
+ }
109
+ }
110
+ if (!\function_exists('wp_rml_create_p')) {
111
+ /**
112
+ * (Pro only) Creates multiple folders like "test/test2". At first it checks if a folder in parent already exists.
113
+ * Then it checks if the given type is allowed in the parent.
114
+ *
115
+ * It is highly recommend, to use wp_rml_structure_reset after you created your folders.
116
+ *
117
+ * @param string $name String Name of the folder
118
+ * @param int $parent int ID of the parent (_wp_rml_root() for root)
119
+ * @param int $type integer 0|1|2, Folder.inc
120
+ * @param string[] $restrictions Restrictions for this folder, it is only applied to first folder
121
+ * @param boolean $supress_validation Supress the permission validation
122
+ * @return int|string[] int (ID) when successfully array with error strings
123
+ * @throws OnlyInProVersionException
124
+ * @since 4.12.0
125
+ * @since 4.12.1 This function is no longer available in PRO version
126
+ */
127
+ function wp_rml_create_p($name, $parent, $type, $restrictions = [], $supress_validation = \false) {
128
+ return \MatthiasWeb\RealMediaLibrary\folder\CRUD::getInstance()->createRecursively(
129
+ $name,
130
+ $parent,
131
+ $type,
132
+ $restrictions,
133
+ $supress_validation
134
+ );
135
+ }
136
+ }
137
+ if (!\function_exists('wp_rml_create_or_return_existing_id')) {
138
+ /**
139
+ * Wrapper function for wp_rml_create.
140
+ *
141
+ * @param string $name String Name of the folder
142
+ * @param int $parent int ID of the parent (_wp_rml_root() for root)
143
+ * @param int $type integer 0|1|2, Folder.inc
144
+ * @param string[] $restrictions Restrictions for this folder
145
+ * @param boolean $supress_validation Supress the permission validation
146
+ * @return int|string[] int (ID) when successfully array with error strings
147
+ * @since 4.12.1 This function ignores the `$parent` parameter in Lite version as creating subfolders is no longer supported
148
+ */
149
+ function wp_rml_create_or_return_existing_id(
150
+ $name,
151
+ $parent,
152
+ $type,
153
+ $restrictions = [],
154
+ $supress_validation = \false
155
+ ) {
156
+ return \wp_rml_create($name, $parent, $type, $restrictions, $supress_validation, \true);
157
+ }
158
+ }
159
+ if (!\function_exists('wp_rml_rename')) {
160
+ /**
161
+ * Renames a folder and then checks, if there is no duplicate folder in the
162
+ * parent folder.
163
+ *
164
+ * @param string $name String New name of the folder
165
+ * @param int $id The ID of the folder
166
+ * @param boolean $supress_validation Suppress the permission validation
167
+ * @return boolean|string[] true or array with error strings
168
+ */
169
+ function wp_rml_rename($name, $id, $supress_validation = \false) {
170
+ return \MatthiasWeb\RealMediaLibrary\folder\CRUD::getInstance()->update($name, $id, $supress_validation);
171
+ }
172
+ }
173
+ if (!\function_exists('wp_rml_delete')) {
174
+ /**
175
+ * Deletes a folder by ID.
176
+ *
177
+ * @param int $id The ID of the folder
178
+ * @param boolean $supress_validation Supress the permission validation
179
+ * @return boolean|string[] True or array with error string
180
+ */
181
+ function wp_rml_delete($id, $supress_validation = \false) {
182
+ return \MatthiasWeb\RealMediaLibrary\folder\CRUD::getInstance()->remove($id, $supress_validation);
183
+ }
184
+ }
185
+ if (!\function_exists('wp_rml_update_count')) {
186
+ /**
187
+ * Handle the count cache for the folders. This should avoid
188
+ * a lack SQL subquery which loads data from the postmeta table.
189
+ *
190
+ * @param int[] $folders Array of folders ID, if null then all folders with cnt NULL are updated
191
+ * @param int[] $attachments Array of attachments ID, is merged with $folders if given
192
+ * @param boolean $onlyReturn Set to true if you only want the SQL query
193
+ * @return string|null
194
+ */
195
+ function wp_rml_update_count($folders = null, $attachments = null, $onlyReturn = \false) {
196
+ return \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->updateCountCache(
197
+ $folders,
198
+ $attachments,
199
+ $onlyReturn
200
+ );
201
+ }
202
+ }
203
+ if (!\function_exists('wp_rml_selector')) {
204
+ /**
205
+ * This function returns a HTML code (input[type="hidden"]) which gets nicely
206
+ * rendered via Javascript (FolderSelector). If you need a more complex implementation
207
+ * have a look at FolderSelector.js module.
208
+ *
209
+ * $options:
210
+ * - mixed selected=Root The selected item, "" => "None", _wp_rml_root() => "Root", int => Folder ID
211
+ * - int[] disabled Which folder types are disabled
212
+ * - boolean nullable=false Defines if null ('') is allowed as value
213
+ * - boolean editable=true Define if the selector is editable
214
+ * - string name Name for the input
215
+ * - string title Title in the modal dialog
216
+ *
217
+ * @param array $options
218
+ * @return string
219
+ * @since 4.3
220
+ */
221
+ function wp_rml_selector($options = []) {
222
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()
223
+ ->getView()
224
+ ->selector($options);
225
+ }
226
+ }
227
+ if (!\function_exists('wp_rml_dropdown')) {
228
+ /**
229
+ * This functions returns a HTML formatted string which contains
230
+ * options-tag elements with all folders, collections and galleries.
231
+ *
232
+ * This function should only be used if you want to provide <option /> output. For a more
233
+ * UX friendly dropdown use wp_rml_selector()!
234
+ *
235
+ * @param mixed $selected The selected item, "" => "All Files", _wp_rml_root() => "Root", int => Folder ID. Can also be an array for multiple select (since 3.1.2)
236
+ * @param int[] $disabled Which folder types are disabled. Default disabled is RML_TYPE_COLLECTION
237
+ * @param boolean $useAll boolean Defines, if "All Files" should be showed
238
+ * @return string
239
+ */
240
+ function wp_rml_dropdown($selected, $disabled, $useAll = \true) {
241
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()
242
+ ->getView()
243
+ ->dropdown($selected, $disabled, $useAll);
244
+ }
245
+ }
246
+ if (!\function_exists('wp_rml_dropdown_collection')) {
247
+ /**
248
+ * This functions returns a HTML formatted string which contains
249
+ * `<options>` elements with all folders, collections and galleries.
250
+ * Note: Only COLLECTIONS are SELECTABLE!
251
+ *
252
+ * This function should only be used if you want to provide <option /> output. For a more
253
+ * UX friendly dropdown use wp_rml_selector()!
254
+ *
255
+ * @param mixed $selected The selected item, "" => "All Files", _wp_rml_root() => "Root", int => Folder ID. Can also be an array for multiple select (since 3.1.2)
256
+ * @return string
257
+ */
258
+ function wp_rml_dropdown_collection($selected) {
259
+ return \wp_rml_dropdown($selected, [0, 2, 3, 4]);
260
+ }
261
+ }
262
+ if (!\function_exists('wp_rml_dropdown_gallery')) {
263
+ /**
264
+ * This functions returns a HTML formatted string which contains
265
+ * option-tag elements with all folders, collections and galleries.
266
+ * Note: Only GALLERIES are SELECTABLE!
267
+ *
268
+ * This function should only be used if you want to provide <option /> output. For a more
269
+ * UX friendly dropdown use wp_rml_selector()!
270
+ *
271
+ * @param mixed $selected The selected item, "" => "All Files", _wp_rml_root() => "Root", int => Folder ID. Can also be an array for multiple select (since 3.1.2)
272
+ * @return string
273
+ */
274
+ function wp_rml_dropdown_gallery($selected) {
275
+ return \wp_rml_dropdown($selected, [0, 1, 3, 4]);
276
+ }
277
+ }
278
+ if (!\function_exists('wp_rml_dropdown_gallery_or_collection')) {
279
+ /**
280
+ * This functions returns a HTML formatted string which contains
281
+ * option-tag elements with all folders, collections and galleries.
282
+ * Note: Only GALLERIES AND COLLECTIONS are SELECTABLE!
283
+ *
284
+ * @param mixed $selected The selected item, "" => "All Files", _wp_rml_root() => "Root", int => Folder ID. Can also be an array for multiple select (since 3.1.2)
285
+ * @return string
286
+ */
287
+ function wp_rml_dropdown_gallery_or_collection($selected) {
288
+ return \wp_rml_dropdown($selected, [0, 3, 4]);
289
+ }
290
+ }
291
+ if (!\function_exists('wp_rml_is_type')) {
292
+ /**
293
+ * Determines if a Folder is a special folder type.
294
+ *
295
+ * @param IFolder|int $folder The folder object
296
+ * @param int[] $allowed Which folder types are allowed
297
+ * @return boolean
298
+ */
299
+ function wp_rml_is_type($folder, $allowed) {
300
+ if (!\is_rml_folder($folder)) {
301
+ $folder = \wp_rml_get_by_id($folder, null, \true);
302
+ if (!\is_rml_folder($folder)) {
303
+ return \false;
304
+ }
305
+ }
306
+ return \in_array($folder->getType(), $allowed, \true);
307
+ }
308
+ }
309
+ if (!\function_exists('wp_rml_get_object_by_id')) {
310
+ /**
311
+ * A shortcut function for the wp_rml_get_by_id function that ensures, that
312
+ * a IFolder object is returned. For -1 the root instance is returned.
313
+ *
314
+ * @param int $id
315
+ * @param int[] $allowed
316
+ * @return IFolder
317
+ */
318
+ function wp_rml_get_object_by_id($id, $allowed = null) {
319
+ return \wp_rml_get_by_id($id, $allowed, \true, \false);
320
+ }
321
+ }
322
+ if (!\function_exists('wp_rml_get_by_id')) {
323
+ /**
324
+ * This functions checks if a specific folder exists by ID and is
325
+ * a given allowed RML Folder Type. If the given folder is _wp_rml_root you will
326
+ * get the first level folders.
327
+ *
328
+ * @param int $id Folder ID
329
+ * @param int[] $allowed Which folder types are allowed. If null all folder types are allowed.
330
+ * @param boolean $mustBeFolderObject Defines if the function may return the wp_rml_root_childs result
331
+ * @param boolean $nullForRoot If set to false and $id == -1 then the Root instance is returned
332
+ * @return IFolder
333
+ */
334
+ function wp_rml_get_by_id($id, $allowed = null, $mustBeFolderObject = \false, $nullForRoot = \true) {
335
+ if (!\is_numeric($id)) {
336
+ return null;
337
+ }
338
+ if ($mustBeFolderObject === \false && $id === \_wp_rml_root()) {
339
+ return \wp_rml_root_childs();
340
+ }
341
+ $folder = \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->byId($id, $nullForRoot);
342
+ if (\is_array($allowed)) {
343
+ if (!\wp_rml_is_type($folder, $allowed)) {
344
+ return null;
345
+ }
346
+ }
347
+ return $folder;
348
+ }
349
+ }
350
+ if (!\function_exists('wp_rml_get_by_absolute_path')) {
351
+ /**
352
+ * This functions checks if a specific folder exists by absolute path and is
353
+ * a given allowed RML Folder Type.
354
+ *
355
+ * @param string $path Folder Absolute Path
356
+ * @param int[] $allowed Which folder types are allowed. If null all folder types are allowed.
357
+ * @return IFolder
358
+ */
359
+ function wp_rml_get_by_absolute_path($path, $allowed = null) {
360
+ $folder = \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->byAbsolutePath($path);
361
+ if (\is_array($allowed)) {
362
+ if (!\wp_rml_is_type($folder, $allowed)) {
363
+ return null;
364
+ }
365
+ }
366
+ return $folder;
367
+ }
368
+ }
369
+ if (!\function_exists('wp_rml_register_creatable')) {
370
+ /**
371
+ * Register a new folder type for RML. It does not check if the creatable type
372
+ * is already registered.
373
+ *
374
+ * @param string $qualified The qualified name of the class representing the creatable
375
+ * @param int $type The type of the creatable. It must be the same as in yourClass::getType is returned
376
+ * @param boolean $onRegister Calls the yourClass::onRegister function
377
+ */
378
+ function wp_rml_register_creatable($qualified, $type, $onRegister = \false) {
379
+ \MatthiasWeb\RealMediaLibrary\folder\CRUD::getInstance()->registerCreatable($qualified, $type, $onRegister);
380
+ }
381
+ }
382
+ if (!\function_exists('_wp_rml_root')) {
383
+ /**
384
+ * Get the parent root folder for a given blog id.
385
+ *
386
+ * @return int Folder id
387
+ */
388
+ function _wp_rml_root() {
389
+ /**
390
+ * Get the root folder id which is showed in the folder tree.
391
+ *
392
+ * ```php
393
+ * // Get the root folder
394
+ * $root = _wp_rml_root();
395
+ * ```
396
+ *
397
+ * @param {int} $folderId=-1 -1 is "Unorganized"
398
+ * @param {int} $blogId The current blog id
399
+ * @return {int} The root folder id
400
+ * @hook RML/ParentRoot
401
+ */
402
+ $result = \apply_filters('RML/ParentRoot', -1, \get_current_blog_id());
403
+ return (int) $result;
404
+ }
405
+ }
406
+ if (!\function_exists('wp_rml_active')) {
407
+ /**
408
+ * Checks if RML is active for the current user.
409
+ *
410
+ * @return boolean
411
+ * @since 4.0.2
412
+ */
413
+ function wp_rml_active() {
414
+ /**
415
+ * Checks if RML is active for the current user. Do not use this filter
416
+ * yourself, instead use wp_rml_active() function!
417
+ *
418
+ * @param {boolean} True for activated and false for deactivated
419
+ * @return {boolean}
420
+ * @hook RML/Active
421
+ * @since 3.2
422
+ */
423
+ $result = \apply_filters('RML/Active', \current_user_can('upload_files'));
424
+ return $result;
425
+ }
426
+ }
427
+ if (!\function_exists('_wp_rml_sanitize')) {
428
+ /**
429
+ * Sanitize to a valid slug name for a given folder name. If the
430
+ * passed folder name contains only invalid characters, then it falls
431
+ * back to the base64 encode.
432
+ *
433
+ * @param string $name The name of the folder
434
+ * @param boolean $database If true the name is generated unique from the database slugs
435
+ * @param int $exclude
436
+ * @return string
437
+ */
438
+ function _wp_rml_sanitize($name, $database = \false, $exclude = -1) {
439
+ $slug = \sanitize_title(\sanitize_file_name($name));
440
+ $slug = empty($slug) ? \base64_encode($name) : $slug;
441
+ if ($database && !empty($name)) {
442
+ // Get unique slug
443
+ global $wpdb;
444
+ $core = \MatthiasWeb\RealMediaLibrary\Core::getInstance();
445
+ $table_name = $core->getTableName();
446
+ $i = 0;
447
+ while (\true) {
448
+ // phpcs:disable WordPress.DB.PreparedSQL
449
+ $sql = $wpdb->prepare(
450
+ "SELECT COUNT(*) FROM {$table_name} WHERE slug = %s AND id <> %d",
451
+ $i === 0 ? $slug : $slug . '-' . $i,
452
+ $exclude
453
+ );
454
+ $var = $wpdb->get_var($sql);
455
+ // phpcs:enable WordPress.DB.PreparedSQL
456
+ if ($var > 0) {
457
+ $i++;
458
+ } else {
459
+ break;
460
+ }
461
+ }
462
+ $slugOld = $slug;
463
+ $slug = $i === 0 ? $slugOld : $slugOld . '-' . $i;
464
+ $core->debug("Creating a new slug... check for unique slug '{$slugOld}', use '{$slug}'", __FUNCTION__);
465
+ }
466
+ return $slug;
467
+ }
468
+ }
469
+ if (!\function_exists('_wp_rml_sanitize_filename')) {
470
+ // Internal
471
+ function _wp_rml_sanitize_filename($name) {
472
+ $_name = \sanitize_file_name($name);
473
+ return empty($_name) ? \sanitize_file_name(\_wp_rml_sanitize($name)) : $_name;
474
+ }
475
+ }
476
+ if (!\function_exists('wp_rml_structure_reset')) {
477
+ /**
478
+ * Resets the structure. This function must be called when you create a new folder for example
479
+ * and to register it to the structure.
480
+ *
481
+ * ATTENTION: This function will be declared as deprecated soon, because it is
482
+ * planned to automatically reset the structure data / reset folder data (lazy loading
483
+ * of Folder objects).
484
+ *
485
+ * @param int $root The root folder to read the structure
486
+ * @param boolean $fetchData Determine if the data should be re-fetched
487
+ * @param int $returnId If set this folder is returned
488
+ * @return IFolder If $returnId is set
489
+ */
490
+ function wp_rml_structure_reset($root = null, $fetchData = \true, $returnId = \false) {
491
+ \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->resetData($root, $fetchData);
492
+ if ($returnId !== \false) {
493
+ return \wp_rml_get_object_by_id($returnId);
494
+ }
495
+ }
496
+ }
497
+ if (!\function_exists('wp_rml_structure')) {
498
+ /**
499
+ * Get the main working structure.
500
+ *
501
+ * @return IStructure
502
+ * @since 3.3.1
503
+ */
504
+ function wp_rml_structure() {
505
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance();
506
+ }
507
+ }
508
+ if (!\function_exists('wp_rml_create_all_parents_sql')) {
509
+ /**
510
+ * Returns a SQL query to get all parents for a folder id.
511
+ * The first result for this SQL statement is the first parent and so on...
512
+ * Use rmltmp.lvl field for the depth number upwards. To avoid performance lacks
513
+ * you should figure out if there is already an action available to search for a meta_key
514
+ * in the action RML/$action/AnyParentHasMeta.
515
+ *
516
+ * <strong>$options</strong> parameters:
517
+ * <pre>"fields" => (string) SELECT fields (default: "rmldata.*, rmltmp.lvl AS lvlup")
518
+ * "join" => (string) JOIN statement (default: "")
519
+ * "where" => (string) Replace WHERE statement, it is preferred to use afterWhere (default: "rmltmp.lvl > " . ($includeSelf === true ? "-1" : "0"))
520
+ * "afterWhere"=> (string) Additional WHERE statement to the above WHERE (default: "")
521
+ * "orderby" => (string) ORDER BY statement (default: "rmltmp.lvl ASC")
522
+ * "limit" => (string) LIMIT statement (default: "")</pre>
523
+ *
524
+ * Note: The created SQL is supported by all well-known MySQL systems.
525
+ *
526
+ * @param IFolder|int $folder The folder object or folder id
527
+ * @param boolean $includeSelf Set true to include self (passed $folder)
528
+ * @param int $until Until this folder id
529
+ * @param array $options Additional options for the SQL query, see above
530
+ * @return string|boolean SQL query or false if something went wrong
531
+ */
532
+ function wp_rml_create_all_parents_sql($folder, $includeSelf = \false, $until = null, $options = null) {
533
+ return \MatthiasWeb\RealMediaLibrary\Util::getInstance()->createSQLForAllParents(
534
+ $folder,
535
+ $includeSelf,
536
+ $until,
537
+ $options
538
+ );
539
+ }
540
+ }
541
+ if (!\function_exists('wp_rml_all_children_sql_supported')) {
542
+ /**
543
+ * Checks if the wp_rml_create_all_children_sql() SQL is supported by the current
544
+ * used database system. The function itself creates a dummy table and performs
545
+ * the SQL and checks if the result is as expected. The "support" result is cached
546
+ * site-wide.
547
+ *
548
+ * @param boolean $force If true the database check is performed again
549
+ * @param string $type The type which is minimum required. Possible values: 'function' (MySQL UDF) or 'legacy' (default, old variant)
550
+ * @return boolean
551
+ * @since 4.0.9
552
+ */
553
+ function wp_rml_all_children_sql_supported($force = \false, $type = 'legacy') {
554
+ return \MatthiasWeb\RealMediaLibrary\Core::getInstance()
555
+ ->getActivator()
556
+ ->supportsChildQuery($force, $type);
557
+ }
558
+ }
559
+ if (!\function_exists('wp_rml_create_all_children_sql')) {
560
+ /**
561
+ * Returns a SQL query to get all children for a folder id.
562
+ * The first result for this SQL statement is the first children and so on...
563
+ *
564
+ * <strong>$options</strong> parameters:
565
+ * <pre>"fields" => (string) SELECT fields (default: "rmldata.*"),
566
+ * "join" => (string) JOIN statement (default: ""),
567
+ * "where" => (string) Replace WHERE statement, it is preferred to use afterWhere (default: '1=1 ' . ($includeSelf === true ? "" : $wpdb->prepare(" AND rmldata.id != %d", $folderId))),
568
+ * "afterWhere" => (string) Additional WHERE statement to the above WHERE (default: ""),
569
+ * "orderby" => (string) ORDER BY statement (default: "rmldata.parent, rmldata.ord"),
570
+ * "limit" => (string) LIMIT statement (default: "")</pre>
571
+ *
572
+ * Note: Not all database systems do support this kind of SQL query. You have to use the
573
+ * wp_rml_all_children_sql_supported() API function to check if it is supported.
574
+ *
575
+ * @param IFolder|int $folder The folder object or folder id
576
+ * @param boolean $includeSelf Set true to include self (passed $folder)
577
+ * @param array $options Additional options for the SQL query, see above
578
+ * @return string|boolean SQL query or false if something went wrong
579
+ */
580
+ function wp_rml_create_all_children_sql($folder, $includeSelf = \false, $options = null) {
581
+ return \MatthiasWeb\RealMediaLibrary\Util::getInstance()->createSQLForAllChildren(
582
+ $folder,
583
+ $includeSelf,
584
+ $options
585
+ );
586
+ }
587
+ }
588
+ if (!\function_exists('wp_rml_last_queried_folder')) {
589
+ /**
590
+ * Set or get the last queried folder.
591
+ *
592
+ * @param int $folder The folder id (0 is handled as "All files" folder)
593
+ * @return int
594
+ * @since 4.0.5
595
+ */
596
+ function wp_rml_last_queried_folder($folder = null) {
597
+ return \MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance()->lastQueriedFolder($folder);
598
+ }
599
+ }
inc/api/index.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php
2
+
3
+ // Silence is golden.
inc/api/meta.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * Meta tags for folders.
5
+ *
6
+ * @table wp_realmedialibrary_meta
7
+ * $wpdb->realmedialibrarymeta
8
+ *
9
+ * (C) add_media_folder_meta(...)
10
+ * (R) get_media_folder_meta(...)
11
+ * (U) update_media_folder_meta(...)
12
+ * (D) delete_folder_meta(...)
13
+ *
14
+ * delete_media_folder_meta_by_key(...): Delete everything from folder meta matching meta key.
15
+ *
16
+ * Here you can use the default meta data hooks like:
17
+ * add_{$meta_type}_meta
18
+ * => add_realmedialibrary_meta
19
+ *
20
+ * @see RML_Meta
21
+ * metadata\Meta:content_general
22
+ * metadata\Meta:save_general
23
+ * @see assets/js/meta.js
24
+ *
25
+ * PREDEFINED META KEYS:
26
+ * description
27
+ * coverImage
28
+ */
29
+ use MatthiasWeb\RealMediaLibrary\api\IMetadata;
30
+ use MatthiasWeb\RealMediaLibrary\api\IUserSettings;
31
+ use MatthiasWeb\RealMediaLibrary\metadata\Meta;
32
+ // @codeCoverageIgnoreStart
33
+ \defined('ABSPATH') or die('No script kiddies please!');
34
+ // Avoid direct file request
35
+ // @codeCoverageIgnoreEnd
36
+ if (!\function_exists('get_media_folder_meta')) {
37
+ /**
38
+ * Retrieve folder meta field for a folder.
39
+ *
40
+ * @param int $folder_id Folder ID.
41
+ * @param string $key The meta key to retrieve. By default, returns data for all keys.
42
+ * @param boolean $single Whether to return a single value. Default false.
43
+ * @return mixed[]|mixed Will be an array if $single is false. Will be value of meta data field if $single is true.
44
+ */
45
+ function get_media_folder_meta($folder_id, $key = '', $single = \false) {
46
+ \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance();
47
+ // Necessary checks to prepare metas
48
+ return \get_metadata('realmedialibrary', \_wp_rml_meta_fix_absint($folder_id), $key, $single);
49
+ }
50
+ //var_dump(get_media_folder_meta(108, "test", true));
51
+ }
52
+ if (!\function_exists('add_media_folder_meta')) {
53
+ /**
54
+ * Add meta data field to a folder.
55
+ *
56
+ * Folder meta data is called "Custom Fields" on the Administration Screen.
57
+ *
58
+ * @param int $folder_id Folder ID.
59
+ * @param string $meta_key Metadata name.
60
+ * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.
61
+ * @param boolean $unique Whether the same key should not be added.
62
+ * @return int|false
63
+ */
64
+ function add_media_folder_meta($folder_id, $meta_key, $meta_value, $unique = \false) {
65
+ \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance();
66
+ // Necessary checks to prepare meta
67
+ return \add_metadata('realmedialibrary', \_wp_rml_meta_fix_absint($folder_id), $meta_key, $meta_value, $unique);
68
+ }
69
+ }
70
+ if (!\function_exists('update_media_folder_meta')) {
71
+ /**
72
+ * Update folder meta field based on folder ID.
73
+ *
74
+ * Use the $prev_value parameter to differentiate between meta fields with the
75
+ * same key and folder ID.
76
+ *
77
+ * If the meta field for the folder does not exist, it will be added.
78
+ *
79
+ * @param int $folder_id Folder ID.
80
+ * @param string $meta_key Metadata key.
81
+ * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.
82
+ * @param mixed $prev_value Previous value to check before removing.
83
+ * @return int|boolean
84
+ */
85
+ function update_media_folder_meta($folder_id, $meta_key, $meta_value, $prev_value = '') {
86
+ \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance();
87
+ // Necessary checks to prepare meta
88
+ return \update_metadata(
89
+ 'realmedialibrary',
90
+ \_wp_rml_meta_fix_absint($folder_id),
91
+ $meta_key,
92
+ $meta_value,
93
+ $prev_value
94
+ );
95
+ }
96
+ }
97
+ if (!\function_exists('delete_media_folder_meta')) {
98
+ /**
99
+ * Remove metadata matching criteria from a folder.
100
+ *
101
+ * You can match based on the key, or key and value. Removing based on key and
102
+ * value, will keep from removing duplicate metadata with the same key. It also
103
+ * allows removing all metadata matching key, if needed.
104
+ *
105
+ * @param int $folder_id Folder ID.
106
+ * @param string $meta_key Metadata name.
107
+ * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.
108
+ * @return boolean True on success, false on failure.
109
+ */
110
+ function delete_media_folder_meta($folder_id, $meta_key, $meta_value = '') {
111
+ \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance();
112
+ // Necessary checks to prepare meta
113
+ return \delete_metadata('realmedialibrary', \_wp_rml_meta_fix_absint($folder_id), $meta_key, $meta_value);
114
+ }
115
+ }
116
+ if (!\function_exists('delete_media_folder_meta_by_key')) {
117
+ /**
118
+ * Delete everything from folder meta matching meta key.
119
+ *
120
+ * @param string $folder_meta_key Key to search for when deleting.
121
+ * @return boolean Whether the post meta key was deleted from the database.
122
+ */
123
+ function delete_media_folder_meta_by_key($folder_meta_key) {
124
+ \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance();
125
+ // Necessery checks to prepare metas
126
+ return \delete_metadata('realmedialibrary', null, $folder_meta_key, '', \true);
127
+ }
128
+ }
129
+ if (!\function_exists('truncate_media_folder_meta')) {
130
+ /**
131
+ * Remove all meta of a folder. Use this with caution!!
132
+ *
133
+ * @param int $folder_id Folder ID
134
+ * @return int
135
+ */
136
+ function truncate_media_folder_meta($folder_id) {
137
+ \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance();
138
+ // Necessary checks to prepare meta
139
+ global $wpdb;
140
+ // phpcs:disable WordPress.DB.PreparedSQL
141
+ $sql = $wpdb->prepare(
142
+ 'DELETE FROM ' . $wpdb->realmedialibrarymeta . ' WHERE realmedialibrary_id=%d',
143
+ \_wp_rml_meta_fix_absint($folder_id)
144
+ );
145
+ return $wpdb->query($sql);
146
+ // phpcs:enable WordPress.DB.PreparedSQL
147
+ }
148
+ }
149
+ if (!\function_exists('add_rml_user_settings_box')) {
150
+ /**
151
+ * Add a visible content to the general user settings dialog.
152
+ *
153
+ * Example: Adding a new tab "Physical" group to user settings dialog (or RML/Folder/Meta/Groups for folder details)
154
+ * ```php
155
+ * add_filter("RML/User/Settings/Groups", function($groups) {
156
+ * $groups["physical"] = __("Physical");
157
+ * return $groups;
158
+ * });
159
+ * ```
160
+ *
161
+ * @param string $name Unique name for this meta box
162
+ * @param IUserSettings $obj The object which implements IUserSettings
163
+ * @param boolean $deprecated boolean Load the resources if exists (since 4.3.0 deprecated, scripts method is always called)
164
+ * @param int $priority Priority for actions and filters
165
+ * @param string $contentGroup The tab group for the meta settings, see example for adding a new group
166
+ * @return boolean
167
+ */
168
+ function add_rml_user_settings_box($name, $obj, $deprecated = \false, $priority = 10, $contentGroup = '') {
169
+ if (!\MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance()->add($name, $obj)) {
170
+ return \false;
171
+ }
172
+ \add_filter(
173
+ 'RML/User/Settings/Content' . (empty($contentGroup) ? '' : '/' . $contentGroup),
174
+ [$obj, 'content'],
175
+ $priority,
176
+ 2
177
+ );
178
+ \add_filter('RML/User/Settings/Save', [$obj, 'save'], $priority, 3);
179
+ \add_action('RML/Scripts', [$obj, 'scripts'], $priority);
180
+ return \true;
181
+ }
182
+ }
183
+ if (!\function_exists('add_rml_meta_box')) {
184
+ /**
185
+ * Add a visible content to the folder details dialog.
186
+ *
187
+ * Example: Adding a new tab "Physical" group to meta dialog (or RML/User/Settings/Groups for user settings)
188
+ * ```php
189
+ * add_filter("RML/Folder/Meta/Groups", function($groups) {
190
+ * $groups["physical"] = __("Physical");
191
+ * return $groups;
192
+ * });
193
+ * ```
194
+ *
195
+ * @param string $name Unique name for this meta box
196
+ * @param IMetadata $obj The object which implements IMetadata
197
+ * @param boolean $hasScripts boolean Load the resources if exists
198
+ * @param int $priority Priority for actions and filters
199
+ * @param string $contentGroup The tab group for the meta settings, see example for adding a new group
200
+ * @return boolean
201
+ */
202
+ function add_rml_meta_box($name, $obj, $hasScripts = \false, $priority = 10, $contentGroup = '') {
203
+ if (!\MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance()->add($name, $obj)) {
204
+ return \false;
205
+ }
206
+ \add_filter(
207
+ 'RML/Folder/Meta/Content' . (empty($contentGroup) ? '' : '/' . $contentGroup),
208
+ [$obj, 'content'],
209
+ $priority,
210
+ 2
211
+ );
212
+ \add_filter('RML/Folder/Meta/Save', [$obj, 'save'], $priority, 3);
213
+ \add_action('RML/Scripts', [$obj, 'scripts'], $priority);
214
+ return \true;
215
+ }
216
+ }
217
+ if (!\function_exists('_wp_rml_meta_fix_absint')) {
218
+ /**
219
+ * Fix absint() in WordPress
220
+ *
221
+ * @param int $folder_id
222
+ * @return int
223
+ * @internal
224
+ */
225
+ function _wp_rml_meta_fix_absint($folder_id) {
226
+ return $folder_id === -1 ? 100000000000 : $folder_id;
227
+ }
228
+ }
inc/attachment/CountCache.php ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * This class handles the count cache for the folder structure.
12
+ */
13
+ class CountCache {
14
+ use UtilsProvider;
15
+ private static $me = null;
16
+ /**
17
+ * An array of new attachment ID's which should be updated
18
+ * with the this::updateCountCache method. This includes also
19
+ * deleted attachments. The "new" means the attachments which are changed,
20
+ * but new for the update.
21
+ */
22
+ private $newAttachments = [];
23
+ /**
24
+ * A collection of folder ids which gets reset on wp_die event.
25
+ */
26
+ private $folderIdsOnWpDie = [];
27
+ /**
28
+ * C'tor.
29
+ */
30
+ private function __construct() {
31
+ // Silence is golden.
32
+ }
33
+ /**
34
+ * Handle the count cache for the folders. This should avoid
35
+ * a lack SQL subquery which loads data from the posts table.
36
+ *
37
+ * @param int[] $folders Array of folders ID, if null then all folders with cnt = NULL are updated
38
+ * @param int[] $attachments Array of attachments ID, is merged with $folders if given
39
+ * @param boolean $onlyReturn Set to true if you only want the SQL query
40
+ * @return string|null
41
+ */
42
+ public function updateCountCache($folders = null, $attachments = null, $onlyReturn = \false) {
43
+ global $wpdb;
44
+ if ($folders !== null) {
45
+ $this->debug('Update count cache for this folders: ' . \json_encode($folders), __METHOD__);
46
+ }
47
+ if ($attachments !== null) {
48
+ $this->debug('Update count cache for this attachments: ' . \json_encode($attachments), __METHOD__);
49
+ }
50
+ $table_name = $this->getTableName();
51
+ // Create where statement
52
+ $where = '';
53
+ // Update by specific folders
54
+ if (\is_array($folders) && \count($folders) > 0) {
55
+ $folders = \array_unique($folders);
56
+ $where .= ' tn.id IN (' . \implode(',', $folders) . ') ';
57
+ }
58
+ // Update by attachment IDs, catch all touched
59
+ if (\is_array($attachments) && \count($attachments) > 0) {
60
+ $attachments = \array_unique($attachments);
61
+ $attachments_in = \implode(',', $attachments);
62
+ $table_posts = $this->getTableName('posts');
63
+ $where .=
64
+ ($where === '' ? '' : ' OR') .
65
+ " tn.id IN (SELECT DISTINCT(rmlposts.fid) FROM {$table_posts} AS rmlposts WHERE rmlposts.attachment IN ({$attachments_in})) ";
66
+ }
67
+ // Default where statement
68
+ if ($where === '') {
69
+ $where = 'tn.cnt IS NULL';
70
+ }
71
+ // Create statement
72
+ $sqlStatement = "UPDATE {$table_name} AS tn SET cnt = (" . $this->getSingleCountSql() . ") WHERE {$where}";
73
+ if ($onlyReturn) {
74
+ return $sqlStatement;
75
+ } elseif (has_action('RML/Count/Update')) {
76
+ /**
77
+ * The folder needs to be updated. If minimum one hook exists the update on the main table
78
+ * is no longer executed. This action is used for example for the WPML compatibility.
79
+ *
80
+ * @param {array} $folders Array of folders ID, if null then all folders with cnt = NULL are updated
81
+ * @param {array} $attachments Array of attachments ID, is merged with $folders if given
82
+ * @param {string} $where The where statement used for the main table
83
+ * @hook RML/Count/Update
84
+ */
85
+ do_action('RML/Count/Update', $folders, $attachments, $where);
86
+ } else {
87
+ // phpcs:disable WordPress.DB.PreparedSQL
88
+ $wpdb->query($sqlStatement);
89
+ // phpcs:enable WordPress.DB.PreparedSQL
90
+ }
91
+ }
92
+ /**
93
+ * Get the single SQL for the subquery of count getter.
94
+ *
95
+ * @return string
96
+ */
97
+ public function getSingleCountSql() {
98
+ /**
99
+ * Get the posts clauses for the count cache.
100
+ *
101
+ * @param {string[]} $clauses The posts clauses with "from", "where"
102
+ * @return {string[]} The posts clauses
103
+ * @hook RML/Count/PostsClauses
104
+ */
105
+ $sql = apply_filters('RML/Count/PostsClauses', [
106
+ 'from' => $this->getTableName('posts') . ' AS rmlpostscnt',
107
+ 'where' => 'rmlpostscnt.fid = tn.id',
108
+ 'afterWhere' => ''
109
+ ]);
110
+ return 'SELECT COUNT(*) FROM ' . $sql['from'] . ' WHERE ' . $sql['where'] . ' ' . $sql['afterWhere'];
111
+ }
112
+ /**
113
+ * Reset the count cache for the current blog id. The content of the array is not prepared for the statement
114
+ *
115
+ * @param int $folderId Array If you pass folder id/ids array, only this one will be reset.
116
+ * @return CountCache
117
+ */
118
+ public function resetCountCache($folderId = null) {
119
+ global $wpdb;
120
+ $table_name = $this->getTableName();
121
+ // phpcs:disable WordPress.DB.PreparedSQL
122
+ if (\is_array($folderId)) {
123
+ $wpdb->query("UPDATE {$table_name} SET cnt=NULL WHERE id IN (" . \implode(',', $folderId) . ')');
124
+ } else {
125
+ $wpdb->query("UPDATE {$table_name} SET cnt=NULL");
126
+ }
127
+ // phpcs:enable WordPress.DB.PreparedSQL
128
+ /**
129
+ * Reset a count cache for a folder or all folders.
130
+ *
131
+ * @param {int} $folderId Can be `null` if all folders need to be reset
132
+ * @hook RML/Count/Reset
133
+ * @since 4.10.3
134
+ */
135
+ do_action('RML/Count/Reset', $folderId);
136
+ return $this;
137
+ }
138
+ /**
139
+ * Is fired with wp_die event.
140
+ *
141
+ * @param int $folderId The folder id
142
+ */
143
+ public function resetCountCacheOnWpDie($folderId) {
144
+ if (!\in_array($folderId, $this->folderIdsOnWpDie, \true)) {
145
+ $this->folderIdsOnWpDie[] = $folderId;
146
+ }
147
+ }
148
+ /**
149
+ * Update at the end of the script execution the count of the given added / deleted attachments.
150
+ */
151
+ public function wp_die() {
152
+ if (\count($this->newAttachments) > 0) {
153
+ $this->debug('Update count cache on wp die...', __METHOD__);
154
+ $this->updateCountCache(null, $this->newAttachments);
155
+ }
156
+ if (\count($this->folderIdsOnWpDie) > 0) {
157
+ $this->debug('Update count cache on wp die...', __METHOD__);
158
+ $this->updateCountCache($this->folderIdsOnWpDie);
159
+ }
160
+ // Reset because this function can be called multiple
161
+ $this->newAttachments = [];
162
+ $this->folderIdsOnWpDie = [];
163
+ }
164
+ /**
165
+ * Add an attachment to the update queue.
166
+ *
167
+ * @param int $id The attachment id
168
+ */
169
+ public function addNewAttachment($id) {
170
+ $this->newAttachments[] = $id;
171
+ return $this;
172
+ }
173
+ /**
174
+ * Get instance.
175
+ *
176
+ * @return CountCache
177
+ */
178
+ public static function getInstance() {
179
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\attachment\CountCache()) : self::$me;
180
+ }
181
+ }
inc/attachment/CustomField.php ADDED
@@ -0,0 +1,216 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\view\Options;
6
+ use WP_Post;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * This class handles all hooks for the custom field in a attachments dialog.
13
+ */
14
+ class CustomField {
15
+ private static $me = null;
16
+ /**
17
+ * C'tor.
18
+ */
19
+ private function __construct() {
20
+ // Silence is golden.
21
+ }
22
+ /**
23
+ * When editing a attachment show up a select option to change the parent folder.
24
+ *
25
+ * @param array $form_fields
26
+ * @param WP_Post $post
27
+ * @return array
28
+ */
29
+ public function attachment_fields_to_edit($form_fields, $post) {
30
+ if (!wp_rml_active()) {
31
+ return $form_fields;
32
+ }
33
+ // Check if RML is active on frontend
34
+ if (!is_admin() && !\MatthiasWeb\RealMediaLibrary\view\Options::load_frontend()) {
35
+ return $form_fields;
36
+ }
37
+ $folderID = wp_attachment_folder($post->ID);
38
+ // Check move permission
39
+ $editable = \true;
40
+ if ($folderID > 0) {
41
+ $folder = wp_rml_get_object_by_id($folderID);
42
+ $editable = is_rml_folder($folder) && !$folder->isRestrictFor('mov');
43
+ }
44
+ $isShortcut = wp_attachment_is_shortcut($post->ID);
45
+ $textToMove = $isShortcut
46
+ ? __('If you move this shortcut, the location of the source/main file is not changed.', RML_TD)
47
+ : __(
48
+ 'If you move this attachment, the folder location of the associated shortcuts are not changed.',
49
+ RML_TD
50
+ );
51
+ /**
52
+ * This content is showed in the attachment details below the custom field dropdown.
53
+ *
54
+ * @param {string} $output HTML output
55
+ * @param {WP_Post} $post The attachment
56
+ * @param {boolean} $isShortcut If true the file is a shortcut
57
+ * @parma {array} $form_fields
58
+ * @return {string} The HTML output
59
+ * @since 4.0.7
60
+ * @hook RML/CustomField
61
+ */
62
+ $appendHTML = apply_filters('RML/CustomField', '', $post, $isShortcut, $form_fields);
63
+ $selector = wp_rml_selector([
64
+ 'selected' => $folderID,
65
+ 'name' => 'rmlFolder',
66
+ 'editable' => $editable,
67
+ 'disabled' => [RML_TYPE_COLLECTION],
68
+ 'name' => 'attachments[' . $post->ID . '][rml_folder]',
69
+ 'title' => __('Move to another folder', RML_TD)
70
+ ]);
71
+ // Create form field
72
+ $form_fields['rml_dir'] = [
73
+ 'label' => __('Folder', RML_TD),
74
+ 'input' => 'html',
75
+ 'html' =>
76
+ '<div class="rml-compat-preUploadUi">' .
77
+ $selector .
78
+ '</div><p class="description">' .
79
+ $textToMove .
80
+ '</p>' .
81
+ $appendHTML
82
+ ];
83
+ // Create form field
84
+ $form_fields['rml_shortcut'] = [
85
+ 'label' => '',
86
+ 'input' => 'html',
87
+ 'html' =>
88
+ '<div class="rml-wprfc" data-wprfc="shortcutInfo" data-id="' .
89
+ $post->ID .
90
+ '"></div><script>jQuery(function() { window.rml.hooks.call("wprfc"); });</script>'
91
+ ];
92
+ return $form_fields;
93
+ }
94
+ /**
95
+ * Get the HTML shortcut info container.
96
+ *
97
+ * @param int $postId The post id
98
+ * @return string
99
+ */
100
+ public function getShortcutInfoContainer($postId) {
101
+ $post = get_post($postId);
102
+ $output = '';
103
+ if ($post !== null) {
104
+ // Return output
105
+ $output =
106
+ '<div class="rml-shortcut-info-container" data-id="' .
107
+ $postId .
108
+ '">
109
+ <div style="clear:both;"></div>
110
+ <h2>' .
111
+ __('Shortcut infos', RML_TD) .
112
+ '</h2>';
113
+ $shortcut = wp_attachment_is_shortcut($post, \true);
114
+ $output .= '<p class="description">';
115
+ if ($shortcut > 0) {
116
+ $output .=
117
+ __(
118
+ 'This is a shortcut of a media library file. Shortcuts doesn\'t need any physical storage <strong>(0 kB)</strong>. If you want to change the file itself, you must do this in the original file (for example replace media file through a plugin).<br/>Note also that the fields in the shortcuts can be different to the original file, for example "Title", "Description" or "Caption".',
119
+ RML_TD
120
+ ) .
121
+ '
122
+ <a target="_blank" href="' .
123
+ admin_url('post.php?post=' . $shortcut . '&action=edit') .
124
+ '">Open original file.</a><br />';
125
+ }
126
+ $shortcuts = wp_attachment_get_shortcuts(wp_attachment_ensure_source_file($post->ID), \false, \true);
127
+ // Filter out own id
128
+ foreach ($shortcuts as $key => &$value) {
129
+ if (\intval($value['attachment']) === $post->ID) {
130
+ unset($shortcuts[$key]);
131
+ }
132
+ }
133
+ $shortcutsCnt = \count($shortcuts);
134
+ if ($shortcutsCnt > 0) {
135
+ $output .= \sprintf(
136
+ // translators:
137
+ _n(
138
+ 'For this file is %d shortcut available in the following folder:',
139
+ 'For this file are %d shortcuts available in the following folders:',
140
+ $shortcutsCnt,
141
+ RML_TD
142
+ ),
143
+ $shortcutsCnt
144
+ );
145
+ foreach ($shortcuts as $shortcut) {
146
+ $folderName =
147
+ $shortcut['folderId'] === '-1'
148
+ ? wp_rml_get_object_by_id(-1)->getName(\true)
149
+ : \htmlentities($shortcut['name']);
150
+ $output .= '<div>';
151
+ $output .=
152
+ $folderName .
153
+ ' (<a target="_blank" href="' .
154
+ admin_url('post.php?post=' . $shortcut['attachment'] . '&action=edit') .
155
+ '">Open shortcut file</a>)';
156
+ $output .= '</div>';
157
+ }
158
+ } elseif (!$shortcut) {
159
+ $output .= __(
160
+ 'This file has no associated shortcuts. You can create shortcuts by moving files per mouse and hold any key.',
161
+ RML_TD
162
+ );
163
+ }
164
+ $output .= '</p>';
165
+ /**
166
+ * This content is showed in the attachment details. It shows informations
167
+ * about the shortcut.
168
+ *
169
+ * @param {string} $output HTML output
170
+ * @param {WP_Post} $post The attachment
171
+ * @param {int} $shortcut If > 0 it is an attachment id (source)
172
+ * @return {string} The HTML output
173
+ * @hook RML/Shortcut/Info
174
+ */
175
+ apply_filters('RML/Shortcut/Info', $output, $post, $shortcut);
176
+ $output .= '</div>';
177
+ }
178
+ return $output;
179
+ }
180
+ /**
181
+ * When saving a attachment change the parent folder.
182
+ *
183
+ * @param WP_Post $post
184
+ * @param array $attachment
185
+ * @return WP_Post
186
+ */
187
+ public function attachment_fields_to_save($post, $attachment) {
188
+ if (isset($attachment['rml_folder']) && wp_rml_active()) {
189
+ $folder = wp_rml_get_object_by_id($attachment['rml_folder']);
190
+ $folderId = $folder === null ? _wp_rml_root() : $folder->getId();
191
+ // Get previous folder id
192
+ $currentFolderId = wp_attachment_folder($post['ID']);
193
+ if ($currentFolderId !== $folderId) {
194
+ $updateCount = [$currentFolderId, $folderId];
195
+ // Update to new folder id
196
+ $result = wp_rml_move($folderId, [$post['ID']]);
197
+ if (\is_array($result)) {
198
+ $post['errors']['rml_folder']['errors'][] = \implode(' ', $result);
199
+ }
200
+ // Reset the count of both folders manually because we do not use the wp_rml_move api method
201
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->resetCountCache($updateCount);
202
+ }
203
+ }
204
+ return $post;
205
+ }
206
+ /**
207
+ * Get instance.
208
+ *
209
+ * @return CustomField
210
+ */
211
+ public static function getInstance() {
212
+ return self::$me === null
213
+ ? (self::$me = new \MatthiasWeb\RealMediaLibrary\attachment\CustomField())
214
+ : self::$me;
215
+ }
216
+ }
inc/attachment/Filter.php ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Activator;
6
+ use MatthiasWeb\RealMediaLibrary\Assets;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ use MatthiasWeb\RealMediaLibrary\usersettings\DefaultFolder;
9
+ use WP_Post;
10
+ use WP_Query;
11
+ // @codeCoverageIgnoreStart
12
+ \defined('ABSPATH') or die('No script kiddies please!');
13
+ // Avoid direct file request
14
+ // @codeCoverageIgnoreEnd
15
+ /**
16
+ * This class handles all hooks for the general filters.
17
+ */
18
+ class Filter {
19
+ use UtilsProvider;
20
+ private static $me = null;
21
+ /**
22
+ * Get folders of attachments.
23
+ *
24
+ * @param int|int[] $attachmentId
25
+ * @param int $default
26
+ * @see wp_attachment_folder()
27
+ * @return int|int[]|null
28
+ */
29
+ public function getAttachmentFolder($attachmentId, $default = null) {
30
+ $isArray = \is_array($attachmentId);
31
+ $attachmentId = $isArray ? $attachmentId : [$attachmentId];
32
+ if (\count($attachmentId) > 0) {
33
+ global $wpdb;
34
+ $attachments_in = \implode(',', $attachmentId);
35
+ $table_name = $this->getTableName('posts');
36
+ // phpcs:disable WordPress.DB.PreparedSQL
37
+ $folders = $wpdb->get_col(
38
+ "SELECT DISTINCT(rmlposts.fid) FROM {$table_name} AS rmlposts WHERE rmlposts.attachment IN ({$attachments_in})"
39
+ );
40
+ // phpcs:enable WordPress.DB.PreparedSQL
41
+ if ($isArray) {
42
+ return $folders;
43
+ } else {
44
+ return (int) (isset($folders[0]) ? $folders[0] : ($default === null ? _wp_rml_root() : $default));
45
+ }
46
+ }
47
+ return $default;
48
+ }
49
+ /**
50
+ * Changes the SQL query like this way to JOIN the realmedialibrary_posts
51
+ * table and search for the given folder.
52
+ *
53
+ * @param array $clauses
54
+ * @param WP_Query $query
55
+ * @return array
56
+ */
57
+ public function posts_clauses($clauses, $query) {
58
+ global $wpdb;
59
+ if ($query->get('post_type') !== 'attachment') {
60
+ $query->set('use_rml_folder', \false);
61
+ return $clauses;
62
+ }
63
+ $table_name = $this->getTableName('posts');
64
+ $saveInCookie = $this->isQuerying() && !\headers_sent();
65
+ // Shortcut destinations
66
+ $fields = \trim($clauses['fields'], ',');
67
+ // Get folder
68
+ $folderId = isset($query->query_vars['parsed_rml_folder']) ? $query->query_vars['parsed_rml_folder'] : 0;
69
+ $includeChilds = isset($query->query_vars['rml_include_children'])
70
+ ? $query->query_vars['rml_include_children']
71
+ : \false;
72
+ $root = _wp_rml_root();
73
+ $cookieValue = $root;
74
+ // Save the last queried cookie for "New media" dropdown
75
+ /**
76
+ * Do a filter to restrict the RML posts clauses and apply an own clauses modifier.
77
+ * If you want to use your own implementation of posts_clauses you can add this code
78
+ * to to restrict the RML standard posts_clauses: <code>$clauses["_restrictRML"] = true;</code>
79
+ *
80
+ * @param {array} $clauses The list of clauses for the query
81
+ * @param {WP_Query} $query The WP_Query instance
82
+ * @param {int} $folderId The folder ID to query (0 = 'All files')
83
+ * @param {int} $root The root folder ID, see also {@link RML/RootParent}
84
+ * @return {array} $clauses
85
+ * @hook RML/Filter/PostsClauses
86
+ * @see https://developer.wordpress.org/reference/hooks/posts_clauses/
87
+ */
88
+ $clauses = apply_filters('RML/Filter/PostsClauses', $clauses, $query, $folderId, $root);
89
+ $builtIn = !isset($clauses['_restrictRML']);
90
+ if (!$builtIn) {
91
+ unset($clauses['_restrictRML']);
92
+ }
93
+ $query->set('use_rml_folder', $builtIn);
94
+ // Change fields
95
+ $fields = \trim($clauses['fields'], ',');
96
+ $clauses['fields'] =
97
+ $fields .
98
+ $wpdb->prepare(', IFNULL(rmlposts.fid, %d) AS fid, IFNULL(rmlposts.isShortcut, 0) AS isShortcut ', $root);
99
+ // Change join regarding the folder id
100
+ $clauses['join'] .= " LEFT JOIN {$table_name} AS rmlposts ON rmlposts.attachment = " . $wpdb->posts . '.ID ';
101
+ // Folder relevant data
102
+ if ($builtIn === \true) {
103
+ if ($folderId > 0 || $folderId === $root) {
104
+ if ($folderId > 0) {
105
+ // Allow recursive read
106
+ if ($includeChilds && wp_rml_all_children_sql_supported(\false, 'function')) {
107
+ $function_name = $wpdb->prefix . \MatthiasWeb\RealMediaLibrary\Activator::CHILD_UDF_NAME;
108
+ // phpcs:disable WordPress.DB.PreparedSQL
109
+ $clauses['join'] .= $wpdb->prepare(
110
+ ' AND FIND_IN_SET(rmlposts.fid, ' . $function_name . '(%d, false)) ',
111
+ $folderId
112
+ );
113
+ // phpcs:enable WordPress.DB.PreparedSQL
114
+ } else {
115
+ $clauses['join'] .= $wpdb->prepare(' AND rmlposts.fid = %d ', $folderId);
116
+ }
117
+ $clauses['where'] .= ' AND rmlposts.fid IS NOT NULL ';
118
+ } else {
119
+ $clauses['where'] .= $wpdb->prepare(' AND (rmlposts.fid IS NULL OR rmlposts.fid = %d) ', $root);
120
+ }
121
+ $cookieValue = $folderId;
122
+ } else {
123
+ $cookieValue = 0;
124
+ }
125
+ }
126
+ // Save cookie value
127
+ if ($saveInCookie && $builtIn) {
128
+ $this->lastQueriedFolder($cookieValue);
129
+ }
130
+ return $clauses;
131
+ }
132
+ /**
133
+ * Set or get the last queried folder.
134
+ *
135
+ * @param int $folder The folder id (0 is handled as "All files" folder)
136
+ * @return int
137
+ * @since 4.0.8 The data is now saved in user meta data instead of Cookie
138
+ */
139
+ public function lastQueriedFolder($folder = null) {
140
+ $key = 'rml_' . get_current_blog_id() . '_lastquery';
141
+ $userId = get_current_user_id();
142
+ $prevCookie = \intval(get_user_meta($userId, $key, \true));
143
+ if ($folder !== null) {
144
+ $folder = \intval($folder);
145
+ if ($folder !== $prevCookie) {
146
+ $prevCookie = $folder;
147
+ update_user_meta($userId, $key, $folder);
148
+ }
149
+ }
150
+ return $prevCookie === null ? _wp_rml_root() : $prevCookie;
151
+ }
152
+ /**
153
+ * Define a new query option.
154
+ *
155
+ * @param WP_Query $query
156
+ */
157
+ public function pre_get_posts($query) {
158
+ global $wp_current_filter;
159
+ if (\in_array('snax_map_meta_caps', $wp_current_filter, \true)) {
160
+ return;
161
+ }
162
+ $assets = $this->getCore()->getAssets();
163
+ $folder = $this->getFolder(
164
+ $query,
165
+ $assets->isScreenBase('upload') ||
166
+ $assets->isScreenBase(\MatthiasWeb\RealMediaLibrary\Assets::MLA_SCREEN_BASE)
167
+ );
168
+ $folder = isset($folder) ? $folder : 0;
169
+ $query->set('parsed_rml_folder', $folder);
170
+ }
171
+ /**
172
+ * Get folder from different sources (WP_Query, GET Query).
173
+ *
174
+ * @param WP_Query $query
175
+ * @param boolean $fromRequest
176
+ * @return int
177
+ */
178
+ public function getFolder($query, $fromRequest = \false) {
179
+ $id = null;
180
+ if ($query !== null && ($queryFolder = $query->get('rml_folder')) && isset($queryFolder)) {
181
+ // Query rml folder from query itself
182
+ $id = $queryFolder;
183
+ } elseif (wp_rml_active()) {
184
+ if ($fromRequest) {
185
+ if (isset($_REQUEST['rml_folder'])) {
186
+ // Query rml folder from list mode
187
+ $id = \intval($_REQUEST['rml_folder']);
188
+ } elseif (isset($_POST['query']['rml_folder'])) {
189
+ // Query rml folder from grid mode
190
+ $id = \intval($_POST['query']['rml_folder']);
191
+ } elseif (isset($_REQUEST['rmlFolder'])) {
192
+ // From upload
193
+ $id = \intval($_REQUEST['rmlFolder']);
194
+ } else {
195
+ return null;
196
+ }
197
+ }
198
+ } else {
199
+ return null;
200
+ }
201
+ // Resolve last queried folder
202
+ if ($id === \MatthiasWeb\RealMediaLibrary\usersettings\DefaultFolder::ID_LAST_QUERIED) {
203
+ $id = wp_rml_last_queried_folder();
204
+ }
205
+ return $id;
206
+ }
207
+ /**
208
+ * Modify AJAX request for query-attachments request.
209
+ *
210
+ * @param WP_Query $query
211
+ * @return WP_Query
212
+ */
213
+ public function ajax_query_attachments_args($query) {
214
+ $fid = $this->getFolder(null, \true);
215
+ if ($fid !== null) {
216
+ $query['rml_folder'] = $fid;
217
+ }
218
+ return $query;
219
+ }
220
+ /**
221
+ * Add the attachment ID to the count update when deleting it.
222
+ *
223
+ * @param int $postID
224
+ */
225
+ public function delete_attachment($postID) {
226
+ // Reset folder count
227
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->resetCountCacheOnWpDie(
228
+ wp_attachment_folder($postID)
229
+ );
230
+ // Delete row in posts table
231
+ global $wpdb;
232
+ $table_name = $this->getTableName('posts');
233
+ // phpcs:disable WordPress.DB.PreparedSQL
234
+ $sql = $wpdb->query($wpdb->prepare("DELETE FROM {$table_name} WHERE attachment = %d", $postID));
235
+ // phpcs:enable WordPress.DB.PreparedSQL
236
+ // Reindex folder
237
+ $folder = wp_rml_get_object_by_id(wp_attachment_folder($postID));
238
+ if (is_rml_folder($folder) && $this->isPro()) {
239
+ $folder->contentReindex();
240
+ }
241
+ }
242
+ /**
243
+ * Add a attribute to the ajax output. The attribute represents
244
+ * the folder order number if it is a gallery.
245
+ *
246
+ * @param array $response
247
+ * @param WP_Post $attachment
248
+ * @param mixed $meta
249
+ * @return array
250
+ */
251
+ public function wp_prepare_attachment_for_js($response, $attachment, $meta) {
252
+ // append attribute
253
+ $rFolderId = $this->getFolder(null, \true);
254
+ $attachmentFid = isset($attachment->fid) ? $attachment->fid : null;
255
+ $folderId = $attachmentFid !== null ? \intval($attachmentFid) : null;
256
+ $folderId = $folderId === null ? (!empty($rFolderId) ? $rFolderId : _wp_rml_root()) : $folderId;
257
+ $response['rmlFolderId'] = $folderId;
258
+ $response['rmlGalleryOrder'] = \intval($attachment->orderNr);
259
+ $response['rmlIsShortcut'] = $attachment->isShortcut > 0;
260
+ // Allow SVG images displayed in media library
261
+ if ($response['subtype'] === 'svg+xml') {
262
+ $response['sizes'] = ['full' => ['url' => $response['url']]];
263
+ }
264
+ // return
265
+ return $response;
266
+ }
267
+ /**
268
+ * Create a select option in list table of attachments.
269
+ */
270
+ public function restrict_manage_posts() {
271
+ $screen = get_current_screen();
272
+ if ($screen->id === 'upload') {
273
+ echo '<select name="rml_folder" id="filter-by-rml-folder" class="attachment-filters attachment-filters-rml">
274
+ ' .
275
+ \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()
276
+ ->getView()
277
+ ->dropdown(isset($_REQUEST['rml_folder']) ? $_REQUEST['rml_folder'] : '', []) .
278
+ '
279
+ </select>&nbsp;';
280
+ }
281
+ }
282
+ /**
283
+ * Check if the current request is a query request for attachments.
284
+ *
285
+ * @return boolean
286
+ */
287
+ public function isQuerying() {
288
+ $isGridMode =
289
+ is_admin() &&
290
+ \defined('DOING_AJAX') &&
291
+ \constant('DOING_AJAX') &&
292
+ isset($_REQUEST['action']) &&
293
+ $_REQUEST['action'] === 'query-attachments';
294
+ $assets = $this->getCore()->getAssets();
295
+ $isListMode = $assets->isScreenBase('upload');
296
+ $isMLAPage = $assets->isScreenBase(\MatthiasWeb\RealMediaLibrary\Assets::MLA_SCREEN_BASE);
297
+ return $isGridMode || $isListMode || $isMLAPage;
298
+ }
299
+ /**
300
+ * Get instance.
301
+ *
302
+ * @return Filter
303
+ */
304
+ public static function getInstance() {
305
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\attachment\Filter()) : self::$me;
306
+ }
307
+ }
inc/attachment/Permissions.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * Folders permission handling.
13
+ */
14
+ class Permissions {
15
+ use UtilsProvider;
16
+ private static $me = null;
17
+ const RESTRICTION_PARENT = 'par';
18
+ const RESTRICTION_REARRANGE = 'rea';
19
+ const RESTRICTION_CREATE = 'cre';
20
+ const RESTRICTION_INSERT = 'ins';
21
+ const RESTRICTION_RENAME = 'ren';
22
+ const RESTRICTION_DELETE = 'del';
23
+ const RESTRICTION_MOVE = 'mov';
24
+ const RESTRICTION_ALL = ['par', 'rea', 'cre', 'ins', 'ren', 'del', 'mov'];
25
+ /**
26
+ * Restrict to insert/upload new attachments, automatically moved to root if upload
27
+ * Restrict to move files outside of a folder.
28
+ *
29
+ * @param string[] $errors
30
+ * @param int $id
31
+ * @param IFolder $folder
32
+ * @return string[]
33
+ */
34
+ public static function insert($errors, $id, $folder) {
35
+ if (is_rml_folder($folder) && $folder->isRestrictFor('ins')) {
36
+ $errors[] = __('You are not allowed to insert files here.', RML_TD);
37
+ return $errors;
38
+ }
39
+ // Check if "mov" of current folder is allowed
40
+ $otherFolder = wp_attachment_folder($id);
41
+ if ($otherFolder !== '') {
42
+ $otherFolder = wp_rml_get_by_id($otherFolder, null, \true);
43
+ if (is_rml_folder($otherFolder) && $otherFolder->isRestrictFor('mov')) {
44
+ $errors[] = __('You are not allowed to move the file.', RML_TD);
45
+ }
46
+ }
47
+ return $errors;
48
+ }
49
+ /**
50
+ * Restrict to create new subfolders.
51
+ *
52
+ * @param string[] $errors
53
+ * @param string $name
54
+ * @param int $parent
55
+ * @param int $type
56
+ * @return string[]
57
+ */
58
+ public static function create($errors, $name, $parent, $type) {
59
+ $folder = wp_rml_get_by_id($parent, null, \true);
60
+ if (is_rml_folder($folder) && $folder->isRestrictFor('cre')) {
61
+ $errors[] = __('You are not allowed to create a subfolder here.', RML_TD);
62
+ }
63
+ return $errors;
64
+ }
65
+ /**
66
+ * Restrict to create new subfolders.
67
+ *
68
+ * @param string[] $errors
69
+ * @param int $id
70
+ * @param IFolder $folder
71
+ * @return string[]
72
+ */
73
+ public static function deleteFolder($errors, $id, $folder) {
74
+ if (is_rml_folder($folder) && $folder->isRestrictFor('del')) {
75
+ $errors[] = __('You are not allowed to delete this folder.', RML_TD);
76
+ }
77
+ return $errors;
78
+ }
79
+ /**
80
+ * Restrict to rename a folder.
81
+ *
82
+ * @param string[] $errors
83
+ * @param string $name
84
+ * @param IFolder $folder
85
+ * @return string[]
86
+ */
87
+ public static function setName($errors, $name, $folder) {
88
+ if (is_rml_folder($folder) && $folder->isRestrictFor('ren')) {
89
+ $errors[] = __('You are not allowed to rename this folder.', RML_TD);
90
+ }
91
+ return $errors;
92
+ }
93
+ /**
94
+ * Get instance.
95
+ *
96
+ * @return Permissions
97
+ */
98
+ public static function getInstance() {
99
+ return self::$me === null
100
+ ? (self::$me = new \MatthiasWeb\RealMediaLibrary\attachment\Permissions())
101
+ : self::$me;
102
+ }
103
+ }
inc/attachment/Shortcut.php ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use Exception;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * Handle the metadata and attached file for shortcuts.
13
+ */
14
+ class Shortcut {
15
+ use UtilsProvider;
16
+ private static $me = null;
17
+ /**
18
+ * Avoid recursive creation of shortcuts.
19
+ */
20
+ private $lockCreate = \false;
21
+ /**
22
+ * The last generated shortcut ids.
23
+ */
24
+ private $lastIds = \false;
25
+ /**
26
+ * C'tor.
27
+ */
28
+ private function __construct() {
29
+ // Silence is golden.
30
+ }
31
+ /**
32
+ * Creates a shortcut.
33
+ *
34
+ * @param int $postId
35
+ * @param int $fid
36
+ * @param boolean $isShortcut
37
+ * @return boolean
38
+ * @see wp_rml_create_shortcuts
39
+ * @see _wp_rml_synchronize_attachment
40
+ */
41
+ public function create($postId, $fid, $isShortcut = \false) {
42
+ global $wpdb;
43
+ // Is locked?
44
+ if ($this->lockCreate === \true) {
45
+ $this->lockCreate = \false;
46
+ return \false;
47
+ }
48
+ // Collect data
49
+ $table_name = $this->getTableName('posts');
50
+ $oldFolder = wp_attachment_folder($postId);
51
+ $isShortcut = $isShortcut ? 1 : 0;
52
+ $attachmentId = $postId;
53
+ // The id for the realmedialibrary_posts table
54
+ // Check if attachment exists
55
+ if (get_post_type($postId) !== 'attachment') {
56
+ return \false;
57
+ }
58
+ // Process
59
+ if ($isShortcut > 0) {
60
+ // Ensure, that we are working with the source file and not create a shortcut from a shortcut...
61
+ $postId = wp_attachment_ensure_source_file($postId);
62
+ // Prepare the new post
63
+ $wp_post = get_post($postId);
64
+ $new_post = [
65
+ 'guid' => $wp_post->guid . '?sc=' . $postId,
66
+ 'post_mime_type' => $wp_post->post_mime_type,
67
+ 'post_title' => $wp_post->post_title,
68
+ 'post_content' => '',
69
+ 'post_excerpt' => $wp_post->post_excerpt,
70
+ // Caption
71
+ 'post_content' => $wp_post->post_content,
72
+ // Description
73
+ 'post_status' => 'inherit'
74
+ ];
75
+ $attachedFile = get_attached_file($postId);
76
+ // Create new post
77
+ $this->lockCreate = \true;
78
+ try {
79
+ $scId = wp_insert_attachment($new_post, $attachedFile);
80
+ // Copy alt text if present
81
+ $altText = get_post_meta($postId, '_wp_attachment_image_alt', \true);
82
+ if (!empty($altText)) {
83
+ update_post_meta($scId, '_wp_attachment_image_alt', $altText);
84
+ }
85
+ $this->debug('Shortcut for ' . $postId . ' created in posts table with id ' . $scId, __METHOD__);
86
+ $this->lockCreate = \false;
87
+ } catch (\Exception $e) {
88
+ $this->lockCreate = \false;
89
+ return \false;
90
+ }
91
+ $attachmentId = $scId;
92
+ $this->lastIds[] = $attachmentId;
93
+ $isShortcut = $postId;
94
+ } else {
95
+ $isShortcut = wp_attachment_is_shortcut($postId, \true);
96
+ }
97
+ // Insert or update the new attachment relationship
98
+ // phpcs:disable WordPress.DB.PreparedSQL
99
+ $sql = $wpdb->prepare(
100
+ "INSERT INTO {$table_name} (`attachment`, `fid`, `isShortcut`)\n VALUES (%d, %d, %d) ON DUPLICATE KEY UPDATE fid=VALUES(fid), isShortcut=VALUES(isShortcut), nr=0, oldCustomNr=0",
101
+ $attachmentId,
102
+ $fid,
103
+ $isShortcut
104
+ );
105
+ $wpdb->query($sql);
106
+ // phpcs:enable WordPress.DB.PreparedSQL
107
+ /**
108
+ * An attachment is moved to a specific folder.
109
+ *
110
+ * @param {int} $postId The post id of the attachment
111
+ * @param {int} $oldFolder The old folder id of the attachment
112
+ * @param {int} $fid The new folder id of the attachment
113
+ * @param {boolean} $isShortcut If true the attachment was copied to a folder
114
+ * @hook RML/Item/Moved
115
+ */
116
+ do_action('RML/Item/Moved', $postId, $oldFolder, $fid, $isShortcut);
117
+ return \true;
118
+ }
119
+ /**
120
+ * Check if a meta key is inheritable.
121
+ *
122
+ * @param string $meta_key
123
+ * @param boolean $withAttached
124
+ * @return boolean
125
+ */
126
+ private function isInheritableMetaKey($meta_key, $withAttached = \true) {
127
+ return $meta_key === '_wp_attachment_metadata' ||
128
+ ($meta_key === '_wp_attached_file' && $withAttached) ||
129
+ $meta_key === '_wp_attachment_backup_sizes';
130
+ }
131
+ /**
132
+ * If it is a shortcut, read the metadata from the source file.
133
+ * It also handles the wp_delete_attachment process to avoid to delete
134
+ * the source files if shortcut.
135
+ *
136
+ * @param mixed $check
137
+ * @param int $object_id
138
+ * @param string $meta_key
139
+ * @param boolean $single
140
+ * @return mixed
141
+ */
142
+ public function get_post_metadata($check, $object_id, $meta_key, $single) {
143
+ if ($this->isInheritableMetaKey($meta_key) && ($source_id = wp_attachment_is_shortcut($object_id, \true))) {
144
+ // Check if we want to delete the attachment
145
+ // phpcs:disable
146
+ $backtrace = \debug_backtrace();
147
+ // phpcs:enable
148
+ foreach ($backtrace as $value) {
149
+ if ($value['function'] === 'wp_delete_attachment') {
150
+ $this->debug(
151
+ 'Tried to delete an attachment shortcut... Avoid to delete the physical files (' .
152
+ $meta_key .
153
+ ')',
154
+ __METHOD__
155
+ );
156
+ return $single ? '' : [[]];
157
+ }
158
+ }
159
+ // Return main file data
160
+ $meta = get_post_meta($source_id, $meta_key, $single);
161
+ return $single ? [$meta] : $meta;
162
+ }
163
+ return $check;
164
+ }
165
+ /**
166
+ * Avoids to generate own meta data for shortcuts.
167
+ *
168
+ * @param mixed $check
169
+ * @param int $object_id
170
+ * @param string $meta_key
171
+ * @param string $meta_value
172
+ * @param boolean $unique
173
+ * @return mixed
174
+ */
175
+ public function add_post_metadata($check, $object_id, $meta_key, $meta_value, $unique) {
176
+ if ($this->isInheritableMetaKey($meta_key) && ($source_id = wp_attachment_is_shortcut($object_id, \true))) {
177
+ $add = add_post_meta($source_id, $meta_key, $meta_value, $unique);
178
+ return \is_bool($add) ? $add : $add > 0;
179
+ }
180
+ return $check;
181
+ }
182
+ /**
183
+ * Avoids to generate own meta data for shortcuts.
184
+ *
185
+ * @param mixed $check
186
+ * @param int $object_id
187
+ * @param string $meta_key
188
+ * @param string $meta_value
189
+ * @param string $prev_value
190
+ * @return mixed
191
+ */
192
+ public function update_post_metadata($check, $object_id, $meta_key, $meta_value, $prev_value) {
193
+ if ($this->isInheritableMetaKey($meta_key) && ($source_id = wp_attachment_is_shortcut($object_id, \true))) {
194
+ $this->debug(
195
+ 'Probably the image gets regenerated, save the new metadata to the source file...',
196
+ __METHOD__
197
+ );
198
+ $update = update_post_meta($source_id, $meta_key, $meta_value, $prev_value);
199
+ return \is_bool($update) ? $update : $update > 0;
200
+ }
201
+ return $check;
202
+ }
203
+ /**
204
+ * Get last generated shortcut ids.
205
+ *
206
+ * @see wp_rml_created_shortcuts_last_ids()
207
+ * @return int[]
208
+ */
209
+ public function getLastIds() {
210
+ return \is_array($this->lastIds) ? $this->lastIds : ($this->lastIds = []);
211
+ }
212
+ /**
213
+ * Delete all associated shortcuts.
214
+ *
215
+ * @param int $postId
216
+ */
217
+ public function delete_attachment($postId) {
218
+ $shortcuts = wp_attachment_get_shortcuts($postId);
219
+ if (\count($shortcuts) > 0) {
220
+ $this->debug('Found shortcuts for this postid (' . $postId . '): ' . \json_encode($shortcuts), __METHOD__);
221
+ foreach ($shortcuts as $value) {
222
+ wp_delete_attachment($value, \true);
223
+ }
224
+ }
225
+ }
226
+ /**
227
+ * This function should only be used in the Creatable::insert() function.
228
+ */
229
+ public function _resetLastIds() {
230
+ $this->lastIds = [];
231
+ }
232
+ /**
233
+ * Get instance.
234
+ *
235
+ * @return Shortcut
236
+ */
237
+ public static function getInstance() {
238
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\attachment\Shortcut()) : self::$me;
239
+ }
240
+ }
inc/attachment/Structure.php ADDED
@@ -0,0 +1,396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IStructure;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\folder\CRUD;
8
+ use MatthiasWeb\RealMediaLibrary\folder\Root;
9
+ use MatthiasWeb\RealMediaLibrary\view\View;
10
+ // @codeCoverageIgnoreStart
11
+ \defined('ABSPATH') or die('No script kiddies please!');
12
+ // Avoid direct file request
13
+ // @codeCoverageIgnoreEnd
14
+ /**
15
+ * This class handles all hooks and functions for the structure.
16
+ * If something will print out, this is a facade-wrapper function
17
+ * for the class View (stored in private $view).
18
+ */
19
+ class Structure implements \MatthiasWeb\RealMediaLibrary\api\IStructure {
20
+ use UtilsProvider;
21
+ /**
22
+ * The structure should be accessible within one
23
+ * or more blogs. For those purposes use the wp standard
24
+ * method switch_to_blog();
25
+ *
26
+ * This is an array of Structure objects.
27
+ */
28
+ private static $blogs = [];
29
+ /**
30
+ * The root folder ID. Can only be set by the constructor!
31
+ */
32
+ private $root;
33
+ /**
34
+ * Array of database read rows
35
+ */
36
+ private $rows;
37
+ private $parsed;
38
+ private $tree;
39
+ /**
40
+ * The view handler for this structure
41
+ */
42
+ private $view;
43
+ /**
44
+ * Checks, if the folder tree is already loaded and do the initial
45
+ * load if needed by an function. So, RML can guarantee lazy loading.
46
+ */
47
+ private $hasInitialLoad = \false;
48
+ /**
49
+ * Additional data passed to the structure.
50
+ */
51
+ private $data;
52
+ // Documented in IStructure
53
+ public function __construct($root = null, $data = null) {
54
+ $this->view = new \MatthiasWeb\RealMediaLibrary\view\View($this);
55
+ $this->data = $data === null ? [] : $data;
56
+ $this->resetData($root, \false);
57
+ }
58
+ // Documented in IStructure
59
+ public function initialLoad() {
60
+ if (!$this->hasInitialLoad) {
61
+ $this->hasInitialLoad = \true;
62
+ $this->resetData($this->root);
63
+ }
64
+ }
65
+ // Documented in IStructure
66
+ public function resetData($root = null, $fetchData = \true) {
67
+ $this->root = $root === null ? _wp_rml_root() : $root;
68
+ $this->rows = [];
69
+ $this->parsed = [];
70
+ $this->tree = [];
71
+ if ($fetchData) {
72
+ $this->fetch();
73
+ } else {
74
+ $this->hasInitialLoad = \false;
75
+ }
76
+ }
77
+ /**
78
+ * Fetching all available folders into an array.
79
+ */
80
+ private function fetch() {
81
+ global $wpdb;
82
+ $table_name = $this->getTableName();
83
+ /**
84
+ * Modify the tree SQL select fields statement. Just push your
85
+ * fields to select custom fields.
86
+ *
87
+ * @param {array} $fields The standard RML fields
88
+ * @param {IStructure} $structure The structure
89
+ * @hook RML/Tree/SQLStatement/SELECT
90
+ * @return {array}
91
+ */
92
+ $fields = \join(
93
+ ', ',
94
+ apply_filters(
95
+ 'RML/Tree/SQLStatement/SELECT',
96
+ [
97
+ // The whole row of the folder
98
+ 'tn.*',
99
+ // Count images for this folder
100
+ 'IFNULL(tn.cnt, (' .
101
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->getSingleCountSql() .
102
+ ')) AS cnt_result',
103
+ 'rml_meta_orderby.meta_value AS lastOrderBy',
104
+ 'rml_meta_orderAutomatically.meta_value AS orderAutomatically',
105
+ 'rml_meta_lastSubOrderBy.meta_value AS lastSubOrderBy',
106
+ 'rml_meta_subOrderAutomatically.meta_value AS subOrderAutomatically'
107
+ ],
108
+ $this
109
+ )
110
+ );
111
+ /**
112
+ * Modify the tree SQL select join statement. Just push your
113
+ * joins to $fields array.
114
+ *
115
+ * @param {array} $fields The standard RML fields
116
+ * @param {IStructure} $structure The structure
117
+ * @hook RML/Tree/SQLStatement/JOIN
118
+ * @return {array} $fields
119
+ */
120
+ $joins = \join(
121
+ ' ',
122
+ apply_filters(
123
+ 'RML/Tree/SQLStatement/JOIN',
124
+ [
125
+ // The last order by, saved in folder meta as "orderby"
126
+ 'LEFT JOIN ' .
127
+ $this->getTableName('meta') .
128
+ " rml_meta_orderby ON rml_meta_orderby.realmedialibrary_id = tn.ID AND rml_meta_orderby.meta_key = 'orderby'",
129
+ // Determines, if the orderby should be applied automatically, saved in folder meta as "orderAutomatically"
130
+ 'LEFT JOIN ' .
131
+ $this->getTableName('meta') .
132
+ " rml_meta_orderAutomatically ON rml_meta_orderAutomatically.realmedialibrary_id = tn.ID AND rml_meta_orderAutomatically.meta_key = 'orderAutomatically'",
133
+ // The last subfolder order by, saved in folder meta as "lastSubOrderBy"
134
+ 'LEFT JOIN ' .
135
+ $this->getTableName('meta') .
136
+ " rml_meta_lastSubOrderBy ON rml_meta_lastSubOrderBy.realmedialibrary_id = tn.ID AND rml_meta_lastSubOrderBy.meta_key = 'lastSubOrderBy'",
137
+ // Determines, if the sbufolder orderby should be applied automatically, saved in folder meta as "subOrderAutomatically"
138
+ 'LEFT JOIN ' .
139
+ $this->getTableName('meta') .
140
+ " rml_meta_subOrderAutomatically ON rml_meta_subOrderAutomatically.realmedialibrary_id = tn.ID AND rml_meta_subOrderAutomatically.meta_key = 'subOrderAutomatically'"
141
+ ],
142
+ $this
143
+ )
144
+ );
145
+ /**
146
+ * Add WHERE statement to modify parts of the tree SQL statement.
147
+ *
148
+ * @param {string} $sql The sql query
149
+ * @param {IStructure} $structure The structure
150
+ * @hook RML/Tree/SQLStatement/WHERE
151
+ * @return {string}
152
+ * @since 4.0.8
153
+ */
154
+ $where = apply_filters('RML/Tree/SQLStatement/WHERE', '', $this);
155
+ /**
156
+ * Modify the full tree SQL statement.
157
+ *
158
+ * @param {string} $sql The sql query
159
+ * @param {IStructure} $structure The structure
160
+ * @hook RML/Tree/SQLStatement
161
+ * @return {string}
162
+ */
163
+ $sqlStatement = apply_filters(
164
+ 'RML/Tree/SQLStatement',
165
+ ["SELECT {$fields} FROM {$table_name} AS tn {$joins} {$where} ORDER BY parent, ord"],
166
+ $this
167
+ );
168
+ // phpcs:disable WordPress.DB.PreparedSQL
169
+ $this->rows = $wpdb->get_results($sqlStatement[0]);
170
+ // phpcs:enable WordPress.DB.PreparedSQL
171
+ /**
172
+ * The tree content is loaded.
173
+ *
174
+ * @param {object[]} $rows The SQL results
175
+ * @param {IStructure} $structure The structure
176
+ * @hook RML/Tree/SQLRows
177
+ * @return {object[]}
178
+ */
179
+ $this->rows = apply_filters('RML/Tree/SQLRows', $this->rows, $this);
180
+ $this->parse();
181
+ }
182
+ /**
183
+ * This functions parses the read rows into folder objects.
184
+ * It also handles the `cnt` cache for the attachments in this folder.
185
+ */
186
+ private function parse() {
187
+ /**
188
+ * Use this hook to register your own creatables with the help of
189
+ * wp_rml_register_creatable().
190
+ *
191
+ * @hook RML/Creatable/Register
192
+ */
193
+ do_action('RML/Creatable/Register');
194
+ if (!empty($this->rows)) {
195
+ $noCntCache = \false;
196
+ foreach ($this->rows as $key => $value) {
197
+ // Check for image cache
198
+ if (\is_null($value->cnt)) {
199
+ $noCntCache = \true;
200
+ }
201
+ // Prepare the data types
202
+ $this->rows[$key]->id = \intval($value->id);
203
+ $this->rows[$key]->parent = \intval($value->parent);
204
+ $this->rows[$key]->ord = \intval($value->ord);
205
+ $this->rows[$key]->cnt_result = \intval($value->cnt_result);
206
+ // Craetable instance
207
+ $creatable = \MatthiasWeb\RealMediaLibrary\folder\CRUD::getInstance()->getCreatables($value->type);
208
+ if (isset($creatable)) {
209
+ $result = \call_user_func_array([$creatable, 'instance'], [$value]);
210
+ if (is_rml_folder($result)) {
211
+ $this->parsed[] = $result;
212
+ }
213
+ }
214
+ }
215
+ if ($noCntCache) {
216
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->updateCountCache();
217
+ }
218
+ }
219
+ /**
220
+ * Here you can modify the fresh-created instances of an IFolder object. This allows you,
221
+ * e. g. hide folders on frontend with `setVisible`.
222
+ *
223
+ * @param {IFolder[]} $parsed
224
+ * @hook RML/Tree/Parsed
225
+ * @return IFolder[]
226
+ * @since 4.8.1
227
+ */
228
+ $this->parsed = apply_filters('RML/Tree/Parsed', $this->parsed);
229
+ // Create the tree
230
+ $folder = null;
231
+ foreach ($this->parsed as $key => $category) {
232
+ $parent = $category->getParent();
233
+ if ($parent > -1) {
234
+ $folder = $this->byId($parent);
235
+ if ($folder !== null) {
236
+ $folder->addChildren($category);
237
+ }
238
+ }
239
+ }
240
+ $cats_tree = [];
241
+ foreach ($this->parsed as $category) {
242
+ if ($category->getParent() <= -1) {
243
+ $cats_tree[] = $category;
244
+ }
245
+ }
246
+ $this->tree = $cats_tree;
247
+ }
248
+ // Documented in IStructure
249
+ public function byId($id, $nullForRoot = \true) {
250
+ $id = \intval($id);
251
+ if (!$nullForRoot && $id === -1) {
252
+ return \MatthiasWeb\RealMediaLibrary\folder\Root::getInstance();
253
+ }
254
+ foreach ($this->getParsed() as $folder) {
255
+ if ($folder->getId() === $id) {
256
+ return $folder;
257
+ }
258
+ }
259
+ /**
260
+ * When a folder is not found by an absolute path this filter is
261
+ * called and looks up for folders which are perhaps handled by other
262
+ * structures. If you are hooking into this function please consider that
263
+ * you apply_filters for RML/Tree/Parsed manually.
264
+ *
265
+ * @param {IFolder} $folder The folder (null if not found)
266
+ * @param {integer} $id The searched Id
267
+ * @param {IStructure} $structure The structure
268
+ * @hook RML/Tree/ResolveById
269
+ * @return {IFolder} The found folder or null if not found
270
+ * @since 3.3.1
271
+ */
272
+ return apply_filters('RML/Tree/ResolveById', null, $id, $this);
273
+ }
274
+ // Documented in IStructure
275
+ public function byAbsolutePath($path) {
276
+ $path = \trim($path, '/');
277
+ foreach ($this->getParsed() as $folder) {
278
+ if (\strtolower($folder->getAbsolutePath()) === \strtolower($path)) {
279
+ return $folder;
280
+ }
281
+ }
282
+ /**
283
+ * When a folder is not found by an absolute path this filter is
284
+ * called and looks up for folders which are perhaps handled by other
285
+ * structures. If you are hooking into this function please consider that
286
+ * you apply_filters for RML/Tree/Parsed manually.
287
+ *
288
+ * @param {IFolder} $folder The folder (null if not found)
289
+ * @param {string} $path The searched path
290
+ * @param {IStructure} $structure The structure
291
+ * @hook RML/Tree/ResolveByAbsolutePath
292
+ * @return {IFolder} The found folder or null if not found
293
+ * @since 3.3.1
294
+ */
295
+ return apply_filters('RML/Tree/ResolveByAbsolutePath', null, $path, $this);
296
+ }
297
+ // Documented in IStructure
298
+ public function getRows() {
299
+ $this->initialLoad();
300
+ return $this->rows;
301
+ }
302
+ // Documented in IStructure
303
+ public function getParsed() {
304
+ $this->initialLoad();
305
+ return $this->parsed;
306
+ }
307
+ // Documented in IStructure
308
+ public function getTree() {
309
+ $this->initialLoad();
310
+ return $this->tree;
311
+ }
312
+ // Documented in IStructure
313
+ public function getPlainTree() {
314
+ $result = [];
315
+ $tree = $this->getTree();
316
+ if (\is_array($tree)) {
317
+ foreach ($tree as $obj) {
318
+ $plain = $obj->getPlain(\true);
319
+ if ($plain !== null) {
320
+ $result[] = $plain;
321
+ }
322
+ }
323
+ }
324
+ return $result;
325
+ }
326
+ // Documented in IStructure
327
+ public function getCntAttachments() {
328
+ if (has_filter('RML/Tree/CountAttachments')) {
329
+ /**
330
+ * Counts all attachments which are available in the structure.
331
+ *
332
+ * @param {integer} $count The count
333
+ * @param {object} $structure The structure class
334
+ * @return {integer} The count
335
+ * @hook RML/Tree/CountAttachments
336
+ */
337
+ return apply_filters('RML/Tree/CountAttachments', 0, $this);
338
+ }
339
+ return (int) wp_count_posts('attachment')->inherit;
340
+ }
341
+ /**
342
+ * Get all folder counts.
343
+ *
344
+ * @return Array<string|int,int>
345
+ */
346
+ public function getFolderCounts() {
347
+ $result = [];
348
+ // Default folder counts
349
+ $root = _wp_rml_root();
350
+ $result['all'] = $this->getCntAttachments();
351
+ $result[$root] = $this->getCntRoot();
352
+ // Iterate through our folders
353
+ $folders = $this->getParsed();
354
+ if (\is_array($folders)) {
355
+ foreach ($folders as $value) {
356
+ $id = $value->getId();
357
+ $result[$id] = $value->getCnt();
358
+ }
359
+ }
360
+ return $result;
361
+ }
362
+ // Documented in IStructure
363
+ public function getCntRoot() {
364
+ $cnt = 0;
365
+ foreach ($this->getParsed() as $folder) {
366
+ $cnt += $folder->getCnt();
367
+ }
368
+ $result = $this->getCntAttachments() - $cnt;
369
+ return $result >= 0 ? $result : 0;
370
+ }
371
+ /**
372
+ * Get the view class instance.
373
+ */
374
+ public function getView() {
375
+ return $this->view;
376
+ }
377
+ // Documented in IStructure
378
+ public function getData() {
379
+ return $this->data;
380
+ }
381
+ // Documented in IStructure
382
+ public function setData($data) {
383
+ $this->data = \is_array($data) ? $data : [];
384
+ }
385
+ /**
386
+ * Get instance.
387
+ *
388
+ * @return Structure
389
+ */
390
+ public static function getInstance() {
391
+ $bid = get_current_blog_id();
392
+ return !isset(self::$blogs[$bid])
393
+ ? (self::$blogs[$bid] = new \MatthiasWeb\RealMediaLibrary\attachment\Structure())
394
+ : self::$blogs[$bid];
395
+ }
396
+ }
inc/attachment/Upload.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\attachment;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
7
+ use MatthiasWeb\RealMediaLibrary\usersettings\DefaultFolder;
8
+ use MatthiasWeb\RealMediaLibrary\view\Options;
9
+ // @codeCoverageIgnoreStart
10
+ \defined('ABSPATH') or die('No script kiddies please!');
11
+ // Avoid direct file request
12
+ // @codeCoverageIgnoreEnd
13
+ /**
14
+ * Handling uploader, so files can be uploaded directly to a folder.
15
+ */
16
+ class Upload {
17
+ use UtilsProvider;
18
+ private static $me = null;
19
+ /**
20
+ * C'tor.
21
+ */
22
+ private function __construct() {
23
+ // Silence is golden.
24
+ }
25
+ /**
26
+ * Handles the upload to move an attachment directly to a given folder.
27
+ *
28
+ * @param int $postID
29
+ */
30
+ public function add_attachment($postID) {
31
+ $folder = $this->getFolderFromRequest();
32
+ if ($folder !== null) {
33
+ wp_rml_move($folder, [$postID]);
34
+ } else {
35
+ _wp_rml_synchronize_attachment($postID, _wp_rml_root());
36
+ }
37
+ }
38
+ /**
39
+ * Get the folder id from the current page request.
40
+ */
41
+ public function getFolderFromRequest() {
42
+ $rmlFolder = isset($_REQUEST['rmlFolder']) ? $_REQUEST['rmlFolder'] : null;
43
+ // Recursively creating folders is only allowed in PRO version as in Lite version there are no subfolders supported
44
+ $allowRecursively = $this->isPro();
45
+ // Do not allow recursively creation of folders for non-folder types
46
+ if ($rmlFolder !== null && $allowRecursively) {
47
+ $folder = wp_rml_get_object_by_id($rmlFolder);
48
+ $allowRecursively =
49
+ $folder === null
50
+ ? $allowRecursively
51
+ : \in_array($folder->getType(), [RML_TYPE_FOLDER, RML_TYPE_ROOT], \true);
52
+ }
53
+ // Check if relative path is given an create folders
54
+ $rmlCreateFolder = isset($_REQUEST['rmlCreateFolder']) ? $_REQUEST['rmlCreateFolder'] : null;
55
+ if ($rmlCreateFolder !== null && $allowRecursively) {
56
+ // Create folder recursively
57
+ $rmlFolder = $rmlFolder === null ? _wp_rml_root() : $rmlFolder;
58
+ try {
59
+ $created = wp_rml_create_p(\dirname($rmlCreateFolder), $rmlFolder, RML_TYPE_FOLDER);
60
+ if (!\is_array($created)) {
61
+ $rmlFolder = $created;
62
+ }
63
+ } catch (\MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException $e) {
64
+ // Silence is golden.
65
+ }
66
+ }
67
+ return $rmlFolder;
68
+ }
69
+ /**
70
+ * The grid view and post editor upload can be modified through the left
71
+ * tree view to upload files directly.
72
+ */
73
+ public function pre_upload_ui() {
74
+ global $pagenow;
75
+ if (wp_rml_active()) {
76
+ if (!is_admin() && !\MatthiasWeb\RealMediaLibrary\view\Options::load_frontend()) {
77
+ return;
78
+ }
79
+ // Get the options depending on the current page
80
+ $options = [
81
+ 'name' => 'rmlFolder',
82
+ 'disabled' => [RML_TYPE_COLLECTION],
83
+ 'title' => __('Select destination folder', RML_TD)
84
+ ];
85
+ $defaultFolder = \MatthiasWeb\RealMediaLibrary\usersettings\DefaultFolder::getDefaultFolder();
86
+ if (!empty($defaultFolder)) {
87
+ $options['selected'] = $defaultFolder;
88
+ }
89
+ if (isset($_GET['rml_preselect'])) {
90
+ $options['selected'] = $_GET['rml_preselect'];
91
+ }
92
+ if ($pagenow === 'media-new.php') {
93
+ $label = __(
94
+ 'You can simply upload files directly to a folder. Select a folder and upload files.',
95
+ RML_TD
96
+ );
97
+ } else {
98
+ $label = __('upload to folder', RML_TD);
99
+ }
100
+ echo '<p class="attachments-filter-upload-chooser">' .
101
+ $label .
102
+ '</p><p>' .
103
+ wp_rml_selector($options) .
104
+ '</p>';
105
+ }
106
+ }
107
+ /**
108
+ * Get instance.
109
+ *
110
+ * @return Upload
111
+ */
112
+ public static function getInstance() {
113
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\attachment\Upload()) : self::$me;
114
+ }
115
+ }
inc/attachment/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/base/Core.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\base;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Core as UtilsCore;
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ /**
9
+ * Base class for the applications Core class.
10
+ */
11
+ abstract class Core {
12
+ use UtilsProvider;
13
+ use UtilsCore;
14
+ /**
15
+ * The constructor handles the core startup mechanism.
16
+ *
17
+ * The constructor is protected because a factory method should only create
18
+ * a Core object.
19
+ *
20
+ * @codeCoverageIgnore
21
+ */
22
+ protected function __construct() {
23
+ // Define lazy constants
24
+ \define('RML_TD', $this->getPluginData('TextDomain'));
25
+ \define('RML_VERSION', $this->getPluginData('Version'));
26
+ $this->construct();
27
+ }
28
+ }
inc/base/UtilsProvider.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\base;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\FreemiumProvider;
6
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\Base;
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ /**
10
+ * To make the composer package in packages/utils work we need to
11
+ * make the constant variables be passed to the High-Order class.
12
+ *
13
+ * Put this trait in all your classes! Note also not to use the
14
+ * below methods by your plugin, instead use direct access to the constant.
15
+ * It just is for composer packages which needs to access dynamically the plugin!
16
+ */
17
+ trait UtilsProvider {
18
+ use Base;
19
+ use FreemiumProvider;
20
+ /**
21
+ * Get the prefix of this plugin so composer packages can dynamically
22
+ * build other constant values on it.
23
+ *
24
+ * @return string
25
+ * @codeCoverageIgnore It only returns a string with the constant prefix
26
+ */
27
+ public function getPluginConstantPrefix() {
28
+ return 'RML';
29
+ }
30
+ }
inc/base/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/base/others/cachebuster-lib.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* This file was automatically generated (Wed Nov 24 2021 13:37:54 GMT+0000 (Coordinated Universal Time)). */
3
+ return [
4
+ 'es6-shim' => '0.35.6',
5
+ 'es7-shim' => '6.0.0',
6
+ 'i18n-react' => '0.7.0',
7
+ 'mobx' => '4.15.7',
8
+ 'mobx-state-tree' => '3.17.3',
9
+ 'react' => '16.14.0',
10
+ 'react-aiot' => '1.6.0',
11
+ 'react-dom' => '16.14.0',
12
+ 'wp-media-picker' => '0.7.2'
13
+ ];
inc/base/others/cachebuster.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* This file was automatically generated (Wed Nov 24 2021 13:37:54 GMT+0000 (Coordinated Universal Time)). */
3
+ return [
4
+ 'src/public/dist/rml_gutenberg.lite.js' => '3d37a223a96263169ae2b80a657401a6',
5
+ 'src/public/dist/rml_gutenberg.pro.js' => '092861083b3d0f93be211d69a05f4ecd',
6
+ 'src/public/dist/rml_shortcode.lite.js' => 'ac9b5017d28809a9b30c828ee021b698',
7
+ 'src/public/dist/rml_shortcode.pro.js' => 'e5b64b988d0333c152334a6da4a01250',
8
+ 'src/public/dist/rml.lite.js' => '1c21c240efd0a65219a8fbf2c6ff7c51',
9
+ 'src/public/dist/rml.pro.js' => '4ecff31d14b2fb7404724b18fe30a914',
10
+ 'src/public/dist/rml.css' => '05d076d905bea4538f0f202b133e37dc',
11
+ 'src/public/dev/rml_gutenberg.lite.js' => '07fac2e50535773b07abd4e2692e1b62',
12
+ 'src/public/dev/rml_gutenberg.pro.js' => '8c2d861688bc4a3afe36da71fbc54eaa',
13
+ 'src/public/dev/rml_shortcode.lite.js' => 'ccd9a5da4806d632b926d279f19511ae',
14
+ 'src/public/dev/rml_shortcode.pro.js' => '1f11b9b94cf166c5b00ed172763c4d1e',
15
+ 'src/public/dev/rml.lite.js' => '545807c0e0596b53015f545723c19efe',
16
+ 'src/public/dev/rml.pro.js' => '030aff0e08b6319ef677db8ee0460e96',
17
+ 'src/public/dev/rml.css' => 'ddb67605720a19b266f9ba14f2f2be38'
18
+ ];
inc/base/others/class-alias.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Backward-compatible class aliases.
4
+ */
5
+
6
+ use MatthiasWeb\RealMediaLibrary\Activator;
7
+ use MatthiasWeb\RealMediaLibrary\Assets;
8
+ use MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException;
9
+ use MatthiasWeb\RealMediaLibrary\folder\QueryCount;
10
+ use MatthiasWeb\RealMediaLibrary\Localization;
11
+ use MatthiasWeb\RealMediaLibrary\Util;
12
+ use MatthiasWeb\RealMediaLibrary\view\FolderShortcode;
13
+ use MatthiasWeb\RealMediaLibrary\view\Gutenberg;
14
+ use MatthiasWeb\RealMediaLibrary\view\Lang;
15
+ use MatthiasWeb\RealMediaLibrary\view\Options;
16
+ use MatthiasWeb\RealMediaLibrary\view\View;
17
+
18
+ // v4.5.4 -> v4.6.0, see #3jm006
19
+ class_alias(FolderAlreadyExistsException::class, RML_NS . '\\general\\FolderAlreadyExistsException');
20
+ class_alias(QueryCount::class, RML_NS . '\\general\\QueryCount');
21
+ class_alias(Activator::class, RML_NS . '\\general\\Activator');
22
+ class_alias(Assets::class, RML_NS . '\\general\\Assets');
23
+ class_alias(Localization::class, RML_NS . '\\general\\Localization');
24
+ class_alias(Util::class, RML_NS . '\\general\\Util');
25
+ class_alias(Options::class, RML_NS . '\\general\\Options');
26
+ class_alias(FolderShortcode::class, RML_NS . '\\general\\FolderShortcode');
27
+ class_alias(Gutenberg::class, RML_NS . '\\general\\Gutenberg');
28
+ class_alias(View::class, RML_NS . '\\general\\View');
29
+ class_alias(Lang::class, RML_NS . '\\general\\Lang');
inc/base/others/fallback-already.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') or die('No script kiddies please!'); // Avoid direct file request
3
+
4
+ if (!function_exists('rml_skip_already_admin_notice')) {
5
+ /**
6
+ * Show an admin notice to administrators when the plugin is already active.
7
+ */
8
+ function rml_skip_already_admin_notice() {
9
+ if (current_user_can('activate_plugins')) {
10
+ echo '<div class=\'notice notice-error\'>
11
+ <p>Currently multiple versions of the plugin <strong>Real Media Library</strong> are active. Please deactivate all versions except the one you want to use.</p>' .
12
+ '</div>';
13
+ }
14
+ }
15
+ }
16
+ add_action('admin_notices', 'rml_skip_already_admin_notice');
17
+
18
+ if (!function_exists('rml_skip_already_deactivate_lite')) {
19
+ /**
20
+ * Automatically deactivate Lite version when we try to activate the PRO version.
21
+ */
22
+ function rml_skip_already_deactivate_lite() {
23
+ // Avoid doing this in local stack as we do not have pro and lite difference in slug
24
+ if (defined('DEVOWL_WP_DEV') && constant('DEVOWL_WP_DEV') && $_SERVER['SERVER_PORT'] === strval(10000)) {
25
+ return;
26
+ }
27
+
28
+ deactivate_plugins(RML_SLUG_LITE . '/index.php');
29
+ }
30
+ }
31
+ register_activation_hook(
32
+ constant('WP_PLUGIN_DIR') . DIRECTORY_SEPARATOR . RML_SLUG_PRO . DIRECTORY_SEPARATOR . 'index.php',
33
+ 'rml_skip_already_deactivate_lite'
34
+ );
inc/base/others/fallback-php-version.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') or die('No script kiddies please!'); // Avoid direct file request
3
+
4
+ if (!function_exists('rml_skip_php_admin_notice')) {
5
+ /**
6
+ * Show an admin notice to administrators when the minimum PHP version
7
+ * could not be reached. The error message is only in english available.
8
+ */
9
+ function rml_skip_php_admin_notice() {
10
+ if (current_user_can('activate_plugins')) {
11
+ $data = get_plugin_data(RML_FILE, true, false);
12
+ echo '<div class=\'notice notice-error\'>
13
+ <p><strong>' .
14
+ $data['Name'] .
15
+ '</strong> could not be initialized because you need minimum PHP version ' .
16
+ RML_MIN_PHP .
17
+ ' ... you are running: ' .
18
+ phpversion() .
19
+ '.
20
+ </div>';
21
+ }
22
+ }
23
+ }
24
+ add_action('admin_notices', 'rml_skip_php_admin_notice');
inc/base/others/fallback-rest-api.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') or die('No script kiddies please!'); // Avoid direct file request
3
+
4
+ if (!function_exists('rml_skip_rest_admin_notice')) {
5
+ /**
6
+ * Show an admin notice to administrators when the minimum WP version
7
+ * could not be reached. The error message is only in english available.
8
+ */
9
+ function rml_skip_rest_admin_notice() {
10
+ if (current_user_can('activate_plugins')) {
11
+ $data = get_plugin_data(RML_FILE, true, false);
12
+ global $wp_version;
13
+ echo '<div class=\'notice notice-error\'>
14
+ <p><strong>' .
15
+ $data['Name'] .
16
+ '</strong> could not be initialized because you are running WordPress < 4.7 (' .
17
+ $wp_version .
18
+ '). If WordPress < 4.7 the plugin needs another plugin <strong>WordPress REST API (Version 2)</strong> to provide needed functionality.
19
+ <a href="' .
20
+ admin_url('plugin-install.php?s=WordPress+REST+API+(Version+2)&tab=search&type=term') .
21
+ '">Show in plugin finder</a> or
22
+ <a href="' .
23
+ admin_url('plugin-install.php?tab=plugin-information&plugin=rest-api&TB_iframe=true') .
24
+ '">install plugin directly</a>.
25
+ </div>';
26
+ }
27
+ }
28
+ }
29
+ add_action('admin_notices', 'rml_skip_rest_admin_notice');
inc/base/others/fallback-wp-version.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined('ABSPATH') or die('No script kiddies please!'); // Avoid direct file request
3
+
4
+ if (!function_exists('rml_skip_wp_admin_notice')) {
5
+ /**
6
+ * Show an admin notice to administrators when the minimum WP version
7
+ * could not be reached. The error message is only in english available.
8
+ */
9
+ function rml_skip_wp_admin_notice() {
10
+ if (current_user_can('activate_plugins')) {
11
+ $data = get_plugin_data(RML_FILE, true, false);
12
+ global $wp_version;
13
+ echo '<div class=\'notice notice-error\'>
14
+ <p><strong>' .
15
+ $data['Name'] .
16
+ '</strong> could not be initialized because you need minimum WordPress version ' .
17
+ RML_MIN_WP .
18
+ ' ... you are running: ' .
19
+ $wp_version .
20
+ '.
21
+ <a href="' .
22
+ admin_url('update-core.php') .
23
+ '">Update WordPress now.</a>
24
+ </div>';
25
+ }
26
+ }
27
+ }
28
+ add_action('admin_notices', 'rml_skip_wp_admin_notice');
inc/base/others/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
inc/base/others/start.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // We have now ensured that we are running the minimum PHP version.
6
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\Autoloader;
7
+ use MatthiasWeb\RealMediaLibrary\Core;
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // Check minimum WordPress version
11
+ global $wp_version;
12
+ if (\version_compare($wp_version, \RML_MIN_WP, '>=')) {
13
+ $load_core = \false;
14
+ // Check minimum WordPress REST API
15
+ if (\version_compare($wp_version, '4.7.0', '>=')) {
16
+ $load_core = \true;
17
+ } else {
18
+ // Check WP REST API plugin is active
19
+ require_once \ABSPATH . 'wp-admin/includes/plugin.php';
20
+ $load_core = \is_plugin_active('rest-api/plugin.php');
21
+ }
22
+ // Load core
23
+ if ($load_core) {
24
+ // Composer autoload with prioritized PHP Scoper autoload
25
+ $composer_autoload_path = \path_join(\RML_PATH, 'vendor/autoload.php');
26
+ $composer_scoper_autoload_path = \path_join(\RML_PATH, 'vendor/scoper-autoload.php');
27
+ if (\file_exists($composer_scoper_autoload_path)) {
28
+ require_once $composer_scoper_autoload_path;
29
+ } elseif (\file_exists($composer_autoload_path)) {
30
+ require_once $composer_autoload_path;
31
+ }
32
+ new \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\Autoloader('RML');
33
+ \MatthiasWeb\RealMediaLibrary\Core::getInstance();
34
+ } else {
35
+ // WP REST API version not reached
36
+ require_once \RML_INC . 'base/others/fallback-rest-api.php';
37
+ }
38
+ } else {
39
+ // Min WP version not reached
40
+ require_once \RML_INC . 'base/others/fallback-wp-version.php';
41
+ }
inc/comp/ExImport.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\lite\comp\ExImport as CompExImport;
7
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\comp\IOverrideExImport;
8
+ use MatthiasWeb\RealMediaLibrary\Util;
9
+ use MatthiasWeb\RealMediaLibrary\view\Options;
10
+ use MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\ExpireOption;
11
+ // @codeCoverageIgnoreStart
12
+ \defined('ABSPATH') or die('No script kiddies please!');
13
+ // Avoid direct file request
14
+ // @codeCoverageIgnoreEnd
15
+ /**
16
+ * Import and export functionality.
17
+ */
18
+ class ExImport implements \MatthiasWeb\RealMediaLibrary\overrides\interfce\comp\IOverrideExImport {
19
+ use UtilsProvider;
20
+ use CompExImport;
21
+ private static $me = null;
22
+ private $idOffset = null;
23
+ const IMPORT_TAX_MATRIX = [
24
+ 'nt_wmc_folder' => 'FileBird',
25
+ 'filebase_folder' => 'FileBase',
26
+ 'media_folder' => 'Folders',
27
+ 'attachment_category' => 'Media Library Assistant',
28
+ 'media_category' => 'Enhanced Media Library',
29
+ 'mlo-category' => 'Media Library Organizer',
30
+ 'mediamatic_wpfolder' => 'Mediamatic Lite',
31
+ 'wpmf-category' => 'Media Library Folders',
32
+ 'rl_media_folder' => 'Responsive Lightbox & Gallery'
33
+ ];
34
+ const IMPORT_TAX_IGNORE = ['language'];
35
+ /**
36
+ * "Media Library Folders" uses `wp_posts` to store available folders.
37
+ *
38
+ * @see https://de.wordpress.org/plugins/media-library-plus/
39
+ */
40
+ const MLF_POST_TYPE = 'mgmlp_media_folder';
41
+ /**
42
+ * "Filebird" uses also an own database table system for media relationship.
43
+ */
44
+ const FILE_BIRD_TABLE_NAME = 'fbv';
45
+ const FILE_BIRD_TABLE_NAME_POSTS = 'fbv_attachment_folder';
46
+ /**
47
+ * Column names for import and export.
48
+ */
49
+ private $columns = [];
50
+ /**
51
+ * C'tor.
52
+ */
53
+ private function __construct() {
54
+ $this->columns = \explode(',', 'name,ord,type,restrictions,contentCustomOrder,importId');
55
+ }
56
+ /**
57
+ * Register options in media settings.
58
+ */
59
+ public function options_register() {
60
+ add_settings_section(
61
+ 'rml_options_import',
62
+ __('RealMediaLibrary:Import / Export'),
63
+ [\MatthiasWeb\RealMediaLibrary\view\Options::getInstance(), 'empty_callback'],
64
+ 'media'
65
+ );
66
+ add_settings_field(
67
+ 'rml_button_import_cats',
68
+ '<label for="rml_button_import_cats">' . __('Import from other plugins', RML_TD) . '</label>',
69
+ [$this, 'html_rml_button_import_cats'],
70
+ 'media',
71
+ 'rml_options_import'
72
+ );
73
+ add_settings_field(
74
+ 'rml_button_export',
75
+ '<label for="rml_button_export">' . __('Export / Import Real Media Library folders', RML_TD) . '</label>',
76
+ [$this, 'html_rml_button_export'],
77
+ 'media',
78
+ 'rml_options_import'
79
+ );
80
+ }
81
+ /**
82
+ * Output export button in options.
83
+ */
84
+ public function html_rml_button_export() {
85
+ $disabled = $this->isPro() ? '' : 'disabled="disabled"';
86
+ echo '<a class="rml-rest-button button button-primary" data-url="export" data-method="GET">' .
87
+ __('Export', RML_TD) .
88
+ '</a>
89
+ <a class="rml-rest-button button" data-url="import" data-method="POST" ' .
90
+ $disabled .
91
+ '>' .
92
+ __('Import', RML_TD) .
93
+ '</a>
94
+ <p class="description" style="margin-bottom:10px">' .
95
+ __(
96
+ 'All available folders will be exported. The current structure is not lost during import - but check that there are no duplicate names in the import data, as these are not checked.',
97
+ RML_TD
98
+ ) .
99
+ '</p>
100
+ <div id="rml_export_data" style="float:left;margin-right: 10px;"><div>' .
101
+ __('Exported data:', RML_TD) .
102
+ '</div><textarea></textarea></div>
103
+ <div id="rml_import_data" style="float:left;"><div>' .
104
+ __('Import data:', RML_TD) .
105
+ '</div><textarea ' .
106
+ $disabled .
107
+ '></textarea></div><div class="clear"></div>';
108
+ if (!$this->isPro()) {
109
+ echo '<p class="description"><strong>' .
110
+ __('Importing data is only available in PRO version.', RML_TD) .
111
+ ' <a href="' .
112
+ (RML_PRO_VERSION . '&feature=import-export') .
113
+ '" target="_blank">' .
114
+ __('Learn more about PRO', RML_TD) .
115
+ '</a></strong></p>';
116
+ }
117
+ }
118
+ /**
119
+ * Output import button in options.
120
+ */
121
+ public function html_rml_button_import_cats() {
122
+ $hasMediaLibraryFolders = $this->hasMediaLibraryFolders();
123
+ $hasFileBird = $this->hasFileBird();
124
+ if (\count($this->getHierarchicalTaxos()) || $hasMediaLibraryFolders || $hasFileBird) {
125
+ $disabled = $this->isPro() ? '' : 'disabled="disabled"';
126
+ foreach ($this->getHierarchicalTaxos() as $tax) {
127
+ $name = isset(self::IMPORT_TAX_MATRIX[$tax])
128
+ ? self::IMPORT_TAX_MATRIX[$tax]
129
+ : '<code>' . $tax . '</code>';
130
+ echo '<a class="rml-rest-button button" data-url="import/taxonomy" data-method="POST" data-taxonomy="' .
131
+ esc_attr($tax) .
132
+ '" ' .
133
+ $disabled .
134
+ '>' .
135
+ __('Import', RML_TD) .
136
+ ' (' .
137
+ $name .
138
+ ')</a>&nbsp;';
139
+ }
140
+ // Media Library Folders plugin
141
+ if ($hasMediaLibraryFolders) {
142
+ echo '<a class="rml-rest-button button" data-url="import/mlf" data-method="POST" ' .
143
+ $disabled .
144
+ '>' .
145
+ __('Import', RML_TD) .
146
+ ' (Media Library Folders)</a>&nbsp;';
147
+ }
148
+ // Filebird plugin
149
+ if ($hasFileBird) {
150
+ echo '<a class="rml-rest-button button" data-url="import/filebird" data-method="POST" ' .
151
+ $disabled .
152
+ '>' .
153
+ __('Import', RML_TD) .
154
+ ' (FileBird)</a>&nbsp;';
155
+ }
156
+ echo '<p class="description">' . __('Imports categories and post relations.', RML_TD) . '</p>';
157
+ } else {
158
+ echo '<p>' . __('Nothing to import.', RML_TD) . '</p>';
159
+ }
160
+ if (!$this->isPro()) {
161
+ echo '<p class="description"><strong>' .
162
+ __('Importing categories from another plugin is only available in PRO version.', RML_TD) .
163
+ ' <a href="' .
164
+ (RML_PRO_VERSION . '&feature=import-export') .
165
+ '" target="_blank">' .
166
+ __('Learn more about PRO', RML_TD) .
167
+ '</a></strong></p>';
168
+ }
169
+ }
170
+ /**
171
+ * Get the folder tree for import process.
172
+ *
173
+ * @return array
174
+ */
175
+ public function getFolders() {
176
+ global $wpdb;
177
+ // phpcs:disable WordPress.DB.PreparedSQL
178
+ // Folders
179
+ $table_name = $this->getTableName();
180
+ $folders = $wpdb->get_results(
181
+ 'SELECT id,parent,' . \implode(',', $this->columns) . " FROM {$table_name}",
182
+ ARRAY_A
183
+ );
184
+ // Metas
185
+ $table_name = $this->getTableName('meta');
186
+ $metas = \MatthiasWeb\RealMediaLibrary\Util::getInstance()->group_by(
187
+ $wpdb->get_results("SELECT * FROM {$table_name}", ARRAY_A),
188
+ 'realmedialibrary_id'
189
+ );
190
+ // phpcs:enable WordPress.DB.PreparedSQL
191
+ // Group metas
192
+ $grouped = [];
193
+ foreach ($folders as $folder) {
194
+ // Assign metas
195
+ if (isset($metas[$folder['id']])) {
196
+ $folder['__metas'] = [];
197
+ foreach ($metas[$folder['id']] as $meta) {
198
+ unset($meta['meta_id']);
199
+ unset($meta['realmedialibrary_id']);
200
+ $folder['__metas'][] = $meta;
201
+ }
202
+ }
203
+ $grouped[] = $folder;
204
+ }
205
+ // Cast
206
+ foreach ($grouped as &$row) {
207
+ $row['parent'] = \intval($row['parent']);
208
+ $row['id'] = \intval($row['id']);
209
+ }
210
+ // Create tree
211
+ $tree = \MatthiasWeb\RealMediaLibrary\Util::getInstance()->buildTree(
212
+ $grouped,
213
+ -1,
214
+ 'parent',
215
+ 'id',
216
+ '__children'
217
+ );
218
+ return \MatthiasWeb\RealMediaLibrary\Util::getInstance()->clearTree($tree, ['id', 'parent'], '__children');
219
+ }
220
+ /**
221
+ * Get the hierarchical taxonomies for the media taxonomy. It also
222
+ * returns taxonomies which are no longer registered
223
+ *
224
+ * @return string[]
225
+ */
226
+ public function getHierarchicalTaxos() {
227
+ global $wpdb;
228
+ // Fetch the taxonomies which are able to filter
229
+ $taxonomy_objects = get_object_taxonomies('attachment', 'objects');
230
+ $taxos = [];
231
+ foreach ($taxonomy_objects as $key => $value) {
232
+ if ($value->hierarchical === \true) {
233
+ $taxos[] = $key;
234
+ }
235
+ }
236
+ // Read non-active ones
237
+ // phpcs:disable WordPress.DB.PreparedSQL
238
+ $taxonomy_sql = $wpdb->get_col(
239
+ "SELECT DISTINCT(wptt.taxonomy) FROM {$wpdb->term_taxonomy} AS wptt\n INNER JOIN {$wpdb->term_relationships} AS wptr ON wptt.term_taxonomy_id = wptr.term_taxonomy_id\n INNER JOIN {$wpdb->posts} AS wpp ON wptr.object_id = wpp.ID\n WHERE wpp.post_type = 'attachment'"
240
+ );
241
+ // phpcs:enable WordPress.DB.PreparedSQL
242
+ return \array_diff(\array_unique(\array_merge($taxonomy_sql, $taxos)), self::IMPORT_TAX_IGNORE);
243
+ }
244
+ /**
245
+ * Checks if the import notice in folder tree sidebar is dismissed.
246
+ *
247
+ * @param boolean $set
248
+ * @return boolean
249
+ */
250
+ public function isImportTaxNoticeDismissed($set = null) {
251
+ $value = '1';
252
+ $expireOption = new \MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\ExpireOption(
253
+ RML_OPT_PREFIX . '_importTaxNotice',
254
+ \false,
255
+ 365 * \constant('DAY_IN_SECONDS')
256
+ );
257
+ $expireOption->enableTransientMigration(
258
+ \MatthiasWeb\RealMediaLibrary\Vendor\MatthiasWeb\Utils\ExpireOption::TRANSIENT_MIGRATION_SITE_WIDE
259
+ );
260
+ if ($set !== null) {
261
+ $expireOption->set($set ? $value : 0);
262
+ }
263
+ return $expireOption->get() === $value;
264
+ }
265
+ /**
266
+ * Checks if "Media Library Folders" was used previously.
267
+ *
268
+ * @see https://de.wordpress.org/plugins/media-library-plus/
269
+ */
270
+ public function hasMediaLibraryFolders() {
271
+ global $wpdb;
272
+ return \intval(
273
+ $wpdb->get_var(
274
+ $wpdb->prepare("SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type=%s", self::MLF_POST_TYPE)
275
+ )
276
+ ) > 0;
277
+ }
278
+ /**
279
+ * Checks if "Filebird" was used previously.
280
+ */
281
+ public function hasFileBird() {
282
+ global $wpdb;
283
+ // Check if table exists and create it
284
+ // phpcs:disable WordPress.DB.PreparedSQL
285
+ $table_name = $wpdb->prefix . self::FILE_BIRD_TABLE_NAME_POSTS;
286
+ $exists = \strcasecmp($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'"), $table_name);
287
+ // phpcs:enable WordPress.DB.PreparedSQL
288
+ return 0 === $exists;
289
+ }
290
+ /**
291
+ * Get instance.
292
+ *
293
+ * @return ExImport
294
+ */
295
+ public static function getInstance() {
296
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\comp\ExImport()) : self::$me;
297
+ }
298
+ }
inc/comp/ExportMediaLibrary.php ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp;
4
+
5
+ use MassEdge\WordPress\Plugin\ExportMediaLibrary\API as ExportMediaLibraryAPI;
6
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ use MatthiasWeb\RealMediaLibrary\rest\Service;
9
+ use WP_Error;
10
+ use WP_Query;
11
+ use WP_REST_Request;
12
+ use WP_REST_Response;
13
+ // @codeCoverageIgnoreStart
14
+ \defined('ABSPATH') or die('No script kiddies please!');
15
+ // Avoid direct file request
16
+ // @codeCoverageIgnoreEnd
17
+ /**
18
+ * Resolve filenames by a set of attachment ids.
19
+ */
20
+ class HierarchicalFilenameResolver {
21
+ private $folders = null;
22
+ private $rootFolder = null;
23
+ /**
24
+ * C'tor.
25
+ *
26
+ * @param IFolder $rootFolder
27
+ */
28
+ public function __construct($rootFolder) {
29
+ $this->rootFolder = $rootFolder;
30
+ }
31
+ /**
32
+ * Exclude the main folder from the attachment path because the exported
33
+ * zip already starts with the exported name as first-level folder.
34
+ *
35
+ * @param IFolder $folder
36
+ * @return boolean
37
+ */
38
+ public function excludeRoot($folder) {
39
+ return $folder->getId() !== $this->rootFolder->getId();
40
+ }
41
+ /**
42
+ * Resolve the filename to RML specific folder.
43
+ *
44
+ * @param string $file
45
+ * @param array $attachment
46
+ * @param int[] $attachmentIds
47
+ * @return string
48
+ */
49
+ public function resolve($file, $attachment, $attachmentIds) {
50
+ $attachmentPath = $file['path'];
51
+ $attachmentId = $attachment['attachment_id'];
52
+ // Read folders of all exported attachment files (performance should be good because it's only performed once)
53
+ if ($this->folders === null) {
54
+ // Get attachment -> folder mapping with a simple SQL
55
+ global $wpdb;
56
+ $attachments_in = \implode(',', $attachmentIds);
57
+ // We do not need to escape because it is the result of WP_Query
58
+ $table_name = $wpdb->prefix . 'realmedialibrary_posts';
59
+ // phpcs:disable WordPress.DB.PreparedSQL
60
+ $folders = $wpdb->get_results(
61
+ "SELECT rmlposts.attachment, rmlposts.fid FROM {$table_name} AS rmlposts WHERE rmlposts.attachment IN ({$attachments_in})"
62
+ );
63
+ // phpcs:enable WordPress.DB.PreparedSQL
64
+ // Only get the pathes of the folders
65
+ $this->folders = [];
66
+ foreach ($folders as $row) {
67
+ $id = (int) $row->attachment;
68
+ $this->folders[$id] = \trim(wp_rml_get_object_by_id($row->fid)->getPath('/'), '/\\');
69
+ }
70
+ }
71
+ $path = $this->folders[$attachmentId];
72
+ $basename = \basename($file['name']);
73
+ $path = empty($path) ? $basename : path_join($path, $basename);
74
+ $file['name'] = $path;
75
+ return $file;
76
+ }
77
+ }
78
+ /**
79
+ * This class handles the compatibility for this plugin:
80
+ * https://wordpress.org/plugins/export-media-library/
81
+ *
82
+ * @see https://github.com/massedge/wordpress-plugin-export-media-library/issues/9
83
+ * @since 4.5.0
84
+ */
85
+ class ExportMediaLibrary {
86
+ use UtilsProvider;
87
+ const AJAX_ACTION = 'massedge-wp-plugin-eml-ape-rml-download';
88
+ /**
89
+ * C'tor.
90
+ */
91
+ public function __construct() {
92
+ add_action('rest_api_init', [$this, 'rest_api_init']);
93
+ add_filter('RML/Localize', [$this, 'localize']);
94
+ }
95
+ /**
96
+ * Register REST API endpoints.
97
+ */
98
+ public function rest_api_init() {
99
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/massedge/export', [
100
+ 'methods' => 'GET',
101
+ 'callback' => [$this, 'export'],
102
+ 'permission_callback' => [$this, 'permission_callback'],
103
+ 'args' => [
104
+ 'type' => ['required' => \true, 'type' => 'string'],
105
+ 'folder' => ['required' => \true, 'type' => 'integer']
106
+ ]
107
+ ]);
108
+ }
109
+ /**
110
+ * Check if user is allowed to call this service requests.
111
+ */
112
+ public function permission_callback() {
113
+ $permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit();
114
+ return $permit === null ? \true : $permit;
115
+ }
116
+ /**
117
+ * See API docs.
118
+ *
119
+ * @param WP_REST_Request $request
120
+ * @return WP_REST_Response|WP_Error
121
+ *
122
+ * @api {get} /realmedialibrary/v1/massedge/export Export folder as zip
123
+ * @apiHeader {string} X-WP-Nonce
124
+ * @apiName GetExportFolder
125
+ * @apiParam {string='wosFlat','wosHierarchical','wsFlat','wsHierarchicalRML','wsHierarchical'} type The export type
126
+ * @apiParam {int} folder The folder id
127
+ * @apiGroup ThirdParty
128
+ * @apiVersion 1.0.0
129
+ * @apiPermission upload_media
130
+ */
131
+ public function export($request) {
132
+ global $wpdb;
133
+ $type = $request->get_param('type');
134
+ $folder = wp_rml_get_object_by_id($request->get_param('folder'));
135
+ if (!is_rml_folder($folder)) {
136
+ return new \WP_Error('rest_rml_massedge_export', __('No valid folder.'), ['status' => 500]);
137
+ }
138
+ $filename = sanitize_file_name($folder->getName());
139
+ $id = $folder->getId();
140
+ // Get options
141
+ $options = \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::defaultExportOptions();
142
+ $options = \array_merge($options, ['filename' => $filename . '.zip']);
143
+ $options['query_args'] = \array_merge($options['query_args'], ['rml_folder' => $id]);
144
+ // Prepare options for each type
145
+ switch ($type) {
146
+ // Without subfolders
147
+ case 'wosFlat':
148
+ $options = \array_merge($options, [
149
+ 'folder_structure' => \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::FOLDER_STRUCTURE_FLAT
150
+ ]);
151
+ break;
152
+ case 'wosHierarchical':
153
+ $options = \array_merge($options, [
154
+ 'folder_structure' => \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::FOLDER_STRUCTURE_NESTED
155
+ ]);
156
+ break;
157
+ // With subfolders
158
+ case 'wsFlat':
159
+ $options = \array_merge($options, [
160
+ 'folder_structure' => \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::FOLDER_STRUCTURE_FLAT
161
+ ]);
162
+ $options['query_args'] = \array_merge($options['query_args'], ['rml_include_children' => \true]);
163
+ break;
164
+ case 'wsHierarchicalRML':
165
+ $resolver = new \MatthiasWeb\RealMediaLibrary\comp\HierarchicalFilenameResolver($folder);
166
+ $options['query_args'] = \array_merge($options['query_args'], ['rml_include_children' => \true]);
167
+ // Double read the attachment ids, see GitHub issue
168
+ $query = new \WP_Query();
169
+ $attachmentIds = $query->query($options['query_args']);
170
+ $options = \array_merge($options, [
171
+ 'folder_structure' => \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::FOLDER_STRUCTURE_NESTED,
172
+ 'add_attachment_callback' => function ($file, $attachment) use ($resolver, $attachmentIds) {
173
+ return $resolver->resolve($file, $attachment, $attachmentIds);
174
+ }
175
+ ]);
176
+ break;
177
+ case 'wsHierarchical':
178
+ $options = \array_merge($options, [
179
+ 'folder_structure' => \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::FOLDER_STRUCTURE_NESTED
180
+ ]);
181
+ $options['query_args'] = \array_merge($options['query_args'], ['rml_include_children' => \true]);
182
+ break;
183
+ default:
184
+ return new \WP_Error('rest_rml_massedge_export', __('No valid type.'), ['status' => 500]);
185
+ }
186
+ // Export the file
187
+ \MassEdge\WordPress\Plugin\ExportMediaLibrary\API::export($options);
188
+ $wpdb->close();
189
+ exit();
190
+ }
191
+ /**
192
+ * Add a localized nonce to the rmlOpts variable for AJAX interaction (admin-ajax.php).
193
+ *
194
+ * @param array $arr
195
+ * @return array
196
+ */
197
+ public function localize($arr) {
198
+ return \array_merge($arr, ['massedge_wp_export' => \true]);
199
+ }
200
+ }
inc/comp/PageBuilders.php ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\view\Options;
7
+ use WP_Post;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * This class handles the compatibility for general page builders. If a page builder
14
+ * has more compatibility options, please see / create another compatibility class.
15
+ */
16
+ class PageBuilders {
17
+ use UtilsProvider;
18
+ private static $me = null;
19
+ /**
20
+ * C'tor.
21
+ */
22
+ private function __construct() {
23
+ // Silence is golden.
24
+ }
25
+ /**
26
+ * Initialize the page builder handlers.
27
+ */
28
+ public function init() {
29
+ $load_frontend = \MatthiasWeb\RealMediaLibrary\view\Options::load_frontend();
30
+ /* if (class_exists('Tatsu_Builder')) {
31
+ // Temporary removed cause Tatsu needs to update to React v16
32
+ $this->oshine_tatsu_builder();
33
+ } */
34
+ if (\defined('ELEMENTOR_VERSION')) {
35
+ $this->elementor();
36
+ }
37
+ if (\class_exists('Cornerstone_Preview_Frame_Loader') && $load_frontend) {
38
+ $this->cornerstone();
39
+ }
40
+ if (\class_exists('Tailor')) {
41
+ $this->tailor();
42
+ }
43
+ if (\defined('TVE_IN_ARCHITECT') || \class_exists('Thrive_Quiz_Builder')) {
44
+ $this->thrive_architect();
45
+ }
46
+ if (\class_exists('FLBuilder')) {
47
+ $this->bbuilder();
48
+ }
49
+ if (
50
+ \class_exists('Fusion_App') &&
51
+ \function_exists('Fusion_App') &&
52
+ \method_exists(Fusion_App(), 'get_builder_status')
53
+ ) {
54
+ $this->fusionBuilderLive();
55
+ }
56
+ if (\class_exists('ET_Builder_Element')) {
57
+ $this->diviBuilder();
58
+ }
59
+ }
60
+ /**
61
+ * Divi Page Builder
62
+ *
63
+ * @see https://www.elegantthemes.com/gallery/divi/
64
+ */
65
+ private function diviBuilder() {
66
+ add_filter('RML/Scripts/Skip', [$this, 'diviBuilder_skip'], 10, 2);
67
+ add_filter('et_fb_bundle_dependencies', [$this, 'et_fb_bundle_dependencies']);
68
+ add_action('et_fb_enqueue_assets', [$this, 'et_fb_enqueue_assets']);
69
+ }
70
+ /**
71
+ * Divi Page Builder.
72
+ *
73
+ * @param array $deps
74
+ * @return array
75
+ */
76
+ public function et_fb_bundle_dependencies($deps) {
77
+ // Remove react and react-dom from boot.js so it is also loaded in window.top.
78
+ if (($key = \array_search('react', $deps, \true)) !== \false) {
79
+ unset($deps[$key]);
80
+ }
81
+ if (($key = \array_search('react-dom', $deps, \true)) !== \false) {
82
+ unset($deps[$key]);
83
+ }
84
+ return $deps;
85
+ }
86
+ /**
87
+ * Divi Page Builder.
88
+ */
89
+ public function et_fb_enqueue_assets() {
90
+ $this->getCore()
91
+ ->getAssets()
92
+ ->enqueue_scripts_and_styles('et_fb_enqueue_assets');
93
+ }
94
+ /**
95
+ * Divi Page Builder.
96
+ *
97
+ * @param boolean $skip
98
+ * @param string $type
99
+ * @return string
100
+ */
101
+ public function diviBuilder_skip($skip, $type) {
102
+ if ($type === 'et_fb_enqueue_assets') {
103
+ return $skip;
104
+ }
105
+ if (et_core_is_fb_enabled() || (isset($_GET['et_pb_preview']) && $_GET['et_pb_preview'] === 'true')) {
106
+ return \true;
107
+ }
108
+ return $skip;
109
+ }
110
+ /**
111
+ * Fusion Builder Live (Avada)
112
+ *
113
+ * @see https://themeforest.net/item/avada-responsive-multipurpose-theme/2833226
114
+ */
115
+ private function fusionBuilderLive() {
116
+ $is_builder = Fusion_App()->get_builder_status();
117
+ if ($is_builder) {
118
+ add_filter('RML/Scripts/Skip', [$this, 'fusionBuilderLive_skip'], 10, 2);
119
+ add_action('wp_enqueue_scripts', [$this, 'fusionBuilderLive_enqueue_scripts'], 100);
120
+ }
121
+ }
122
+ /**
123
+ * Fusion Builder Live (Avada)
124
+ *
125
+ * @param boolean $skip
126
+ * @param string $type
127
+ * @return boolean
128
+ */
129
+ public function fusionBuilderLive_skip($skip, $type) {
130
+ return $type === 'fusion_builder_live' ? $skip : \true;
131
+ }
132
+ /**
133
+ * Fusion Builder Live (Avada)
134
+ *
135
+ * @param string $type
136
+ */
137
+ public function fusionBuilderLive_enqueue_scripts($type) {
138
+ $this->getCore()
139
+ ->getAssets()
140
+ ->enqueue_scripts_and_styles('fusion_builder_live');
141
+ }
142
+ /**
143
+ * Beaver Builder.
144
+ *
145
+ * @see https://www.wpbeaverbuilder.com/
146
+ */
147
+ private function bbuilder() {
148
+ add_action('fl_before_sortable_enqueue', [$this, 'fl_before_sortable_enqueue']);
149
+ add_filter('fl_builder_responsive_ignore', [$this, 'fl_builder_responsive_ignore']);
150
+ }
151
+ /**
152
+ * Beaver Builder.
153
+ */
154
+ public function fl_before_sortable_enqueue() {
155
+ $this->getCore()
156
+ ->getAssets()
157
+ ->admin_enqueue_scripts('fl_before_sortable_enqueue');
158
+ /* class-fl-builder.php#enqueue_ui_styles_scripts: We have a custom version of sortable that fixes a bug. */
159
+ wp_deregister_script('jquery-ui-sortable');
160
+ }
161
+ /**
162
+ * Show media library sidebar also in responsive settings for mobile.
163
+ *
164
+ * @param string[] $ignore
165
+ */
166
+ public function fl_builder_responsive_ignore($ignore) {
167
+ $ignore[] = RML_SLUG_LITE;
168
+ $ignore[] = RML_SLUG_PRO;
169
+ return \array_unique($ignore);
170
+ }
171
+ /**
172
+ * Tailor page builder.
173
+ *
174
+ * @see https://de.wordpress.org/plugins/tailor/
175
+ */
176
+ private function tailor() {
177
+ add_action('tailor_enqueue_sidebar_scripts', [$this->getCore()->getAssets(), 'admin_enqueue_scripts']);
178
+ }
179
+ /**
180
+ * Cornerstone.
181
+ *
182
+ * @see https://codecanyon.net/item/cornerstone-the-wordpress-page-builder/15518868
183
+ */
184
+ private function cornerstone() {
185
+ add_filter('print_head_scripts', [$this, 'cornerstone_print_head_scripts'], 0);
186
+ }
187
+ /**
188
+ * Cornerstone.
189
+ *
190
+ * @param mixed $res
191
+ * @return mixed
192
+ */
193
+ public function cornerstone_print_head_scripts($res) {
194
+ $this->getCore()
195
+ ->getAssets()
196
+ ->admin_enqueue_scripts('cornerstone_print_head_scripts');
197
+ return $res;
198
+ }
199
+ /**
200
+ * Elementor.
201
+ *
202
+ * @see https://elementor.com/
203
+ */
204
+ private function elementor() {
205
+ add_action('elementor/editor/before_enqueue_scripts', [$this->getCore()->getAssets(), 'admin_enqueue_scripts']);
206
+ }
207
+ /**
208
+ * OSHINE TATSU PAGE BUILDER.
209
+ *
210
+ * @see https://themeforest.net/item/oshine-creative-multipurpose-wordpress-theme/9545812
211
+ */
212
+ private function oshine_tatsu_builder() {
213
+ add_action('tatsu_builder_head', [$this->getCore()->getAssets(), 'admin_enqueue_scripts']);
214
+ }
215
+ /**
216
+ * Thrive Architect
217
+ *
218
+ * @see https://thrivethemes.com
219
+ */
220
+ private function thrive_architect() {
221
+ add_action('tcb_main_frame_enqueue', [$this->getCore()->getAssets(), 'admin_enqueue_scripts']);
222
+ add_filter('tge_filter_edit_post', [$this, 'tge_filter_edit_post']);
223
+ }
224
+ /**
225
+ * The Thrive Quiz Builder does not allow to enqueue custom scripts so I use the
226
+ * tge_filter_edit_post filter as workaround.
227
+ *
228
+ * @param WP_Post $post
229
+ * @return WP_Post
230
+ */
231
+ public function tge_filter_edit_post($post) {
232
+ $this->getCore()
233
+ ->getAssets()
234
+ ->admin_enqueue_scripts('tge_filter_edit_post');
235
+ return $post;
236
+ }
237
+ /**
238
+ * Get instance.
239
+ *
240
+ * @return PageBuilders
241
+ */
242
+ public static function getInstance() {
243
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\comp\PageBuilders()) : self::$me;
244
+ }
245
+ }
inc/comp/PolyLang.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\CountCache;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * This class handles the compatibility for Poly Lang plugin.
14
+ */
15
+ class PolyLang {
16
+ use UtilsProvider;
17
+ private static $me = null;
18
+ private $active = \false;
19
+ /**
20
+ * Avoid duplicate call of move action.
21
+ */
22
+ private $previousIds = null;
23
+ /**
24
+ * Avoid duplicate call of move action.
25
+ */
26
+ private $previousFolderId = null;
27
+ /**
28
+ * C'tor.
29
+ */
30
+ private function __construct() {
31
+ // Silence is golden.
32
+ }
33
+ /**
34
+ * Initialize actions.
35
+ */
36
+ public function init() {
37
+ $this->active = \function_exists('MatthiasWeb\\RealMediaLibrary\\Vendor\\pll_get_post_translations');
38
+ if ($this->active) {
39
+ add_action('pll_translate_media', [$this, 'pll_translate_media'], 10, 3);
40
+ add_action('RML/Options/Register', [$this, 'options_register']);
41
+ add_action('RML/Item/MoveFinished', [$this, 'item_move_finished'], 10, 4);
42
+ }
43
+ }
44
+ /**
45
+ * Register option for PolyLang.
46
+ */
47
+ public function options_register() {
48
+ register_setting('media', 'rml_polylang_move', 'esc_attr');
49
+ add_settings_field(
50
+ 'rml_polylang_move',
51
+ '<label for="rml_polylang_move">' . __('PolyLang: Automatically move translations', RML_TD) . '</label>',
52
+ [$this, 'html_options_move'],
53
+ 'media',
54
+ 'rml_options_general'
55
+ );
56
+ }
57
+ /**
58
+ * Output button to move translation.
59
+ */
60
+ public function html_options_move() {
61
+ $value = get_option('rml_polylang_move', '1');
62
+ echo '<input type="checkbox" id="rml_polylang_move"
63
+ name="rml_polylang_move" value="1" ' .
64
+ checked(1, $value, \false) .
65
+ ' />
66
+ <label>' .
67
+ __('If you move a file, the corresponding translated file will also be moved.', RML_TD) .
68
+ '</label>';
69
+ }
70
+ /**
71
+ * A file is moved (not copied) and then move also all the translations.
72
+ *
73
+ * @param int $folderId
74
+ * @param int[] $ids
75
+ * @param IFolder $folder
76
+ * @param boolean $isShortcut
77
+ */
78
+ public function item_move_finished($folderId, $ids, $folder, $isShortcut) {
79
+ if (
80
+ !$isShortcut &&
81
+ get_option('rml_polylang_move', '1') === '1' &&
82
+ \json_encode($ids) !== \json_encode($this->previousIds) &&
83
+ $folderId !== $this->previousFolderId
84
+ ) {
85
+ $moveToFolder = [];
86
+ $this->previousFolderId = $folderId;
87
+ $this->previousIds = $ids;
88
+ // Iterate all moved ids
89
+ foreach ($ids as $post_id) {
90
+ $translations = pll_get_post_translations($post_id);
91
+ // Iterate all translation ids
92
+ foreach ($translations as $tr_id) {
93
+ if (!\in_array($tr_id, $ids, \true)) {
94
+ $moveToFolder[] = $tr_id;
95
+ }
96
+ }
97
+ }
98
+ if (\count($moveToFolder) > 0) {
99
+ $this->debug(
100
+ "Polylang: While moving to folder {$folderId} there are some translations which also must be moved: " .
101
+ \json_encode($moveToFolder),
102
+ __METHOD__
103
+ );
104
+ wp_rml_move($folderId, $moveToFolder);
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * New translation created => synchronize with original post.
110
+ * Then reset the count cache for the unorganized folder.
111
+ *
112
+ * @param int $post_id
113
+ * @param int $tr_id
114
+ * @param string $lang_slug
115
+ */
116
+ public function pll_translate_media($post_id, $tr_id, $lang_slug) {
117
+ $folderId = wp_attachment_folder($post_id);
118
+ _wp_rml_synchronize_attachment($tr_id, $folderId);
119
+ $this->debug(
120
+ 'Polylang: Move translation id ' .
121
+ $tr_id .
122
+ ' to the original file (' .
123
+ $post_id .
124
+ ') folder id ' .
125
+ $folderId,
126
+ __METHOD__
127
+ );
128
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()
129
+ ->addNewAttachment($tr_id)
130
+ ->resetCountCacheOnWpDie(_wp_rml_root());
131
+ }
132
+ /**
133
+ * Get instance.
134
+ *
135
+ * @return PolyLang
136
+ */
137
+ public static function getInstance() {
138
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\comp\PolyLang()) : self::$me;
139
+ }
140
+ }
inc/comp/WPML.php ADDED
@@ -0,0 +1,357 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\CountCache;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ use MatthiasWeb\RealMediaLibrary\lite\comp\WPML as CompWPML;
9
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\comp\IOverrideWPML;
10
+ use MatthiasWeb\RealMediaLibrary\Util;
11
+ // @codeCoverageIgnoreStart
12
+ \defined('ABSPATH') or die('No script kiddies please!');
13
+ // Avoid direct file request
14
+ // @codeCoverageIgnoreEnd
15
+ /**
16
+ * This class handles the compatibility for WPML.
17
+ */
18
+ class WPML implements \MatthiasWeb\RealMediaLibrary\overrides\interfce\comp\IOverrideWPML {
19
+ use CompWPML;
20
+ use UtilsProvider;
21
+ private static $me = null;
22
+ private $active = \false;
23
+ /**
24
+ * Avoid duplicate call of move action.
25
+ */
26
+ private $previousIds = null;
27
+ /**
28
+ * Avoid duplicate call of move action.
29
+ */
30
+ private $previousFolderId = null;
31
+ /**
32
+ * C'tor.
33
+ */
34
+ private function __construct() {
35
+ // Silence is golden.
36
+ }
37
+ /**
38
+ * Initialize actions and filters.
39
+ */
40
+ public function init() {
41
+ global $sitepress;
42
+ $this->active = $sitepress !== null && \get_class($sitepress) === 'SitePress';
43
+ if ($this->active) {
44
+ add_action(
45
+ 'wpml_media_create_duplicate_attachment',
46
+ [$this, 'wpml_media_create_duplicate_attachment'],
47
+ 10,
48
+ 2
49
+ );
50
+ add_action('RML/Options/Register', [$this, 'options_register']);
51
+ add_action('RML/Item/MoveFinished', [$this, 'item_move_finished'], 10, 4);
52
+ add_action('wpml_update_active_languages', [$this, 'wpml_update_active_languages']);
53
+ add_action('RML/Count/Update', [$this, 'updateCountCache'], 10, 3);
54
+ add_action('RML/Count/Reset', [$this, 'resetCountCache']);
55
+ add_filter('RML/Tree/SQLStatement/SELECT', [$this, 'sqlstatement_select_fields']);
56
+ add_filter('RML/Tree/SQLStatement/JOIN', [$this, 'sqlstatement_join']);
57
+ add_filter('RML/Tree/CountAttachments', [$this, 'wpml_count_attachments']);
58
+ add_filter('RML/Localize', [$this, 'localize']);
59
+ // Set the RML + WPML language to the user
60
+ if (is_user_logged_in()) {
61
+ $userId = get_current_user_id();
62
+ $userLanguage = get_user_meta($userId, 'rml_wpml_lang', \true);
63
+ $currentLanguage = $sitepress->get_current_language();
64
+ if ($userLanguage !== $currentLanguage) {
65
+ $saveLanguage = $currentLanguage === 'all' ? $sitepress->get_default_language() : $currentLanguage;
66
+ // "all" is not allowed for WPML / RML
67
+ update_user_meta($userId, 'rml_wpml_lang', $saveLanguage);
68
+ }
69
+ }
70
+ $this->overrideInit();
71
+ }
72
+ }
73
+ /**
74
+ * Localize frontend.
75
+ *
76
+ * @param array $arr
77
+ * @return array
78
+ */
79
+ public function localize($arr) {
80
+ global $sitepress;
81
+ if (!$this->isDefaultLanguage()) {
82
+ $arr['restQuery']['lang'] = $sitepress->get_current_language();
83
+ }
84
+ return $arr;
85
+ }
86
+ /**
87
+ * Add a JOIN to the WPML count cache table.
88
+ *
89
+ * @param string[] $joins
90
+ * @return string[]
91
+ */
92
+ public function sqlstatement_join($joins) {
93
+ global $wpdb;
94
+ $table_name = $this->getTableName('icl_count');
95
+ // Check if table exists and create it
96
+ // phpcs:disable WordPress.DB.PreparedSQL
97
+ $exists = \strcasecmp($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'"), $table_name);
98
+ // phpcs:enable WordPress.DB.PreparedSQL
99
+ if (0 !== $exists) {
100
+ $this->dbDeltaCountCache();
101
+ }
102
+ $joins[] = "LEFT JOIN {$table_name} AS rmlicl ON tn.id = rmlicl.fid";
103
+ return $joins;
104
+ }
105
+ /**
106
+ * Load the cnt from the WPML count cache table.
107
+ *
108
+ * @param string[] $fields
109
+ * @return string[]
110
+ */
111
+ public function sqlstatement_select_fields($fields) {
112
+ global $sitepress;
113
+ $currentLanguage = $sitepress->get_current_language();
114
+ $escaped = \MatthiasWeb\RealMediaLibrary\Util::getInstance()->esc_sql_name($currentLanguage);
115
+ $fields[1] =
116
+ "rmlicl.`cnt_{$escaped}` AS cnt, IFNULL(rmlicl.`cnt_{$escaped}`, (\n " .
117
+ $this->getSingleCountSql($currentLanguage, 'tn.id') .
118
+ '
119
+ )) AS cnt_result';
120
+ return $fields;
121
+ }
122
+ /**
123
+ * Get the single SQL for the subquery of count getter.
124
+ *
125
+ * @param string $code
126
+ * @param string $fieldId
127
+ * @return string
128
+ */
129
+ public function getSingleCountSql($code, $fieldId = 'tn.fid') {
130
+ global $wpdb;
131
+ $table_name_posts = $this->getTableName('posts');
132
+ $where = empty($fieldId) ? '' : "WHERE rmlpostscnt.fid = {$fieldId}";
133
+ return "SELECT COUNT(*) FROM {$table_name_posts} AS rmlpostscnt\n \tINNER JOIN " .
134
+ $wpdb->prefix .
135
+ "icl_translations AS wpmlt\n \tON wpmlt.element_id = rmlpostscnt.attachment\n \tAND wpmlt.element_type = 'post_attachment'\n \tAND wpmlt.language_code = '{$code}'\n \t{$where}";
136
+ }
137
+ /**
138
+ * Update the count cache for WPML regarding the active languages.
139
+ *
140
+ * @param int[] $folders
141
+ * @param int[] $attachments
142
+ * @param string $where
143
+ */
144
+ public function updateCountCache($folders, $attachments, $where) {
145
+ global $wpdb, $sitepress;
146
+ $table_name = $this->getTableName();
147
+ $table_name_icl = $this->getTableName('icl_count');
148
+ $langs = $sitepress->get_active_languages();
149
+ $where = $where !== 'tn.cnt IS NULL' ? \str_replace('tn.id', 'tn.fid', $where) : '1=1';
150
+ // Keep both tables synced (performance should be good because both queries use the best available index)
151
+ // phpcs:disable WordPress.DB.PreparedSQL
152
+ $wpdb->query("INSERT IGNORE INTO {$table_name_icl} (`fid`) SELECT id FROM {$table_name}");
153
+ $wpdb->query(
154
+ "DELETE rmlicl FROM {$table_name_icl} AS rmlicl WHERE NOT EXISTS(SELECT * FROM {$table_name} AS rml WHERE rml.id = rmlicl.fid)"
155
+ );
156
+ // phpcs:enable WordPress.DB.PreparedSQL
157
+ // Sync available languages counts
158
+ $setters = [];
159
+ foreach (\array_keys($langs) as $code) {
160
+ $escaped = \MatthiasWeb\RealMediaLibrary\Util::getInstance()->esc_sql_name($code);
161
+ $setters[] = "`cnt_{$escaped}` = (" . $this->getSingleCountSql($code) . ')';
162
+ }
163
+ // Create UPDATE query
164
+ // phpcs:disable WordPress.DB.PreparedSQL
165
+ $sqlStatement = "UPDATE {$table_name_icl} AS tn SET " . \join(',', $setters) . " WHERE {$where}";
166
+ $wpdb->query($sqlStatement);
167
+ // phpcs:enable WordPress.DB.PreparedSQL
168
+ $this->debug('WPML: Update count cache table', __METHOD__);
169
+ }
170
+ /**
171
+ * Reset the count cache for WPML regarding the active languages.
172
+ *
173
+ * @param int $folderId
174
+ */
175
+ public function resetCountCache($folderId) {
176
+ global $wpdb;
177
+ $table_name = $this->getTableName('icl_count');
178
+ // phpcs:disable WordPress.DB.PreparedSQL
179
+ if (\is_array($folderId)) {
180
+ $wpdb->query("DELETE FROM {$table_name} WHERE fid IN (" . \implode(',', $folderId) . ')');
181
+ } else {
182
+ $wpdb->query("DELETE FROM {$table_name}");
183
+ }
184
+ // phpcs:enable WordPress.DB.PreparedSQL
185
+ }
186
+ /**
187
+ * Fired when wpml language gets activated.
188
+ */
189
+ public function wpml_update_active_languages() {
190
+ $this->debug('WPML: Update active languages in count cache table', __METHOD__);
191
+ $this->dbDeltaCountCache();
192
+ }
193
+ /**
194
+ * Create a count cache table with dbDelta functionality.
195
+ */
196
+ public function dbDeltaCountCache() {
197
+ if (!$this->active) {
198
+ return \false;
199
+ }
200
+ $this->getCore()
201
+ ->getActivator()
202
+ ->install(\false, [$this, '_dbDeltaCountCache']);
203
+ return \true;
204
+ }
205
+ /**
206
+ * Create the icl_count table.
207
+ */
208
+ public function _dbDeltaCountCache() {
209
+ global $wpdb, $sitepress;
210
+ $charset_collate = $wpdb->get_charset_collate();
211
+ $table_name = $this->getTableName('icl_count');
212
+ $langs = $sitepress->get_active_languages();
213
+ if (\count($langs) > 0) {
214
+ $keys = '';
215
+ $langs = \array_keys($langs);
216
+ foreach ($langs as $code) {
217
+ $escaped = \MatthiasWeb\RealMediaLibrary\Util::getInstance()->esc_sql_name($code);
218
+ $keys .= "`cnt_{$escaped}` mediumint(10) DEFAULT NULL,\n \t\t ";
219
+ }
220
+ $sql =
221
+ "CREATE TABLE {$table_name} (\n \t\t fid mediumint(9) NOT NULL,\n \t\t " .
222
+ \trim($keys) .
223
+ "\n \t\t PRIMARY KEY (fid)\n \t\t) {$charset_collate};";
224
+ dbDelta($sql);
225
+ // CountCache::getInstance()->updateCountCache();
226
+ }
227
+ }
228
+ /**
229
+ * Register option for PolyLang.
230
+ */
231
+ public function options_register() {
232
+ register_setting('media', 'rml_wpml_move', 'esc_attr');
233
+ add_settings_field(
234
+ 'rml_wpml_move',
235
+ '<label for="rml_wpml_move">' . __('WPML: Automatically move translations', RML_TD) . '</label>',
236
+ [$this, 'html_options_move'],
237
+ 'media',
238
+ 'rml_options_general'
239
+ );
240
+ }
241
+ /**
242
+ * Option to move files also when a translation gets moved.
243
+ */
244
+ public function html_options_move() {
245
+ $value = get_option('rml_wpml_move', '1');
246
+ echo '<input type="checkbox" id="rml_wpml_move"
247
+ name="rml_wpml_move" value="1" ' .
248
+ checked(1, $value, \false) .
249
+ ' />
250
+ <label>' .
251
+ __('If you move a file, the corresponding translated file will also be moved.', RML_TD) .
252
+ '</label>';
253
+ }
254
+ /**
255
+ * A file is moved (not copied) and then move also all the translations.
256
+ *
257
+ * @param int $folderId
258
+ * @param int[] $ids
259
+ * @param IFolder $folder
260
+ * @param boolean $isShortcut
261
+ */
262
+ public function item_move_finished($folderId, $ids, $folder, $isShortcut) {
263
+ if (
264
+ !$isShortcut &&
265
+ get_option('rml_wpml_move', '1') === '1' &&
266
+ \json_encode($ids) !== \json_encode($this->previousIds) &&
267
+ $folderId !== $this->previousFolderId
268
+ ) {
269
+ global $sitepress;
270
+ $moveToFolder = [];
271
+ $this->previousFolderId = $folderId;
272
+ $this->previousIds = $ids;
273
+ // Iterate all moved ids
274
+ foreach ($ids as $post_id) {
275
+ $trid = $sitepress->get_element_trid($post_id);
276
+ $translations = $sitepress->get_element_translations($trid, 'post_attachment');
277
+ // Iterate all translation ids
278
+ foreach ($translations as $tr) {
279
+ $tr_id = $tr->element_id;
280
+ if (!\in_array($tr_id, $ids, \true)) {
281
+ $moveToFolder[] = $tr_id;
282
+ }
283
+ }
284
+ }
285
+ if (\count($moveToFolder) > 0) {
286
+ $this->debug(
287
+ "WPML: While moving to folder {$folderId} there are some translations which also must be moved: " .
288
+ \json_encode($moveToFolder),
289
+ __METHOD__
290
+ );
291
+ wp_rml_move($folderId, $moveToFolder);
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * New translation created => synchronize with original post.
297
+ * Then reset the count cache for the unorganized folder.
298
+ *
299
+ * @param int $post_id
300
+ * @param int $tr_id
301
+ */
302
+ public function wpml_media_create_duplicate_attachment($post_id, $tr_id) {
303
+ $folderId = wp_attachment_folder($post_id);
304
+ _wp_rml_synchronize_attachment($tr_id, $folderId);
305
+ $this->debug(
306
+ 'WPML: Move translation id ' . $tr_id . ' to the original file (' . $post_id . ') folder id ' . $folderId,
307
+ __METHOD__
308
+ );
309
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()
310
+ ->addNewAttachment($tr_id)
311
+ ->resetCountCacheOnWpDie(_wp_rml_root());
312
+ }
313
+ /**
314
+ * Count attachments through WPML tables.
315
+ *
316
+ * @param int $count
317
+ * @return int
318
+ * @see https://wpml.org/forums/topic/wp_count_posts/
319
+ */
320
+ public function wpml_count_attachments($count) {
321
+ global $wpdb, $sitepress;
322
+ $lang = $sitepress->get_current_language();
323
+ $table_name = $wpdb->prefix . 'icl_translations';
324
+ // phpcs:disable WordPress.DB.PreparedSQL
325
+ return (int) $wpdb->get_var(
326
+ "SELECT COUNT(*)\n FROM {$table_name} AS wpmlt\n INNER JOIN {$wpdb->posts} AS p ON p.id = wpmlt.element_id\n WHERE wpmlt.element_type = 'post_attachment'\n AND wpmlt.language_code = '{$lang}'"
327
+ );
328
+ // phpcs:enable WordPress.DB.PreparedSQL
329
+ }
330
+ /**
331
+ * Check if current active language is default.
332
+ *
333
+ * @return boolean
334
+ */
335
+ public function isDefaultLanguage() {
336
+ global $sitepress;
337
+ return $sitepress->get_current_language() === $sitepress->get_default_language();
338
+ }
339
+ /**
340
+ * Get the default id for an attachment.
341
+ *
342
+ * @param int $attachment
343
+ * @return int
344
+ */
345
+ public function getDefaultId($attachment) {
346
+ global $sitepress;
347
+ return apply_filters('wpml_object_id', $attachment, 'post', \true, $sitepress->get_default_language());
348
+ }
349
+ /**
350
+ * Get instance.
351
+ *
352
+ * @return WPML
353
+ */
354
+ public static function getInstance() {
355
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\comp\WPML()) : self::$me;
356
+ }
357
+ }
inc/comp/complexquery/ComplexQuery.php ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp\complexquery;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use wpdb;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * Define your complex SQL query. When implementing your complex query do
13
+ * not use global $wpdb; in your methods. Use ::getWpdb() instead.
14
+ *
15
+ * A complex query can be splitted into three parts:
16
+ * <ul>
17
+ * <li>1. Single Query: The query can be processed through one single SQL query with user defined variables</li>
18
+ * <li>2. Procedure: The procedure can write for example to an temporary table and reads again from this one</li>
19
+ * <li>3. Fallback: The fallback can throw an error or do the query through PHP functions</li>
20
+ * </ul>
21
+ *
22
+ * @example $rows = new MyComplexQuery($wpdb)->getResults();
23
+ */
24
+ abstract class ComplexQuery {
25
+ use UtilsProvider;
26
+ const CACHE_OPTION_NAME = 'mw_complex_query';
27
+ private $wpdb;
28
+ private $isProcedurable;
29
+ private $cache;
30
+ /**
31
+ * C'tor.
32
+ *
33
+ * @param wpdb $wpdb
34
+ */
35
+ public function __construct($wpdb) {
36
+ $this->wpdb = $wpdb;
37
+ // Check the cache
38
+ $cache = $this->cache = $this->getCache();
39
+ if ($cache === \false || \time() > $cache['expire']) {
40
+ $cache = [];
41
+ $cache['expire'] = \strtotime('15 days');
42
+ $cache['isSQ'] = $this->isSingleQueriableWithUserDefinedVars();
43
+ $cache['isP'] = $this->isProcedurable();
44
+ update_site_option(\MatthiasWeb\RealMediaLibrary\comp\complexquery\ComplexQuery::CACHE_OPTION_NAME, $cache);
45
+ $this->cache = $cache;
46
+ }
47
+ }
48
+ /**
49
+ * Get the result from the three different result types: singleQuery,
50
+ * procedure or fallback.
51
+ *
52
+ * @return mixed
53
+ */
54
+ public function getResult() {
55
+ if ($this->isSingleQueriableWithUserDefinedVars()) {
56
+ return $this->singleQuery();
57
+ } elseif ($this->isMysqli() && $this->isProcedurable()) {
58
+ return $this->procedure();
59
+ } else {
60
+ return $this->fallback();
61
+ }
62
+ }
63
+ /**
64
+ * This function is called when user defined variables are support. This method
65
+ * should return your expected result. It works with both mysqli_connect and mysql_connect.
66
+ *
67
+ * @return mixed
68
+ */
69
+ abstract public function singleQuery();
70
+ /**
71
+ * This function is called when procedures (stored functions and
72
+ * procedures) are available. It is also necessary that mysqli is in
73
+ * use. mysql_connect does not support store_results() method. This method
74
+ * should return your expected result. You should work with this::hasProcedure()
75
+ * to install your procedure if not exists.
76
+ *
77
+ * A procedure can for example write into a temporary table and reads from it again.
78
+ *
79
+ * @return mixed
80
+ */
81
+ abstract public function procedure();
82
+ /**
83
+ * This function is called when a single query is not possible and procedures
84
+ * are not allowed.
85
+ *
86
+ * @return mixed
87
+ */
88
+ abstract public function fallback();
89
+ /**
90
+ * Start an installer. Use this function in your procedure() method.
91
+ *
92
+ * @param callable $callable The callable to install the procedure for example
93
+ */
94
+ final public function install($callable) {
95
+ // Avoid error messages in frontend
96
+ $this->getCore()
97
+ ->getActivator()
98
+ ->install(\false, $callable);
99
+ }
100
+ /**
101
+ * Call a "CALL proc" SQL and parse the results.
102
+ *
103
+ * @param string $sql The SQL string to execute
104
+ * @param boolean $returnTrue When the CALL is successfully and has no results then return true instead of an empty array
105
+ * @return Array or false when an error occur
106
+ */
107
+ final protected function getProcedureResults($sql, $returnTrue = \false) {
108
+ $mysqli = $this->getDbh();
109
+ if (($result = $mysqli->query($sql)) === \false) {
110
+ return \false;
111
+ }
112
+ $results = [];
113
+ // The procedure can be empty
114
+ if ($result === \true) {
115
+ return $returnTrue ? \true : $results;
116
+ }
117
+ // The procedure has results
118
+ while ($row = $result->fetch_array()) {
119
+ $results[] = $row;
120
+ }
121
+ $result->close();
122
+ return $results;
123
+ }
124
+ /**
125
+ * Checks if a given procedure is available for the current user.
126
+ *
127
+ * @param string $procedure
128
+ * @return boolean
129
+ */
130
+ public function hasProcedure($procedure) {
131
+ $wpdb = $this->getWpdb();
132
+ return $wpdb->get_var(
133
+ $wpdb->prepare(
134
+ "SELECT COUNT(*)\n FROM INFORMATION_SCHEMA.ROUTINES\n WHERE UPPER(ROUTINE_TYPE)='PROCEDURE'\n AND UPPER(ROUTINE_SCHEMA)=UPPER(%s)\n AND UPPER(ROUTINE_NAME)=UPPER(%s)",
135
+ $wpdb->dbname,
136
+ $procedure
137
+ )
138
+ ) > 0;
139
+ }
140
+ /**
141
+ * Checks if a single query is allowed to use @vars. For example MariaDB
142
+ * does not resolve @vars in a single query when they are not declared before.
143
+ * This method uses a cache (30 days).
144
+ *
145
+ * @return boolean
146
+ */
147
+ public function isSingleQueriableWithUserDefinedVars() {
148
+ // Cache
149
+ if (isset($this->cache['isSQ'])) {
150
+ return $this->cache['isSQ'];
151
+ }
152
+ return $this->getWpdb()->get_var('SELECT @var := 5 AS myvar') === '5';
153
+ }
154
+ /**
155
+ * Checks if procedures are allowed. This function uses a cache (30 days).
156
+ *
157
+ * @see https://stackoverflow.com/questions/609855/check-user-rights-before-attempting-to-create-database
158
+ * @return boolean
159
+ */
160
+ public function isProcedurable() {
161
+ // Cache
162
+ if (isset($this->cache['isP'])) {
163
+ return $this->cache['isP'];
164
+ }
165
+ $this->install([$this, '_isProcedurable']);
166
+ return $this->isProcedurable;
167
+ }
168
+ /**
169
+ * Installs a procedure and checks if it can be used.
170
+ */
171
+ final public function _isProcedurable() {
172
+ $wpdb = $this->getWpdb();
173
+ $wpdb->query('DROP PROCEDURE IF EXISTS _wp_realmedialibrary');
174
+ $this->isProcedurable = $wpdb->query('CREATE PROCEDURE _wp_realmedialibrary( ) BEGIN END');
175
+ }
176
+ /**
177
+ * Checks if the database handle is mysqli or not.
178
+ *
179
+ * @return boolean
180
+ */
181
+ public function isMysqli() {
182
+ return $this->wpdb->use_mysqli;
183
+ }
184
+ /**
185
+ * Getter.
186
+ *
187
+ * @return wpdb
188
+ */
189
+ public function getWpdb() {
190
+ return $this->wpdb;
191
+ }
192
+ /**
193
+ * Getter.
194
+ *
195
+ * @return string
196
+ */
197
+ public function getDbh() {
198
+ return $this->wpdb->dbh;
199
+ }
200
+ /**
201
+ * Get cache.
202
+ *
203
+ * @return mixed
204
+ */
205
+ public function getCache() {
206
+ return get_site_option(\MatthiasWeb\RealMediaLibrary\comp\complexquery\ComplexQuery::CACHE_OPTION_NAME);
207
+ }
208
+ }
inc/comp/complexquery/ResetNames.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\comp\complexquery;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ /**
10
+ * Reset names so slugs combined to a correct absolute path.
11
+ *
12
+ * This class is not yet used.
13
+ */
14
+ class ResetNames extends \MatthiasWeb\RealMediaLibrary\comp\complexquery\ComplexQuery {
15
+ /**
16
+ * Single query.
17
+ *
18
+ * @return array
19
+ */
20
+ public function singleQuery() {
21
+ // $sql = "SELECT t1.id, t2.name FROM ( SELECT t0.r_init AS id, IF(t0.reset_r = 1, (@r := t0.r_init), (@r := (select parent from $table_name where id = @r))) AS r, IF(t0.reset_r = 1, (@l := 1), (@l := @l + 1)) AS lvl FROM (SELECT m0.id as counter, m1.id AS r_init, ((SELECT min(id) FROM $table_name) = m0.id) AS reset_r FROM $table_name m0, $table_name m1 ORDER BY r_init, counter) t0 ORDER BY t0.r_init, t0.counter ) t1 INNER JOIN $table_name t2 ON t2.id = t1.r WHERE r <> -1 ORDER BY id, lvl DESC";
22
+ // return $this->getWpdb()->get_results($sql, ARRAY_A);
23
+ return [];
24
+ }
25
+ /**
26
+ * We do not need a procedure.
27
+ */
28
+ public function procedure() {
29
+ $procedure = 'wp_realmedialibrary_pr_resetnames';
30
+ if (!$this->hasProcedure($procedure)) {
31
+ $this->install([$this, 'installProcedure']);
32
+ }
33
+ // We have now a procedure and can call it
34
+ return $this->getProcedureResults('CALL ' . $procedure . '()');
35
+ }
36
+ /**
37
+ * We do not need a procedure.
38
+ */
39
+ public function installProcedure() {
40
+ // Silence is golden.
41
+ }
42
+ /**
43
+ * We do not need a fallback.
44
+ */
45
+ public function fallback() {
46
+ return \false;
47
+ }
48
+ }
inc/comp/complexquery/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/comp/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/exception/FolderAlreadyExistsException.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\exception;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use Exception;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * When we want to set parent of a folder and the given name
13
+ * already exists in the parent folder.
14
+ */
15
+ class FolderAlreadyExistsException extends \Exception {
16
+ private $parent;
17
+ // Parent ID
18
+ private $name;
19
+ // The name which exists in this folder
20
+ /**
21
+ * C'tor.
22
+ *
23
+ * @param int $parent
24
+ * @param string $name
25
+ * @param int $code
26
+ * @param \Exception $previous
27
+ */
28
+ public function __construct($parent, $name, $code = 0, \Exception $previous = null) {
29
+ parent::__construct(
30
+ // translators:
31
+ \sprintf(__("'%s' already exists in this folder.", RML_TD), \htmlentities($name)),
32
+ $code,
33
+ $previous
34
+ );
35
+ $this->parent = $parent;
36
+ $this->name = $name;
37
+ }
38
+ /**
39
+ * Get the folder of the children in this parent.
40
+ *
41
+ * @return IFolder
42
+ */
43
+ public function getFolder() {
44
+ $parent = wp_rml_get_object_by_id($this->getParentId());
45
+ return $parent->hasChildren($this->getName(), \true);
46
+ }
47
+ /**
48
+ * Getter.
49
+ *
50
+ * @return int
51
+ */
52
+ public function getParentId() {
53
+ return $this->parent;
54
+ }
55
+ /**
56
+ * Getter.
57
+ *
58
+ * @return string
59
+ */
60
+ public function getName() {
61
+ return $this->name;
62
+ }
63
+ }
inc/exception/OnlyInProVersionException.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\exception;
4
+
5
+ use Exception;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * When a functionality is only available in PRO version throw an exception.
12
+ */
13
+ class OnlyInProVersionException extends \Exception {
14
+ /**
15
+ * C'tor.
16
+ *
17
+ * @param string $method
18
+ */
19
+ public function __construct($method) {
20
+ // translators:
21
+ parent::__construct(
22
+ // translators:
23
+ \sprintf(__('This functionality is not available in the free version (%s).', RML_TD), $method)
24
+ );
25
+ }
26
+ }
inc/folder/BaseFolder.php ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\Permissions;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * Abstract base class for folders. It handles the available fields and getters / setters.
14
+ * The class is completely documented in the implemented interface.
15
+ */
16
+ abstract class BaseFolder implements \MatthiasWeb\RealMediaLibrary\api\IFolder {
17
+ use UtilsProvider;
18
+ protected $id;
19
+ protected $parent;
20
+ protected $name;
21
+ protected $cnt;
22
+ protected $order;
23
+ protected $slug;
24
+ protected $absolutePath;
25
+ protected $row;
26
+ protected $children;
27
+ protected $visible = \true;
28
+ protected $restrictions = [];
29
+ protected $restrictionsCount = 0;
30
+ protected $systemReservedFolders = ['/', '..', '.'];
31
+ protected $contentCustomOrder;
32
+ // Documented in IFolder
33
+ public function anyParentHas($column, $value = null, $valueFormat = '%s', $includeSelf = \false, $until = null) {
34
+ global $wpdb;
35
+ // phpcs:disable WordPress.DB
36
+ $sql = wp_rml_create_all_parents_sql($this, $includeSelf, $until, [
37
+ 'fields' => "rmldata.id, rmldata.{$column}",
38
+ 'afterWhere' => $wpdb->prepare("AND rmldata.{$column} = {$valueFormat}", $value)
39
+ ]);
40
+ return $sql === \false ? [] : $wpdb->get_results($sql, ARRAY_A);
41
+ // phpcs:enable WordPress.DB
42
+ }
43
+ // Documented in IFolder
44
+ public function anyParentHasMetadata(
45
+ $meta_key,
46
+ $meta_value = null,
47
+ $valueFormat = '%s',
48
+ $includeSelf = \false,
49
+ $until = null
50
+ ) {
51
+ global $wpdb;
52
+ // phpcs:disable WordPress.DB
53
+ $sql = wp_rml_create_all_parents_sql($this, $includeSelf, $until, [
54
+ 'fields' => 'rmlmeta.meta_id AS id, rmlmeta.realmedialibrary_id AS folderId, rmlmeta.meta_value AS value',
55
+ 'join' => $wpdb->prepare(
56
+ 'JOIN ' .
57
+ $this->getTableName('meta') .
58
+ ' rmlmeta ON rmlmeta.realmedialibrary_id = rmldata.id AND rmlmeta.meta_key = %s',
59
+ $meta_key
60
+ ),
61
+ 'afterWhere' =>
62
+ $meta_value === null
63
+ ? "AND TRIM(IFNULL(rmlmeta.meta_value,'')) <> ''"
64
+ : $wpdb->prepare("AND rmlmeta.meta_value = {$valueFormat}", $meta_value)
65
+ ]);
66
+ return $sql === \false ? [] : $wpdb->get_results($sql, ARRAY_A);
67
+ // phpcs:enable WordPress.DB
68
+ }
69
+ // Documented in IFolder
70
+ public function anyChildrenHas($column, $value = null, $valueFormat = '%s', $includeSelf = \false) {
71
+ global $wpdb;
72
+ // phpcs:disable WordPress.DB
73
+ $sql = wp_rml_create_all_children_sql($this, $includeSelf, [
74
+ 'fields' => "rmldata.id, rmldata.{$column}",
75
+ 'afterWhere' => $wpdb->prepare("AND rmldata.{$column} = {$valueFormat}", $value)
76
+ ]);
77
+ return $sql === \false ? [] : $wpdb->get_results($sql, ARRAY_A);
78
+ // phpcs:enable WordPress.DB
79
+ }
80
+ // Documented in IFolder
81
+ public function anyChildrenHasMetadata($meta_key, $meta_value = null, $valueFormat = '%s', $includeSelf = \false) {
82
+ // phpcs:disable WordPress.DB
83
+ global $wpdb;
84
+ $sql = wp_rml_create_all_children_sql($this, $includeSelf, [
85
+ 'fields' => 'rmlmeta.meta_id AS id, rmlmeta.realmedialibrary_id AS folderId, rmlmeta.meta_value AS value',
86
+ 'join' => $wpdb->prepare(
87
+ 'JOIN ' .
88
+ $this->getTableName('meta') .
89
+ ' rmlmeta ON rmlmeta.realmedialibrary_id = rmldata.id AND rmlmeta.meta_key = %s',
90
+ $meta_key
91
+ ),
92
+ 'afterWhere' =>
93
+ $meta_value === null
94
+ ? "AND TRIM(IFNULL(rmlmeta.meta_value,'')) <> ''"
95
+ : $wpdb->prepare("AND rmlmeta.meta_value = {$valueFormat}", $meta_value)
96
+ ]);
97
+ return $sql === \false ? [] : $wpdb->get_results($sql, ARRAY_A);
98
+ // phpcs:enable WordPress.DB
99
+ }
100
+ // Documented in IFolder
101
+ public function hasChildren($name, $returnObject = \false) {
102
+ foreach ($this->getChildren() as $value) {
103
+ if ($value->getName() === $name) {
104
+ return $returnObject === \true ? $value : \true;
105
+ }
106
+ }
107
+ return \false;
108
+ }
109
+ // Documented in IFolder
110
+ public function getId() {
111
+ return $this->id;
112
+ }
113
+ // Documented in IFolder
114
+ public function getParent() {
115
+ return $this->parent;
116
+ }
117
+ // Documented in IFolder
118
+ public function getAllParents($until = null, $colIdx = 0) {
119
+ global $wpdb;
120
+ $sql = wp_rml_create_all_parents_sql($this, \false, $until);
121
+ // phpcs:disable WordPress.DB.PreparedSQL
122
+ return $sql === \false ? [] : $wpdb->get_col($sql, $colIdx);
123
+ // phpcs:enable WordPress.DB.PreparedSQL
124
+ }
125
+ // Documented in IFolder
126
+ public function getName($htmlentities = \false) {
127
+ return $htmlentities ? \htmlentities($this->name) : $this->name;
128
+ }
129
+ // Documented in IFolder
130
+ public function getSlug($force = \false, $fromSetName = \false) {
131
+ if ($this->slug === '' || $force) {
132
+ $slugBefore = $this->slug;
133
+ $this->slug = _wp_rml_sanitize($this->name, $this->id > -1, $this->id);
134
+ // Update in database
135
+ if ($this->id > -1) {
136
+ if ($slugBefore !== $this->slug) {
137
+ global $wpdb;
138
+ $table_name = $this->getTableName();
139
+ // phpcs:disable WordPress.DB.PreparedSQL
140
+ $wpdb->query(
141
+ $wpdb->prepare("UPDATE {$table_name} SET slug=%s WHERE id = %d", $this->slug, $this->id)
142
+ );
143
+ // phpcs:enable WordPress.DB.PreparedSQL
144
+ $this->debug("Successfully changed slug '{$this->slug}' in database", __METHOD__);
145
+ }
146
+ if (!$fromSetName) {
147
+ $this->updateThisAndChildrensAbsolutePath();
148
+ }
149
+ }
150
+ }
151
+ return $this->slug;
152
+ }
153
+ // Documented in IFolder
154
+ public function getPath($implode = '/', $map = 'htmlentities', $filter = null) {
155
+ $return = [];
156
+ // Add initial folder
157
+ if (!isset($filter) || \call_user_func_array($filter, [$this])) {
158
+ $initial = $this->name;
159
+ // Allow custom map function
160
+ if ($map !== null) {
161
+ if ($map === 'htmlentities') {
162
+ $initial = \htmlentities($initial);
163
+ } else {
164
+ $initial = \call_user_func_array($map, [$initial, $this]);
165
+ }
166
+ }
167
+ $return[] = $initial;
168
+ }
169
+ $folder = $this;
170
+ while (\true) {
171
+ $f = wp_rml_get_object_by_id($folder->parent);
172
+ if ($f !== null && $f->getType() !== RML_TYPE_ROOT) {
173
+ $folder = $f;
174
+ if (isset($filter) && !\call_user_func_array($filter, [$folder])) {
175
+ continue;
176
+ }
177
+ $name = $folder->name;
178
+ // Allow custom map function
179
+ if ($map !== null) {
180
+ if ($map === 'htmlentities') {
181
+ $name = \htmlentities($name);
182
+ } else {
183
+ $name = \call_user_func_array($map, [$name, $f]);
184
+ }
185
+ }
186
+ $return[] = $name;
187
+ } else {
188
+ break;
189
+ }
190
+ }
191
+ return \implode($implode, \array_reverse($return));
192
+ }
193
+ // Documented in IFolder
194
+ public function getOwner() {
195
+ return $this->owner;
196
+ }
197
+ // Documented in IFolder
198
+ public function getAbsolutePath($force = \false, $fromSetName = \false) {
199
+ if ($this->absolutePath === '' || $force) {
200
+ $pathBefore = $this->absolutePath;
201
+ $return = [$this->getSlug(\true, \true)];
202
+ $folder = $this;
203
+ while (\true) {
204
+ $f = wp_rml_get_object_by_id($folder->getParent());
205
+ if (is_rml_folder($f) && $f->getId() !== -1) {
206
+ $folder = $f;
207
+ $return[] = $folder->getSlug();
208
+ } else {
209
+ break;
210
+ }
211
+ }
212
+ $this->absolutePath = \implode('/', \array_reverse($return));
213
+ // Update in database
214
+ if ($this->id > -1) {
215
+ if ($pathBefore !== $this->absolutePath) {
216
+ global $wpdb;
217
+ $table_name = $this->getTableName();
218
+ // phpcs:disable WordPress.DB.PreparedSQL
219
+ $wpdb->query(
220
+ $wpdb->prepare(
221
+ "UPDATE {$table_name} SET absolute=%s WHERE id = %d",
222
+ $this->absolutePath,
223
+ $this->id
224
+ )
225
+ );
226
+ // phpcs:enable WordPress.DB.PreparedSQL
227
+ $this->debug("Successfully changed absolute path '{$this->absolutePath}' in database", __METHOD__);
228
+ }
229
+ if (!$fromSetName) {
230
+ $this->updateThisAndChildrensAbsolutePath();
231
+ }
232
+ }
233
+ }
234
+ return $this->absolutePath;
235
+ }
236
+ // Documented in IFolder
237
+ public function getCnt($forceReload = \false) {
238
+ if ($this->cnt === null || $forceReload) {
239
+ $query = new \MatthiasWeb\RealMediaLibrary\folder\QueryCount(
240
+ /**
241
+ * Modify the query arguments to count items within a folder.
242
+ *
243
+ * @param {array} $query The query with post_status, post_type and rml_folder
244
+ * @hook RML/Folder/QueryCountArgs
245
+ * @return {array} The query
246
+ */
247
+ apply_filters('RML/Folder/QueryCountArgs', [
248
+ 'post_status' => 'inherit',
249
+ 'post_type' => 'attachment',
250
+ 'rml_folder' => $this->id
251
+ ])
252
+ );
253
+ if (isset($query->posts[0])) {
254
+ $this->cnt = $query->posts[0];
255
+ } else {
256
+ $this->cnt = 0;
257
+ }
258
+ }
259
+ return $this->cnt;
260
+ }
261
+ // Documented in IFolder
262
+ public function getChildren() {
263
+ return $this->children;
264
+ }
265
+ // Documented in IFolder
266
+ public function getOrder() {
267
+ return $this->order;
268
+ }
269
+ // Documented in IFolder
270
+ public function getRestrictions() {
271
+ if (!$this->isVisible()) {
272
+ return \MatthiasWeb\RealMediaLibrary\attachment\Permissions::RESTRICTION_ALL;
273
+ }
274
+ return $this->restrictions;
275
+ }
276
+ // Documented in IFolder
277
+ public function getRestrictionsCount() {
278
+ if (!$this->isVisible()) {
279
+ return \count(\MatthiasWeb\RealMediaLibrary\attachment\Permissions::RESTRICTION_ALL);
280
+ }
281
+ return $this->restrictionsCount;
282
+ }
283
+ // Documented in IFolder
284
+ public function getPlain($deep = \false) {
285
+ if (!$this->isVisible()) {
286
+ return null;
287
+ }
288
+ $result = [
289
+ 'id' => $this->getId(),
290
+ 'type' => $this->getType(),
291
+ 'parent' => $this->getParent(),
292
+ 'name' => $this->getName(),
293
+ 'order' => $this->getOrder(),
294
+ 'restrictions' => $this->getRestrictions(),
295
+ 'slug' => $this->getSlug(),
296
+ 'absolutePath' => $this->getAbsolutePath(),
297
+ 'cnt' => $this->getCnt(),
298
+ 'contentCustomOrder' => (int) $this->getContentCustomOrder(),
299
+ 'forceCustomOrder' => $this->forceContentCustomOrder(),
300
+ 'lastOrderBy' => $this->getRowData('lastOrderBy'),
301
+ 'orderAutomatically' => $this->getRowData('orderAutomatically'),
302
+ 'lastSubOrderBy' => $this->getRowData('lastSubOrderBy'),
303
+ 'subOrderAutomatically' => $this->getRowData('subOrderAutomatically')
304
+ ];
305
+ // Add the children
306
+ if ($deep) {
307
+ $children = [];
308
+ foreach ($this->getChildren() as $child) {
309
+ $plain = $child->getPlain($deep);
310
+ if ($plain !== null) {
311
+ $children[] = $plain;
312
+ }
313
+ }
314
+ $result['children'] = $children;
315
+ }
316
+ return $result;
317
+ }
318
+ // Documented in IFolder
319
+ public function setRestrictions($restrictions = []) {
320
+ $this->debug($restrictions, __METHOD__);
321
+ $this->restrictions = $restrictions;
322
+ $this->restrictionsCount = \count($this->restrictions);
323
+ // Save in Database
324
+ if ($this->id > -1) {
325
+ global $wpdb;
326
+ $table_name = $this->getTableName();
327
+ // phpcs:disable WordPress.DB.PreparedSQL
328
+ $wpdb->query(
329
+ $wpdb->prepare(
330
+ "UPDATE {$table_name} SET restrictions=%s WHERE id = %d",
331
+ \implode(',', $restrictions),
332
+ $this->id
333
+ )
334
+ );
335
+ // phpcs:enable WordPress.DB.PreparedSQL
336
+ $this->debug('Successfully saved restrictions in database', __METHOD__);
337
+ }
338
+ }
339
+ // Documented in IFolder
340
+ public function is($folder_type) {
341
+ return $this->getType() === $folder_type;
342
+ }
343
+ // Documented in IFolder
344
+ public function isVisible() {
345
+ return $this->visible;
346
+ }
347
+ // Documented in IFolder
348
+ public function isRestrictFor($restriction) {
349
+ if (!$this->isVisible()) {
350
+ // When it is not visible, restrict the complete access
351
+ return \true;
352
+ }
353
+ return \in_array($restriction, $this->restrictions, \true) ||
354
+ \in_array($restriction . '>', $this->restrictions, \true);
355
+ }
356
+ }
inc/folder/CRUD.php ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException;
7
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
8
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\folder\IOverrideCRUD;
9
+ use MatthiasWeb\RealMediaLibrary\lite\folder\CRUD as LiteCRUD;
10
+ use Exception;
11
+ // @codeCoverageIgnoreStart
12
+ \defined('ABSPATH') or die('No script kiddies please!');
13
+ // Avoid direct file request
14
+ // @codeCoverageIgnoreEnd
15
+ /**
16
+ * Static class to perform CRUD operations on folders. Please do not use this directly
17
+ * instead use the API functions.
18
+ * The R (Read) is not implemented here because updates should be executed through the API functions.
19
+ * It also holds the registered creatables.
20
+ */
21
+ class CRUD implements \MatthiasWeb\RealMediaLibrary\overrides\interfce\folder\IOverrideCRUD {
22
+ use UtilsProvider;
23
+ use LiteCRUD;
24
+ private static $me = null;
25
+ /**
26
+ * Available creatables.
27
+ */
28
+ private $creatables = [];
29
+ // Documented in wp_rml_create()
30
+ public function create(
31
+ $name,
32
+ $parent,
33
+ $type,
34
+ $restrictions = [],
35
+ $supress_validation = \false,
36
+ $return_existing_id = \false
37
+ ) {
38
+ $this->debug("Try to create folder with name '{$name}'...", __METHOD__);
39
+ $errors = [];
40
+ try {
41
+ // Create restrictions from parent
42
+ if ($parent >= 0) {
43
+ $parentFolder = wp_rml_get_by_id($parent, null, \true);
44
+ if (is_rml_folder($parentFolder)) {
45
+ $parentRestrictions = $parentFolder->getRestrictions();
46
+ foreach ($parentRestrictions as $parentRestriction) {
47
+ if (\substr($parentRestriction, -1) === '>') {
48
+ $restrictions[] = $parentRestriction;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // Create the new instance for the folder
54
+ if ($type === null) {
55
+ throw new \Exception('Type not given.');
56
+ }
57
+ $creatable = $this->getCreatables($type);
58
+ if (!$creatable) {
59
+ throw new \Exception('Creatable class type not found.');
60
+ }
61
+ $result = \call_user_func_array(
62
+ [$creatable, 'create'],
63
+ [
64
+ (object) [
65
+ 'id' => -1,
66
+ 'parent' => \intval($parent),
67
+ 'name' => $name,
68
+ 'restrictions' => $restrictions,
69
+ 'supress_validation' => $supress_validation
70
+ ]
71
+ ]
72
+ );
73
+ // Check if other fails are counted
74
+ if (!$supress_validation) {
75
+ /**
76
+ * Checks if a creation of a folder is allowed.
77
+ *
78
+ * @param {string[]} $errors An array of errors
79
+ * @hook RML/Validate/Create
80
+ * @return {string[]} When the array has one or more items the creation is cancelled with the string message
81
+ */
82
+ $errors = apply_filters('RML/Validate/Create', $errors, $name, $parent, $type);
83
+ if (\count($errors) > 0) {
84
+ throw new \Exception(\implode(' ', $errors));
85
+ }
86
+ }
87
+ // Persist it!
88
+ return $result->persist();
89
+ } catch (\MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException $e) {
90
+ if ($return_existing_id) {
91
+ $existing_id = $e->getFolder()->getId();
92
+ $this->debug(
93
+ "Found folder with same name, now return the already existing folder id {$existing_id}...",
94
+ __METHOD__
95
+ );
96
+ return $existing_id;
97
+ }
98
+ } catch (\MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException $e) {
99
+ // Safely rethrow this exception
100
+ throw $e;
101
+ } catch (\Exception $e) {
102
+ // Silence is golden. Populate $e
103
+ }
104
+ $this->debug('Error: ' . $e->getMessage(), __METHOD__);
105
+ return [$e->getMessage()];
106
+ }
107
+ // Documented in wp_rml_rename()
108
+ public function update($name, $id, $supress_validation = \false) {
109
+ try {
110
+ $folder = wp_rml_get_by_id($id, null, \true);
111
+ if ($folder !== null) {
112
+ $folder->setName($name, $supress_validation);
113
+ } else {
114
+ throw new \Exception(__('The given folder does not exist or you cannot rename this folder.', RML_TD));
115
+ }
116
+ return \true;
117
+ } catch (\Exception $e) {
118
+ $this->debug('Error:' . $e->getMessage(), __METHOD__);
119
+ return [$e->getMessage()];
120
+ }
121
+ }
122
+ // Documented in wp_rml_delete()
123
+ public function remove($id, $supress_validation = \false) {
124
+ $this->debug("Try to delete folder id {$id}...", __METHOD__);
125
+ try {
126
+ $folder = wp_rml_get_object_by_id($id);
127
+ if ($folder !== null) {
128
+ // Check if subfolders
129
+ if (\count($folder->getChildren()) > 0) {
130
+ throw new \Exception(__('The folder you try to delete has subfolders.', RML_TD));
131
+ }
132
+ // Check if other fails are counted
133
+ if ($supress_validation === \false) {
134
+ $errors = apply_filters('RML/Validate/Delete', [], $id, $folder);
135
+ if (\count($errors) > 0) {
136
+ throw new \Exception(\implode(' ', $errors));
137
+ }
138
+ }
139
+ /**
140
+ * This action is fired before a folder gets deleted. It allows you
141
+ * for example to throw an exception if the deletion should be stopped with an
142
+ * error message.
143
+ *
144
+ * @param {IFolder} $folder The folder object
145
+ * @hook RML/Folder/Predeletion
146
+ */
147
+ do_action('RML/Folder/Predeletion', $folder);
148
+ /**
149
+ * This action is fired before a folder gets deleted and surely gets deleted
150
+ * (that means after the RML/Folder/Predeletion action).
151
+ *
152
+ * @param {IFolder} $folder The folder object
153
+ * @hook RML/Folder/Delete
154
+ * @since 4.0.7
155
+ */
156
+ do_action('RML/Folder/Delete', $folder);
157
+ global $wpdb;
158
+ // Delete folder
159
+ // phpcs:disable WordPress.DB.PreparedSQL
160
+ $table_name = $this->getTableName();
161
+ $wpdb->query($wpdb->prepare("DELETE FROM {$table_name} WHERE id = %d", $id));
162
+ // Delete post relations and move to unorganized
163
+ $table_name = $this->getTableName('posts');
164
+ $wpdb->query($wpdb->prepare("DELETE FROM {$table_name} WHERE fid = %d", $id));
165
+ // phpcs:enable WordPress.DB.PreparedSQL
166
+ // Do the action
167
+ $rowData = $folder->getRowData();
168
+ wp_rml_structure_reset();
169
+ /**
170
+ * This action is fired after a folder is deleted.
171
+ *
172
+ * @param {int} $id The folder id
173
+ * @param {object} $rowData The SQL row data (raw) data for the deleted folder
174
+ * @hook RML/Folder/Deleted
175
+ */
176
+ do_action('RML/Folder/Deleted', $id, $rowData);
177
+ $this->debug("Successfully deleted folder id {$id}", __METHOD__);
178
+ return \true;
179
+ } else {
180
+ throw new \Exception(__('The given folder does not exist.', RML_TD));
181
+ }
182
+ } catch (\Exception $e) {
183
+ $this->debug('Error: ' . $e->getMessage(), __METHOD__);
184
+ return [$e->getMessage()];
185
+ }
186
+ }
187
+ // Documented in wp_rml_register_creatable()
188
+ public function registerCreatable($qualified, $type, $onRegister = \false) {
189
+ $this->creatables[$type] = $qualified;
190
+ if ($onRegister) {
191
+ \call_user_func([$qualified, 'onRegister']);
192
+ }
193
+ }
194
+ /**
195
+ * Get available creatables.
196
+ *
197
+ * @param int $type
198
+ * @return int[]|Creatable
199
+ */
200
+ public function getCreatables($type = null) {
201
+ return $type === null ? $this->creatables : (isset($this->creatables[$type]) ? $this->creatables[$type] : null);
202
+ }
203
+ /**
204
+ * Get instance.
205
+ *
206
+ * @return CRUD
207
+ */
208
+ public static function getInstance() {
209
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\folder\CRUD()) : self::$me;
210
+ }
211
+ }
inc/folder/Creatable.php ADDED
@@ -0,0 +1,486 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\Shortcut;
6
+ use MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException;
7
+ use MatthiasWeb\RealMediaLibrary\lite\folder\Creatable as FolderCreatable;
8
+ use MatthiasWeb\RealMediaLibrary\order\Sortable;
9
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\folder\IOverrideCreatable;
10
+ use MatthiasWeb\RealMediaLibrary\Util;
11
+ use Exception;
12
+ use WP_Query;
13
+ // @codeCoverageIgnoreStart
14
+ \defined('ABSPATH') or die('No script kiddies please!');
15
+ // Avoid direct file request
16
+ // @codeCoverageIgnoreEnd
17
+ /**
18
+ * Abstract class for a creatable folder item. It handles all general
19
+ * actions for a folder item. If you want to add an new folder type, have a
20
+ * look at the api function wp_rml_register_creatable();
21
+ *
22
+ * A new folder type MUST have the implementation with class FOLDERTYPE
23
+ * extends order\Sortable because every folder can also be sortable!
24
+ */
25
+ abstract class Creatable extends \MatthiasWeb\RealMediaLibrary\folder\BaseFolder implements
26
+ \MatthiasWeb\RealMediaLibrary\overrides\interfce\folder\IOverrideCreatable {
27
+ use FolderCreatable;
28
+ static $cachedOrders = null;
29
+ /**
30
+ * C'tor with the main properties.
31
+ *
32
+ * The constructor does not throw any errors because when it is fully filled with parameters
33
+ * it expects the right properties from the database.
34
+ *
35
+ * Only ::instance and ::create should create instances from this class!
36
+ *
37
+ * Synced with order\Sortable::__construct
38
+ *
39
+ * @param int $id
40
+ * @param int $parent
41
+ * @param string $name
42
+ * @param string $slug
43
+ * @param string $absolute
44
+ * @param int $order
45
+ * @param int $cnt
46
+ * @param array $row
47
+ * @throws \Exception
48
+ */
49
+ public function __construct(
50
+ $id,
51
+ $parent = -1,
52
+ $name = '',
53
+ $slug = '',
54
+ $absolute = '',
55
+ $order = -1,
56
+ $cnt = 0,
57
+ $row = []
58
+ ) {
59
+ // Check, if the folder type is defined in the right way
60
+ if (!$this instanceof \MatthiasWeb\RealMediaLibrary\order\Sortable) {
61
+ $className = \explode('\\', \get_class($this));
62
+ $className = $className[\count($className) - 1];
63
+ throw new \Exception(
64
+ "The folder type is defined in the wrong way! Please use the class definition:\n\n use " .
65
+ RML_NS .
66
+ "\\order; // use namespace\n class {$className} extends order\\Sortable { ... }\n\n... You can disable the sortable functionality by set the contentCustomOrder to 2 in the database."
67
+ );
68
+ }
69
+ // Set properties
70
+ $this->id = $id;
71
+ $this->parent = $parent;
72
+ $this->name = $name;
73
+ $this->cnt = $cnt >= 0 ? $cnt : 0;
74
+ $this->order = $order;
75
+ $this->children = [];
76
+ $this->slug = $slug;
77
+ $this->absolutePath = $absolute;
78
+ $this->owner = isset($row->owner) ? $row->owner : get_current_user_id();
79
+ $this->row = $row;
80
+ // Parse the restrictions
81
+ if (isset($row->restrictions) && \is_string($row->restrictions) && \strlen($row->restrictions) > 0) {
82
+ $this->restrictions = \explode(',', $row->restrictions);
83
+ $this->restrictionsCount = \count($this->restrictions);
84
+ }
85
+ }
86
+ // Documented in IFolderActions
87
+ public function read($order = null, $orderby = null) {
88
+ return self::xread($this->id, $order, $orderby);
89
+ }
90
+ // Documented in IFolderActions
91
+ public function insert($ids, $supress_validation = \false, $isShortcut = \false) {
92
+ $this->debug('Start moving files ' . \json_encode($ids) . " to {$this->id}...", __METHOD__);
93
+ if (\is_array($ids)) {
94
+ // Reset last shortcut ids
95
+ if ($isShortcut) {
96
+ \MatthiasWeb\RealMediaLibrary\attachment\Shortcut::getInstance()->_resetLastIds();
97
+ }
98
+ // Create posts cache to avoid multiple SQL queries in _wp_rml_synchronize_attachment
99
+ $cacheIds = [];
100
+ foreach ($ids as $value) {
101
+ if (!wp_cache_get($value, 'posts')) {
102
+ $cacheIds[] = $value;
103
+ }
104
+ }
105
+ if (\count($cacheIds) > 0) {
106
+ $this->debug('Get and cache the following post ids: ' . \implode(',', $cacheIds), __METHOD__);
107
+ get_posts(['numberposts' => -1, 'include' => $cacheIds]);
108
+ }
109
+ // Iterate all items
110
+ foreach ($ids as $value) {
111
+ $this->singleCheckInsert($value);
112
+ // Check if other fails are counted
113
+ if ($supress_validation === \false) {
114
+ $this->singleCheckInsertPermissions($value);
115
+ }
116
+ }
117
+ /**
118
+ * This action is fired before items gets moved to a specific folder.
119
+ * It allows you for example to throw an exception with an error message
120
+ * to cancel the movement.
121
+ *
122
+ * @param {int} $fid The destination folder id
123
+ * @param {int[]} $attachments The attachment post ids
124
+ * @param {IFolder} $folder The folder object
125
+ * @param {boolean} $isShortcut If true the attachments are copied to a folder
126
+ * @hook RML/Item/Move
127
+ */
128
+ do_action('RML/Item/Move', $this->id, $ids, $this, $isShortcut);
129
+ // Get the folder IDs of the attachments
130
+ $foldersToUpdate = wp_attachment_folder($ids);
131
+ $sourceFolders = $foldersToUpdate;
132
+ // Update the folder
133
+ foreach ($ids as $value) {
134
+ _wp_rml_synchronize_attachment($value, $this->id, $isShortcut);
135
+ }
136
+ // Update the count and shortcuts
137
+ $foldersToUpdate[] = $this->id;
138
+ wp_rml_update_count($foldersToUpdate);
139
+ // Finish
140
+ $this->debug("Successfully moved (isShortcut: {$isShortcut})", __METHOD__);
141
+ /**
142
+ * This action is fired after items gets moved to a specific folder.
143
+ *
144
+ * @param {int} $fid The destination folder id
145
+ * @param {int[]} $attachments The attachment post ids
146
+ * @param {IFolder} $folder The folder object
147
+ * @param {boolean} $isShortcut If true the attachments are copied to a folder
148
+ * @param {int[]} $sourceFolders The´source folder ids of the attachments (since 4.0.9)
149
+ * @hook RML/Item/MoveFinished
150
+ */
151
+ do_action('RML/Item/MoveFinished', $this->id, $ids, $this, $isShortcut, $sourceFolders);
152
+ \MatthiasWeb\RealMediaLibrary\Util::getInstance()->doActionAnyParentHas($this, 'Folder/Insert', [
153
+ $this->id,
154
+ $ids,
155
+ $this,
156
+ $isShortcut,
157
+ $sourceFolders
158
+ ]);
159
+ return \true;
160
+ } else {
161
+ throw new \Exception(__('You need to provide a set of files.', RML_TD));
162
+ }
163
+ }
164
+ /**
165
+ * Simply check, if an id can be inserted in this folder. If something is
166
+ * wrong with the id, please throw an exception!
167
+ *
168
+ * @param int $id The id
169
+ * @throws \Exception
170
+ */
171
+ protected function singleCheckInsertPermissions($id) {
172
+ /**
173
+ * Checks if an attachment can be inserted into a folder.
174
+ *
175
+ * @param {string[]} $errors An array of errors
176
+ * @param {int} $id The folder id
177
+ * @param {IFolder} $folder The folder object
178
+ * @hook RML/Validate/Insert
179
+ * @return {string[]} When the array has one or more items the movement is cancelled with the string message
180
+ */
181
+ $validation = apply_filters('RML/Validate/Insert', [], $id, $this);
182
+ if (\count($validation) > 0) {
183
+ throw new \Exception(\implode(' ', $validation));
184
+ }
185
+ }
186
+ /**
187
+ * Simply check, if an id can be inserted in this folder. If something is
188
+ * wrong with the id, please throw an exception!
189
+ *
190
+ * @param int $id The id
191
+ * @throws \Exception
192
+ */
193
+ protected function singleCheckInsert($id) {
194
+ // Silence is golden.
195
+ }
196
+ /**
197
+ * Persist the given creatable with the database. Think about it, that this only
198
+ * works, when the ID === -1 (that means, it will be a new folder).
199
+ *
200
+ * After the folder is created, this instance is useless, you must get the
201
+ * folder with the API wp_rml_get_by_id
202
+ *
203
+ * @throws \Exception
204
+ * @return integer ID of the newly created folder
205
+ */
206
+ public function persist() {
207
+ $this->debug('Persist to database...', __METHOD__);
208
+ if ($this->id === -1) {
209
+ global $wpdb;
210
+ $parentObj = $this->persistCheckParent();
211
+ // Create it!
212
+ $table_name = $this->getTableName();
213
+ $insert = $wpdb->insert($table_name, [
214
+ 'parent' => $this->parent,
215
+ 'slug' => $this->getSlug(),
216
+ 'name' => $this->name,
217
+ 'type' => $this->getType(),
218
+ 'ord' => $this->order > -1 ? $this->order : $parentObj->getMaxOrder() + 1,
219
+ 'restrictions' => \implode(',', \array_unique($this->restrictions)),
220
+ 'owner' => $this->owner
221
+ ]);
222
+ if ($insert !== \false) {
223
+ $this->id = $wpdb->insert_id;
224
+ $this->updateThisAndChildrensAbsolutePath();
225
+ wp_rml_structure_reset(null, \false);
226
+ /**
227
+ * A new folder is created.
228
+ *
229
+ * @param {int} $parent The parent folder id
230
+ * @param {string} $name The folder name
231
+ * @param {int} $type The folder type
232
+ * @param {int} $id The folder id
233
+ * @hook RML/Folder/Created
234
+ */
235
+ do_action('RML/Folder/Created', $this->parent, $this->name, $this->getType(), $this->id);
236
+ $this->debug('Successfully persisted creatable with id ' . $this->id, __METHOD__);
237
+ $this->applySubfolderOrderBy();
238
+ return $this->id;
239
+ } else {
240
+ throw new \Exception(__('The folder could not be created in the database.', RML_TD));
241
+ }
242
+ } else {
243
+ throw new \Exception(__('The folder could not be created because it already exists.', RML_TD));
244
+ }
245
+ }
246
+ // Documented in IFolderActions
247
+ public function updateThisAndChildrensAbsolutePath() {
248
+ // Update this absolute path
249
+ $this->getAbsolutePath(\true, \true);
250
+ // Update children
251
+ $childs = $this->getChildren();
252
+ if (\is_array($childs) && \count($childs) > 0) {
253
+ foreach ($childs as $key => $value) {
254
+ $value->updateThisAndChildrensAbsolutePath();
255
+ }
256
+ }
257
+ }
258
+ /**
259
+ * For internal usage only!
260
+ *
261
+ * @param object $children
262
+ * @internal
263
+ */
264
+ public function addChildren($children) {
265
+ $this->children[] = $children;
266
+ }
267
+ // Documented in IFolder
268
+ public function getMaxOrder() {
269
+ global $wpdb;
270
+ // phpcs:disable WordPress.DB.PreparedSQL
271
+ $table_name = $this->getTableName();
272
+ $order = $wpdb->get_var("SELECT MAX(ord) FROM {$table_name} WHERE parent={$this->id}");
273
+ // phpcs:enable WordPress.DB.PreparedSQL
274
+ return \is_numeric($order) ? $order : 0;
275
+ }
276
+ // Documented in IFolder
277
+ public function getRowData($field = null) {
278
+ if (\is_object($this->row)) {
279
+ if ($field === null) {
280
+ return $this->row;
281
+ } else {
282
+ return $this->row->{$field};
283
+ }
284
+ } else {
285
+ return \false;
286
+ }
287
+ }
288
+ // Documented in IFolder
289
+ public function getTypeName($default = null) {
290
+ /**
291
+ * Filter the description name for a custom folder type.
292
+ *
293
+ * @param {string} $name The name
294
+ * @param {int} $type The type
295
+ * @param {int} $fid The folder id
296
+ * @return {string}
297
+ * @hook RML/Folder/Type/Name
298
+ */
299
+ return apply_filters(
300
+ 'RML/Folder/Type/Name',
301
+ $default === null ? __('Folder', RML_TD) : $default,
302
+ $this->getType(),
303
+ $this->getId()
304
+ );
305
+ }
306
+ // Documented in IFolder
307
+ public function getTypeDescription($default = null) {
308
+ /**
309
+ * Filter the description for a custom folder type.
310
+ *
311
+ * @param {string} $description The description
312
+ * @param {int} $type The type
313
+ * @param {int} $fid The folder id
314
+ * @return {string}
315
+ * @hook RML/Folder/Type/Name
316
+ */
317
+ return apply_filters(
318
+ 'RML/Folder/Type/Description',
319
+ $default === null
320
+ ? __('A folder can contain every type of file or a collection, but not gallery.', RML_TD)
321
+ : $default,
322
+ $this->getType(),
323
+ $this->getId()
324
+ );
325
+ }
326
+ // Documented in IFolderActions
327
+ public function setVisible($visible) {
328
+ $this->visible = $visible;
329
+ }
330
+ // Documented in IFolder
331
+ public function setName($name, $supress_validation = \false) {
332
+ $this->debug("Try to set name of {$this->id} from '{$this->name}' to '{$name}'...", __METHOD__);
333
+ // Check valid folder name
334
+ if (!$this->isValidName($name)) {
335
+ // translators:
336
+ throw new \Exception(\sprintf(__("'%s' is not a valid folder name.", RML_TD), $name));
337
+ }
338
+ // Check, if the parent has already the given folder name
339
+ $parent = wp_rml_get_object_by_id($this->parent);
340
+ if ($parent !== null && $parent->hasChildren($name)) {
341
+ throw new \MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException($this->parent, $name);
342
+ }
343
+ if ($supress_validation === \false) {
344
+ /**
345
+ * Checks if a folder can be renamed.
346
+ *
347
+ * @param {string[]} $errors An array of errors
348
+ * @param {string} $name The new folder name
349
+ * @param {IFolder} $folder The folder object
350
+ * @hook RML/Validate/Rename
351
+ * @return {string[]} When the array has one or more items the rename process is cancelled with the string message
352
+ */
353
+ $validation = apply_filters('RML/Validate/Rename', [], $name, $this);
354
+ if (\count($validation) > 0) {
355
+ throw new \Exception(\implode(' ', $validation));
356
+ }
357
+ }
358
+ /**
359
+ * This action is called before a folder gets renamed.
360
+ *
361
+ * @param {string} $name The new folder name
362
+ * @param {IFolder} $folder The folder object
363
+ * @hook RML/Folder/Rename
364
+ * @since 4.0.7
365
+ */
366
+ do_action('RML/Folder/Rename', $name, $this);
367
+ $oldData = $this->getRowData();
368
+ $this->name = $name;
369
+ // Save in Database
370
+ if ($this->id > -1) {
371
+ global $wpdb;
372
+ $this->updateThisAndChildrensAbsolutePath();
373
+ // phpcs:disable WordPress.DB.PreparedSQL
374
+ $table_name = $this->getTableName();
375
+ $wpdb->query($wpdb->prepare("UPDATE {$table_name} SET name=%s WHERE id = %d", $name, $this->id));
376
+ // phpcs:enable WordPress.DB.PreparedSQL
377
+ /**
378
+ * This action is called when a folder was renamed.
379
+ *
380
+ * @param {string} $name The new folder name
381
+ * @param {IFolder} $folder The folder object
382
+ * @param {object} $oldData The old SQL row data (raw) of the folder
383
+ * @hook RML/Folder/Renamed
384
+ */
385
+ do_action('RML/Folder/Renamed', $name, $this, $oldData);
386
+ $this->debug('Successfully renamed and saved in database', __METHOD__);
387
+ } else {
388
+ $this->debug('Successfully setted the new name', __METHOD__);
389
+ $this->getAbsolutePath(\true, \true);
390
+ }
391
+ return \true;
392
+ }
393
+ /**
394
+ * Checks, if a given folder name is valid. The name is also sanitized so there can
395
+ * be no problem for physical moves for example.
396
+ *
397
+ * @param string $name The folder name
398
+ * @return boolean
399
+ */
400
+ public function isValidName($name) {
401
+ $name = \trim($name);
402
+ return \strlen($name) > 0 && !\in_array($name, $this->systemReservedFolders, \true);
403
+ }
404
+ /**
405
+ * Read ids for a given folder id.
406
+ *
407
+ * @param int $id The folder id (-1 for root)
408
+ * @param string $order The order
409
+ * @param string $orderby The order by
410
+ * @return array with ids
411
+ */
412
+ public static function xread($id, $order = null, $orderby = null) {
413
+ $args = [
414
+ 'post_status' => 'inherit',
415
+ 'post_type' => 'attachment',
416
+ 'posts_per_page' => -1,
417
+ 'rml_folder' => $id,
418
+ 'fields' => 'ids'
419
+ ];
420
+ // Set orders
421
+ if ($order !== null) {
422
+ $args['order'] = $order;
423
+ }
424
+ if ($orderby !== null) {
425
+ $args['orderby'] = $orderby;
426
+ }
427
+ /**
428
+ * Modify the query arguments to fetch attachments within a folder.
429
+ *
430
+ * @param {array} $query The query with post_status, post_type and rml_folder
431
+ * @hook RML/Folder/QueryArgs
432
+ * @return {array} The query
433
+ */
434
+ $args = apply_filters('RML/Folder/QueryArgs', $args);
435
+ $query = new \WP_Query($args);
436
+ $posts = $query->get_posts();
437
+ /**
438
+ * The folder content (attachments) is fetched.
439
+ *
440
+ * @param {int[]|WP_Post[]} $posts The posts
441
+ * @return {int[]|WP_Post[]}
442
+ * @hook RML/Folder/QueryResult
443
+ */
444
+ $posts = apply_filters('RML/Folder/QueryResult', $posts);
445
+ return $posts;
446
+ }
447
+ /**
448
+ * Get all available order methods for subfolders.
449
+ *
450
+ * @param boolean $asMap
451
+ * @return array
452
+ */
453
+ public static function getAvailableSubfolderOrders($asMap = \false) {
454
+ if (self::$cachedOrders === null) {
455
+ $orders = [
456
+ 'name_asc' => ['label' => __('Order by name ascending', RML_TD), 'sqlOrder' => 'rmlo.name'],
457
+ 'name_desc' => ['label' => __('Order by name descending', RML_TD), 'sqlOrder' => 'rmlo.name'],
458
+ 'id_asc' => ['label' => __('Order by ID ascending', RML_TD), 'sqlOrder' => 'rmlo.id'],
459
+ 'id_desc' => ['label' => __('Order by ID descending', RML_TD), 'sqlOrder' => 'rmlo.id']
460
+ ];
461
+ /**
462
+ * Add an available order criterium to the tree. If you pass
463
+ * user input to the SQL Order please be sure the values are escaped!
464
+ *
465
+ * @example
466
+ * $orders["id_asc"] = [
467
+ * "label" => __("Order by ID ascending", RML_TD),
468
+ * "sqlOrder" => "rml.ID"
469
+ * )
470
+ * @param {object[]} $orders The available orders
471
+ * @return {object[]}
472
+ * @hook RML/Tree/Orderby
473
+ * @since 4.4.0
474
+ */
475
+ self::$cachedOrders = apply_filters('RML/Tree/Orderby', $orders);
476
+ }
477
+ if ($asMap) {
478
+ $sortables = [];
479
+ foreach (self::$cachedOrders as $key => $value) {
480
+ $sortables[$key] = $value['label'];
481
+ }
482
+ return $sortables;
483
+ }
484
+ return self::$cachedOrders;
485
+ }
486
+ }
inc/folder/Folder.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\order\Sortable;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * This class creates a folder object. (Type 0)
12
+ * See parent classes / interfaces for better documentation.
13
+ */
14
+ class Folder extends \MatthiasWeb\RealMediaLibrary\order\Sortable {
15
+ // Documented in Creatable
16
+ public static function create($rowData) {
17
+ $result = new \MatthiasWeb\RealMediaLibrary\folder\Folder($rowData->id);
18
+ $result->setParent($rowData->parent);
19
+ $result->setName($rowData->name, $rowData->supress_validation);
20
+ $result->setRestrictions($rowData->restrictions);
21
+ return $result;
22
+ }
23
+ // Documented in Creatable
24
+ public static function instance($rowData) {
25
+ return new \MatthiasWeb\RealMediaLibrary\folder\Folder(
26
+ $rowData->id,
27
+ $rowData->parent,
28
+ $rowData->name,
29
+ $rowData->slug,
30
+ $rowData->absolute,
31
+ $rowData->ord,
32
+ $rowData->cnt_result,
33
+ $rowData
34
+ );
35
+ }
36
+ // Documented in Creatable
37
+ public function getAllowedChildrenTypes() {
38
+ /**
39
+ * Get allowed children folder types for a given folder type. $type can be
40
+ * replaced with RML_TYPE_FOLDER for example.
41
+ *
42
+ * @param {int[]} $allowed The allowed folder types
43
+ * @hook RML/Folder/Types/$type
44
+ * @return {int[]} The allowed folder types
45
+ */
46
+ return apply_filters('RML/Folder/Types/' . $this->getType(), [RML_TYPE_FOLDER, RML_TYPE_COLLECTION]);
47
+ }
48
+ // Documented in Creatable
49
+ public function getType() {
50
+ return RML_TYPE_FOLDER;
51
+ }
52
+ }
inc/folder/QueryCount.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\folder;
4
+
5
+ use WP_Query;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * Get the count of WP_Query resultset instead of all the rows.
12
+ */
13
+ class QueryCount extends \WP_Query {
14
+ /**
15
+ * C'tor.
16
+ *
17
+ * @param string[] $args
18
+ */
19
+ public function __construct($args = []) {
20
+ add_filter('posts_request', [$this, 'posts_request'], 999999);
21
+ add_filter('posts_orderby', [$this, 'posts_orderby'], 999999);
22
+ add_filter('post_limits', [$this, 'post_limits'], 999999);
23
+ add_action('pre_get_posts', [$this, 'pre_get_posts'], 999999);
24
+ parent::__construct($args);
25
+ }
26
+ // Documented in \WP_Query
27
+ public function count() {
28
+ if (isset($this->posts[0])) {
29
+ return $this->posts[0];
30
+ }
31
+ return '';
32
+ }
33
+ // Documented in \WP_Query
34
+ public function posts_request($request) {
35
+ remove_filter(current_filter(), [$this, __FUNCTION__], 999999);
36
+ $sql = \sprintf('SELECT COUNT(*) FROM ( %s ) as t', $request);
37
+ return $sql;
38
+ }
39
+ // Documented in \WP_Query
40
+ public function pre_get_posts($q) {
41
+ $q->query_vars['fields'] = 'ids';
42
+ remove_action(current_filter(), [$this, __FUNCTION__], 999999);
43
+ }
44
+ // Documented in \WP_Query
45
+ public function post_limits($limits) {
46
+ remove_filter(current_filter(), [$this, __FUNCTION__], 999999);
47
+ return '';
48
+ }
49
+ // Documented in \WP_Query
50
+ public function posts_orderby($orderby) {
51
+ remove_filter(current_filter(), [$this, __FUNCTION__], 999999);
52
+ return '';
53
+ }
54
+ }
inc/folder/Root.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
6
+ use MatthiasWeb\RealMediaLibrary\order\Sortable;
7
+ use Exception;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * This class creates a root object. (Type 4)
14
+ * See parent classes / interfaces for better documentation.
15
+ */
16
+ class Root extends \MatthiasWeb\RealMediaLibrary\order\Sortable {
17
+ private static $me = null;
18
+ // Documented in IFolder
19
+ public function __construct() {
20
+ parent::__construct(-1, null, '/' . __('Unorganized', RML_TD), '/', '/');
21
+ }
22
+ // Documented in IFolder
23
+ public function persist() {
24
+ throw new \Exception('You cannot persist the root folder.');
25
+ }
26
+ // Documented in IFolder
27
+ public function getSlug($force = \false, $fromSetName = \false) {
28
+ return $this->slug;
29
+ }
30
+ // Documented in IFolder
31
+ public function getAbsolutePath($force = \false, $fromSetName = \false) {
32
+ return $this->absolutePath;
33
+ }
34
+ // Documented in IFolder
35
+ public function getCnt($forceReload = \false) {
36
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getCntRoot();
37
+ }
38
+ // Documented in IFolder
39
+ public function setParent($id, $ord = -1, $force = \false) {
40
+ throw new \Exception('You cannot set a parent for the root folder.');
41
+ }
42
+ // Documented in IFolder
43
+ public function setName($name, $supress_validation = \false) {
44
+ throw new \Exception('You cannot set a name for the root folder.');
45
+ }
46
+ // Documented in IFolder
47
+ public function setRestrictions($restrictions = []) {
48
+ throw new \Exception('You cannot set permissions for the root folder.');
49
+ }
50
+ // Documented in IFolder
51
+ public function getChildren() {
52
+ return \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getTree();
53
+ }
54
+ // Documented in IFolder
55
+ public function getAllowedChildrenTypes() {
56
+ // already documented
57
+ return apply_filters('RML/Folder/Types/' . $this->getType(), [RML_TYPE_FOLDER, RML_TYPE_COLLECTION]);
58
+ }
59
+ // Documented in IFolder
60
+ public function getType() {
61
+ return RML_TYPE_ROOT;
62
+ }
63
+ // Documented in IFolder
64
+ public function getContentCustomOrder() {
65
+ return 2;
66
+ }
67
+ // Documented in IFolder
68
+ public function getTypeName($default = null) {
69
+ return parent::getTypeName($default === null ? __('Unorganized', RML_TD) : $default);
70
+ }
71
+ // Documented in IFolder
72
+ public function getTypeDescription($default = null) {
73
+ return parent::getTypeDescription(
74
+ $default === null
75
+ ? __(
76
+ 'Unorganized is the same as a root folder. Here you can find all files which are not assigned to a folder.',
77
+ RML_TD
78
+ )
79
+ : $default
80
+ );
81
+ }
82
+ /**
83
+ * Get instance.
84
+ *
85
+ * @return Root
86
+ */
87
+ public static function getInstance() {
88
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\folder\Root()) : self::$me;
89
+ }
90
+ }
inc/folder/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/metadata/CommonFolderTrait.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\metadata;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * Trait common folder meta helper methods.
12
+ *
13
+ * @since 4.0.8
14
+ */
15
+ trait CommonFolderTrait {
16
+ use CommonTrait;
17
+ /**
18
+ * Gets (and persists) a checkbox to the folder metadata.
19
+ *
20
+ * @param string $meta The meta key
21
+ * @param IFolder $folder The folder
22
+ * @param boolean $persist If set it will be updated or deleted
23
+ * @return boolean
24
+ */
25
+ protected static function is($meta, $folder, $persist = null) {
26
+ if ($persist !== null) {
27
+ if ($persist) {
28
+ $update = update_media_folder_meta($folder->getId(), $meta, $persist);
29
+ return $update > 0 || $update;
30
+ } else {
31
+ return delete_media_folder_meta($folder->getId(), $meta);
32
+ }
33
+ }
34
+ return (bool) get_media_folder_meta($folder->getId(), $meta, \true);
35
+ }
36
+ }
inc/metadata/CommonTrait.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\metadata;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ /**
10
+ * Trait common folder meta and user settings helper methods.
11
+ *
12
+ * @since 4.0.8
13
+ */
14
+ trait CommonTrait {
15
+ /**
16
+ * Reload the current selected folder after the metadata is successfully saved.
17
+ *
18
+ * @param string[] $response
19
+ */
20
+ private function reloadAfterSave(&$response) {
21
+ if (!isset($response['data']['reload']) || $response['data']['reload'] === \false) {
22
+ $response['data']['reload'] = \true;
23
+ }
24
+ }
25
+ /**
26
+ * Reload the current document if the `body` has a given class. This allows you e.g. to
27
+ * only reload in Media Library view instead of while editing a post.
28
+ *
29
+ * @param string[] $response
30
+ * @param string $class
31
+ */
32
+ private function hardReloadAfterSaveIfBodyHasClass(&$response, $class) {
33
+ if (
34
+ !isset($response['data']['hardReloadIfBodyHasClass']) ||
35
+ $response['data']['hardReloadIfBodyHasClass'] === \false
36
+ ) {
37
+ $response['data']['hardReloadIfBodyHasClass'] = $class;
38
+ }
39
+ }
40
+ }
inc/metadata/CoverImage.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\metadata;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ use MatthiasWeb\RealMediaLibrary\api\IMetadata;
7
+ use MatthiasWeb\RealMediaLibrary\Assets;
8
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
9
+ use WP_REST_Request;
10
+ // @codeCoverageIgnoreStart
11
+ \defined('ABSPATH') or die('No script kiddies please!');
12
+ // Avoid direct file request
13
+ // @codeCoverageIgnoreEnd
14
+ /**
15
+ * Implements a cover image for root folder, collections, galleries and normal folders.
16
+ */
17
+ class CoverImage implements \MatthiasWeb\RealMediaLibrary\api\IMetadata {
18
+ use UtilsProvider;
19
+ /**
20
+ * C'tor.
21
+ */
22
+ public function __construct() {
23
+ add_action('delete_attachment', [$this, 'delete_attachment']);
24
+ add_action('wp_ajax_get-attachment-by-url', [$this, 'ajax_get_attachment_by_url'], 15);
25
+ }
26
+ /**
27
+ * Get attachment id by URL via admin-ajax.php.
28
+ *
29
+ * @see https://www.npmjs.com/package/wp-media-picker#implement-additional-ajax-function
30
+ */
31
+ public function ajax_get_attachment_by_url() {
32
+ if (!isset($_REQUEST['url'])) {
33
+ wp_send_json_error();
34
+ }
35
+ $id = attachment_url_to_postid($_REQUEST['url']);
36
+ if (!$id) {
37
+ wp_send_json_error();
38
+ }
39
+ $_REQUEST['id'] = $id;
40
+ wp_ajax_get_attachment();
41
+ die();
42
+ }
43
+ /**
44
+ * An attachment gets deleted, so delete meta, too.
45
+ *
46
+ * @param int $postid
47
+ */
48
+ public function delete_attachment($postid) {
49
+ delete_metadata('realmedialibrary', null, 'coverImage', $postid, \true);
50
+ }
51
+ /**
52
+ * Enqueue scripts.
53
+ *
54
+ * @param Assets $assets
55
+ */
56
+ public function scripts($assets) {
57
+ if ($this->isDisabled()) {
58
+ return;
59
+ }
60
+ $assets->enqueueLibraryScript(
61
+ 'wp-media-picker',
62
+ 'wp-media-picker/wp-media-picker.min.js',
63
+ ['underscore', 'media-views'],
64
+ \true
65
+ );
66
+ $assets->enqueueLibraryStyle('wp-media-picker', 'wp-media-picker/wp-media-picker.min.css');
67
+ }
68
+ /**
69
+ * Generate content for meta box.
70
+ *
71
+ * @param string $content
72
+ * @param IFolder $folder
73
+ */
74
+ public function content($content, $folder) {
75
+ if ($this->isDisabled()) {
76
+ return __('This option is disabled on this page. Please navigate to the media library.', RML_TD);
77
+ }
78
+ $id = $this->getAttachmentID($folder->getId());
79
+ return $content .
80
+ '<label>' .
81
+ __('Cover image', RML_TD) .
82
+ '</label><input name="coverImage" data-wprfc-visible="1" data-wprfc="metaCoverImage" value="' .
83
+ esc_attr($id) .
84
+ '" type="text" />';
85
+ }
86
+ /**
87
+ * Save content in meta box.
88
+ *
89
+ * @param string[] $response
90
+ * @param IFolder $folder
91
+ * @param WP_REST_Request $request
92
+ * @return string[]
93
+ */
94
+ public function save($response, $folder, $request) {
95
+ $fid = $folder->getId();
96
+ $coverImage = $this->getAttachmentID($fid);
97
+ $new = (int) $request->get_param('coverImage');
98
+ if ($coverImage !== $new) {
99
+ if (wp_attachment_is_image($new)) {
100
+ update_media_folder_meta($fid, 'coverImage', $new);
101
+ } else {
102
+ // Delete it
103
+ delete_media_folder_meta($fid, 'coverImage');
104
+ }
105
+ }
106
+ return $response;
107
+ }
108
+ /**
109
+ * WP Media Picker is not compatible with Thrive Quiz Builder so disable this meta in this view.
110
+ */
111
+ public function isDisabled() {
112
+ return isset($_GET['post_type'], $_GET['tge']) && $_GET['post_type'] === 'tqb_quiz' && $_GET['tge'] === 'true';
113
+ }
114
+ /**
115
+ * Get attachment ID if cover image is set.
116
+ *
117
+ * @param int $fid
118
+ * @return int
119
+ */
120
+ public function getAttachmentID($fid) {
121
+ return (int) get_media_folder_meta($fid, 'coverImage', \true);
122
+ }
123
+ }
inc/metadata/Description.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\metadata;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IMetadata;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * Implements a description field.
12
+ */
13
+ class Description implements \MatthiasWeb\RealMediaLibrary\api\IMetadata {
14
+ /**
15
+ * Get description if set.
16
+ *
17
+ * @param int $folder_id
18
+ * @return string
19
+ */
20
+ public function getDescription($folder_id) {
21
+ return get_media_folder_meta($folder_id, 'description', \true);
22
+ }
23
+ /**
24
+ * Generate content for meta box.
25
+ *
26
+ * @param string $content
27
+ * @param IFolder $folder
28
+ */
29
+ public function content($content, $folder) {
30
+ $description = $this->getDescription($folder->getId());
31
+ $content .=
32
+ '<label>' .
33
+ __('Description') .
34
+ '</label><textarea name="description" class="regular-text">' .
35
+ esc_textarea($description) .
36
+ '</textarea>';
37
+ return $content;
38
+ }
39
+ /**
40
+ * Save content in meta box.
41
+ *
42
+ * @param string[] $response
43
+ * @param IFolder $folder
44
+ * @param WP_REST_Request $request
45
+ * @return string[]
46
+ */
47
+ public function save($response, $folder, $request) {
48
+ $fid = $folder->getId();
49
+ $description = $this->getDescription($fid);
50
+ $new = $request->get_param('description');
51
+ if (isset($new) && $new !== $description) {
52
+ if (\strlen($new) > 0) {
53
+ update_media_folder_meta($fid, 'description', $new);
54
+ } else {
55
+ // Delete it
56
+ delete_media_folder_meta($fid, 'description');
57
+ }
58
+ }
59
+ return $response;
60
+ }
61
+ /**
62
+ * Enqueue scripts.
63
+ *
64
+ * @param Assets $assets
65
+ */
66
+ public function scripts($assets) {
67
+ // Silence is golden.
68
+ }
69
+ }
inc/metadata/Meta.php ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\metadata;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IMetadata;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ use MatthiasWeb\RealMediaLibrary\Core;
9
+ // @codeCoverageIgnoreStart
10
+ \defined('ABSPATH') or die('No script kiddies please!');
11
+ // Avoid direct file request
12
+ // @codeCoverageIgnoreEnd
13
+ /**
14
+ * Create general functionality for the custom folder fields.
15
+ *
16
+ * For an example see the function-doc of this::content_general and this::save_general
17
+ */
18
+ class Meta implements \MatthiasWeb\RealMediaLibrary\api\IMetadata {
19
+ use UtilsProvider;
20
+ private static $me = null;
21
+ private $view = null;
22
+ private $boxes = [];
23
+ /**
24
+ * C'tor.
25
+ */
26
+ private function __construct() {
27
+ // Add our folder meta table to wpdb
28
+ global $wpdb;
29
+ if (!isset($wpdb->realmedialibrary_meta)) {
30
+ $wpdb->realmedialibrarymeta = \MatthiasWeb\RealMediaLibrary\Core::tableName('meta');
31
+ }
32
+ $this->view = \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getView();
33
+ }
34
+ // Documented in IMetadata
35
+ public function content($content, $folder) {
36
+ $type = $folder->getType();
37
+ if ($type !== RML_TYPE_ROOT) {
38
+ $content .= '<label>' . __('Path', RML_TD) . '</label>' . $folder->getPath(' > ') . '';
39
+ }
40
+ $content .=
41
+ '<label>' .
42
+ __('Folder type', RML_TD) .
43
+ '</label>' .
44
+ $folder->getTypeName() .
45
+ ' <i>' .
46
+ $folder->getTypeDescription() .
47
+ '</i>';
48
+ return $content;
49
+ }
50
+ // Documented in IMetadata
51
+ public function save($response, $folder, $request) {
52
+ return $response;
53
+ }
54
+ // Documented in IMetadata
55
+ public function scripts($assets) {
56
+ // Silence is golden.
57
+ }
58
+ /**
59
+ * Prepare the whole content for a single meta box.
60
+ *
61
+ * @param int $fid
62
+ */
63
+ public function prepare_content($fid) {
64
+ $folder = null;
65
+ $inputID = 'all';
66
+ $type = RML_TYPE_ALL;
67
+ if (!empty($fid)) {
68
+ $folder = wp_rml_get_object_by_id($fid);
69
+ $inputID = $folder->getId();
70
+ $type = $folder->getType();
71
+ if ($folder === null) {
72
+ return '404';
73
+ }
74
+ }
75
+ /**
76
+ * Add a tab group to the folder details or user settings dialog.
77
+ * You cam use this function together with add_rml_meta_box()
78
+ * or add_rml_user_settings_box(). Allowed $types: "User/Settings"|"Folder/Meta".
79
+ *
80
+ * @param {array} $tabs The tabs with key (unique tab name) and value (display text)
81
+ * @hook RML/$type/Groups
82
+ * @return {array} The tabs
83
+ * @since 3.3
84
+ */
85
+ $tabs = apply_filters('RML/' . ($type === RML_TYPE_ALL ? 'User/Settings' : 'Folder/Meta') . '/Groups', [
86
+ 'general' => __('General', RML_TD)
87
+ ]);
88
+ // Create content form
89
+ $content =
90
+ '<form method="POST" action="">
91
+ <input type="hidden" name="folderId" value="' .
92
+ $inputID .
93
+ '" />
94
+ <input type="hidden" name="folderType" value="' .
95
+ $type .
96
+ '" />
97
+ <ul class="rml-meta-errors"></ul>';
98
+ // Create groups
99
+ foreach ($tabs as $key => $value) {
100
+ $content .= '<h3>' . $value . '</h3>';
101
+ $hookAddition = $key === 'general' ? '' : '/' . $key;
102
+ // Create group content
103
+ if ($type === RML_TYPE_ALL) {
104
+ /**
105
+ * Add content to the general settings. Do not use this filter directly instead use the
106
+ * add_rml_user_settings_box() function! If you want to add content to the "General" tab you
107
+ * can use the filter `RML/User/Settings/Content`.
108
+ *
109
+ * @param {string} $content The HTML content
110
+ * @param {int} $user The current user id
111
+ * @hook RML/User/Settings/Content/$tabGroup
112
+ * @return {string} The HTML content
113
+ * @since 3.2
114
+ */
115
+ $content .= apply_filters('RML/User/Settings/Content' . $hookAddition, '', get_current_user_id());
116
+ } else {
117
+ /**
118
+ * Add content to the folder metabox. Do not use this filter directly instead use the
119
+ * add_rml_meta_box() function! If you want to add content to the "General" tab you
120
+ * can use the filter `RML/Folder/Meta/Content`.
121
+ *
122
+ * @param {string} $content The HTML content
123
+ * @param {IFolder} $folder The folder object
124
+ * @hook RML/Folder/Meta/Content/$tabGroup
125
+ * @return {string} The HTML content
126
+ * @since 3.3.1 $folder can never be null
127
+ */
128
+ $content .= apply_filters('RML/Folder/Meta/Content' . $hookAddition, '', $folder);
129
+ }
130
+ }
131
+ $content .= '</form>';
132
+ return $content;
133
+ }
134
+ /**
135
+ * Add meta box.
136
+ *
137
+ * @param string $name
138
+ * @param IMetadata $instance
139
+ * @return boolean
140
+ */
141
+ public function add($name, $instance) {
142
+ if ($this->get($name) !== null) {
143
+ return \false;
144
+ } else {
145
+ $this->boxes[$name] = $instance;
146
+ return \true;
147
+ }
148
+ }
149
+ /**
150
+ * Get meta box instance.
151
+ *
152
+ * @param string $name
153
+ * @return IMetadata|null
154
+ */
155
+ public function get($name) {
156
+ foreach ($this->boxes as $key => $value) {
157
+ if ($key === $name) {
158
+ return $value;
159
+ }
160
+ }
161
+ return null;
162
+ }
163
+ /**
164
+ * Check if a meta box exists by name.
165
+ *
166
+ * @param string $name
167
+ * @return boolean
168
+ */
169
+ public function exists($name) {
170
+ return $this->get($name) !== null;
171
+ }
172
+ /**
173
+ * When a folder gets deleted, also delete meta.
174
+ *
175
+ * @param int $fid
176
+ * @param mixed $oldData
177
+ */
178
+ public function folder_deleted($fid, $oldData) {
179
+ truncate_media_folder_meta($fid);
180
+ }
181
+ /**
182
+ * Get instance.
183
+ *
184
+ * @return Meta
185
+ */
186
+ public static function getInstance() {
187
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\metadata\Meta()) : self::$me;
188
+ }
189
+ }
inc/metadata/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/order/Sortable.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\order;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\folder\Creatable;
6
+ use MatthiasWeb\RealMediaLibrary\lite\order\Sortable as OrderSortable;
7
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\order\IOverrideSortable;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ /**
13
+ * Handles the sortable content in the folder. The methods of this class contains
14
+ * always the keyword "content".
15
+ */
16
+ abstract class Sortable extends \MatthiasWeb\RealMediaLibrary\folder\Creatable implements
17
+ \MatthiasWeb\RealMediaLibrary\overrides\interfce\order\IOverrideSortable {
18
+ use OrderSortable;
19
+ static $cachedContentOrders = null;
20
+ // Documented in Creatable
21
+ public function __construct(
22
+ $id,
23
+ $parent = -1,
24
+ $name = '',
25
+ $slug = '',
26
+ $absolute = '',
27
+ $order = -1,
28
+ $cnt = 0,
29
+ $row = []
30
+ ) {
31
+ $this->contentCustomOrder = isset($row->contentCustomOrder) ? \intval($row->contentCustomOrder) : 2;
32
+ // Parent constructor
33
+ parent::__construct($id, $parent, $name, $slug, $absolute, $order, $cnt, $row);
34
+ }
35
+ // Documented in IFolderContent
36
+ public function isContentCustomOrderAllowed() {
37
+ return $this->getContentCustomOrder() !== 2;
38
+ }
39
+ // Documented in IFolderContent
40
+ public function getContentCustomOrder() {
41
+ return $this->contentCustomOrder;
42
+ }
43
+ // Documented in IFolderContent
44
+ public function forceContentCustomOrder() {
45
+ return \false;
46
+ }
47
+ // Documented in IFolderContent
48
+ public function postsClauses($pieces) {
49
+ return \false;
50
+ }
51
+ /**
52
+ * Get all available order methods.
53
+ *
54
+ * @param boolean $asMap
55
+ * @return array
56
+ */
57
+ public static function getAvailableContentOrders($asMap = \false) {
58
+ if (self::$cachedContentOrders === null) {
59
+ $orders = [
60
+ 'date_asc' => ['label' => __('Order by date ascending', RML_TD), 'sqlOrder' => 'wp.post_date'],
61
+ 'date_desc' => ['label' => __('Order by date descending', RML_TD), 'sqlOrder' => 'wp.post_date'],
62
+ 'title_asc' => ['label' => __('Order by title ascending', RML_TD), 'sqlOrder' => 'wp.post_title'],
63
+ 'title_desc' => ['label' => __('Order by title descending', RML_TD), 'sqlOrder' => 'wp.post_title'],
64
+ 'filename_asc' => [
65
+ 'label' => __('Order by filename ascending', RML_TD),
66
+ 'sqlOrder' => "SUBSTRING_INDEX(wp.guid, '/', -1)"
67
+ ],
68
+ 'filename_desc' => [
69
+ 'label' => __('Order by filename descending', RML_TD),
70
+ 'sqlOrder' => "SUBSTRING_INDEX(wp.guid, '/', -1)"
71
+ ],
72
+ 'filenameNat_asc' => [
73
+ 'label' => __('Natural order by filename ascending', RML_TD),
74
+ 'sqlOrder' => "LENGTH(SUBSTRING_INDEX(wp.guid, '/', -1)), SUBSTRING_INDEX(wp.guid, '/', -1)"
75
+ ],
76
+ 'filenameNat_desc' => [
77
+ 'label' => __('Natural order by filename descending', RML_TD),
78
+ 'sqlOrder' => "LENGTH(SUBSTRING_INDEX(wp.guid, '/', -1)) desc, SUBSTRING_INDEX(wp.guid, '/', -1)"
79
+ ],
80
+ 'id_asc' => ['label' => __('Order by ID ascending', RML_TD), 'sqlOrder' => 'wp.ID'],
81
+ 'id_desc' => ['label' => __('Order by ID descending', RML_TD), 'sqlOrder' => 'wp.ID']
82
+ ];
83
+ /**
84
+ * Add an available order criterium to folder content. If you pass
85
+ * user input to the SQL Order please be sure the values are escaped!
86
+ *
87
+ * @example
88
+ * $orders["id_asc"] = [
89
+ * "label" => __("Order by ID ascending", RML_TD),
90
+ * "sqlOrder" => "wp.ID"
91
+ * )
92
+ * @param {object[]} $orders The available orders
93
+ * @return {object[]}
94
+ * @hook RML/Order/Orderby
95
+ */
96
+ self::$cachedContentOrders = apply_filters('RML/Order/Orderby', $orders);
97
+ }
98
+ if ($asMap) {
99
+ $sortables = [];
100
+ foreach (self::$cachedContentOrders as $key => $value) {
101
+ $sortables[$key] = $value['label'];
102
+ }
103
+ return $sortables;
104
+ }
105
+ return self::$cachedContentOrders;
106
+ }
107
+ }
inc/order/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/interfce/IOverrideCore.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\ICore;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ interface IOverrideCore extends \MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\ICore {
11
+ /**
12
+ * Additional constructor.
13
+ */
14
+ public function overrideConstruct();
15
+ /**
16
+ * Additional init.
17
+ */
18
+ public function overrideInit();
19
+ /**
20
+ * Set and/or get the value if the license notice is dismissed.
21
+ *
22
+ * @param boolean $set
23
+ * @return boolean
24
+ */
25
+ public function isLicenseNoticeDismissed($set = null);
26
+ /**
27
+ * Get the updater instance.
28
+ *
29
+ * @see https://github.com/matzeeable/wordpress-plugin-updater
30
+ */
31
+ public function getUpdater();
32
+ }
inc/overrides/interfce/comp/IOverrideExImport.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\comp;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ interface IOverrideExImport {
10
+ /**
11
+ * Import a taxonomy with relationships.
12
+ *
13
+ * @param string $tax
14
+ */
15
+ public function importTaxonomy($tax);
16
+ /**
17
+ * Import from "Media Library Folders".
18
+ */
19
+ public function importMlf();
20
+ /**
21
+ * Import from "FileBird".
22
+ */
23
+ public function importFileBird();
24
+ /**
25
+ * Search the wp_realmedialibrary_posts table for importData contains ","
26
+ * and then create the shortcuts for the splitted "," folders.
27
+ */
28
+ public function importShortcuts();
29
+ /**
30
+ * Import a tree with __children array and __metas array recursively.
31
+ *
32
+ * @param array $tree
33
+ */
34
+ public function import($tree);
35
+ }
inc/overrides/interfce/comp/IOverrideWPML.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\comp;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ interface IOverrideWPML {
10
+ // Most methods Defined in IFolder interface.
11
+ }
inc/overrides/interfce/comp/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/interfce/folder/IOverrideCRUD.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\folder;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ interface IOverrideCRUD {
10
+ // Documented in wp_rml_create_p()
11
+ public function createRecursively($name, $parent, $type, $restrictions = [], $supress_validation = \false);
12
+ }
inc/overrides/interfce/folder/IOverrideCreatable.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IFolder;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ interface IOverrideCreatable {
11
+ /**
12
+ * Additional checks before creating a folder.
13
+ *
14
+ * @return IFolder
15
+ */
16
+ public function persistCheckParent();
17
+ }
inc/overrides/interfce/folder/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/interfce/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/interfce/order/IOverrideSortable.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\order;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ interface IOverrideSortable {
10
+ // Most methods Defined in IFolder interface.
11
+ }
inc/overrides/interfce/order/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/interfce/rest/IOverrideFolder.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\rest;
4
+
5
+ use WP_Error;
6
+ use WP_REST_Request;
7
+ use WP_REST_Response;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ interface IOverrideFolder {
13
+ /**
14
+ * See API docs.
15
+ *
16
+ * @param WP_REST_Request $request
17
+ * @return WP_REST_Response|WP_Error
18
+ *
19
+ * @api {post} /realmedialibrary/v1/folders Create a new folder
20
+ * @apiParam {string} name The new name for the folder
21
+ * @apiParam {int} parent The parent
22
+ * @apiParam {string} type The folder type
23
+ * @apiName DeleteFolder
24
+ * @apiGroup Folder
25
+ * @apiVersion 1.0.0
26
+ * @apiPermission upload_files
27
+ * @apiSince 4.12.1 This function ignores the `parent` parameter in Lite version as creating subfolders is no longer supported
28
+ */
29
+ public function createItem($request);
30
+ }
inc/overrides/interfce/rest/IOverrideService.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\rest;
4
+
5
+ use WP_Error;
6
+ use WP_REST_Request;
7
+ use WP_REST_Response;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ interface IOverrideService {
13
+ /**
14
+ * See API docs.
15
+ *
16
+ * @param WP_REST_Request $request
17
+ * @return WP_REST_Response|WP_Error
18
+ *
19
+ * @api {put} /realmedialibrary/v1/hierarchy/:id Change a folder position within the hierarchy
20
+ * @apiParam {int} id The folder id
21
+ * @apiParam {int} parent The parent
22
+ * @apiParam {int} nextId The next id to the folder
23
+ * @apiName PutHierarchy
24
+ * @apiGroup Tree
25
+ * @apiVersion 1.0.0
26
+ * @apiPermission upload_files
27
+ * @apiSince 4.12.1 This function ignores the `parent` parameter in Lite version as creating subfolders is no longer supported
28
+ */
29
+ public function routeHierarchy($request);
30
+ }
inc/overrides/interfce/rest/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/interfce/usersettings/IOverrideDefaultFolder.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\overrides\interfce\usersettings;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ interface IOverrideDefaultFolder {
10
+ /**
11
+ * Additional constructor.
12
+ */
13
+ public function overrideConstruct();
14
+ // Documented in IMetadata
15
+ public function overrideSave($response, $user, $request);
16
+ }
inc/overrides/interfce/usersettings/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/lite/Core.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Vendor\DevOwl\Freemium\CoreLite;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ trait Core {
11
+ use CoreLite;
12
+ // Documented in IOverrideCore
13
+ public function overrideConstruct() {
14
+ // Silence is golden.
15
+ }
16
+ // Documented in IOverrideCore
17
+ public function overrideInit() {
18
+ // Silence is golden.
19
+ }
20
+ // Documented in IOverrideCore
21
+ public function isLicenseNoticeDismissed($set = null) {
22
+ return \true;
23
+ // Always dismissed in Lite version
24
+ }
25
+ // Documented in IOverrideCore
26
+ public function getUpdater() {
27
+ return null;
28
+ // wordpress.org updater is used
29
+ }
30
+ }
inc/overrides/lite/comp/ExImport.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\comp;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ trait ExImport {
11
+ // Documented in IOverrideExImport
12
+ public function importTaxonomy($tax) {
13
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
14
+ }
15
+ // Documented in IOverrideExImport
16
+ public function importMlf() {
17
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
18
+ }
19
+ // Documented in IOverrideExImport
20
+ public function importFileBird() {
21
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
22
+ }
23
+ // Documented in IOverrideExImport
24
+ public function importShortcuts() {
25
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
26
+ }
27
+ // Documented in IOverrideExImport
28
+ public function import($tree) {
29
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
30
+ }
31
+ }
inc/overrides/lite/comp/WPML.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\comp;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ trait WPML {
10
+ // Documented in IOverrideWPML
11
+ public function overrideInit() {
12
+ // Silence is golden.
13
+ }
14
+ }
inc/overrides/lite/comp/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/lite/folder/CRUD.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\folder;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ trait CRUD {
11
+ // Documented in wp_rml_create_p()
12
+ public function createRecursively($name, $parent, $type, $restrictions = [], $supress_validation = \false) {
13
+ return new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
14
+ }
15
+ }
inc/overrides/lite/folder/Creatable.php ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\folder;
4
+
5
+ use Exception;
6
+ use MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException;
7
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
8
+ use MatthiasWeb\RealMediaLibrary\Util;
9
+ // @codeCoverageIgnoreStart
10
+ \defined('ABSPATH') or die('No script kiddies please!');
11
+ // Avoid direct file request
12
+ // @codeCoverageIgnoreEnd
13
+ trait Creatable {
14
+ // Documented in IFolderActions
15
+ public function resetSubfolderOrder() {
16
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
17
+ }
18
+ // Documented in IFolderActions
19
+ public function orderSubfolders($orderby, $writeMetadata = \true) {
20
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
21
+ }
22
+ // Documented in IFolderActions
23
+ protected function applySubfolderOrderBy() {
24
+ return \false;
25
+ }
26
+ // Documented in IOverrideCreatable
27
+ public function persistCheckParent() {
28
+ // The Lite version can currently not handle hierarchical folders
29
+ if ($this->parent > -1) {
30
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
31
+ }
32
+ }
33
+ // Documented in IFolderActions
34
+ public function reindexChildrens($resetData = \false) {
35
+ return \false;
36
+ }
37
+ // Documented in IFolder
38
+ public function isValidChildrenType($type) {
39
+ // In Lite version we can only have subfolders in Unorganized, so allow all folder types
40
+ return \true;
41
+ }
42
+ // Documented in IFolderActions
43
+ public function setParent($id, $ord = -1, $force = \false) {
44
+ // Always root as the Lite version does not support subfolders
45
+ $rootFolderId = _wp_rml_root();
46
+ $rootFolder = wp_rml_get_object_by_id($rootFolderId);
47
+ $this->debug("Try to set parent of {$this->id} from {$this->parent} to {$rootFolderId}...", __METHOD__);
48
+ // Get the parent object
49
+ if ($rootFolderId === $this->parent) {
50
+ $this->debug('The parent is the same, probably only the order is changed...', __METHOD__);
51
+ } elseif ($rootFolder->hasChildren($this->name)) {
52
+ // For backwards compatibility (4.12.0) we need to do this checks in Lite version, too
53
+ // Check, if the parent has already the given folder name
54
+ throw new \MatthiasWeb\RealMediaLibrary\exception\FolderAlreadyExistsException($rootFolderId, $this->name);
55
+ }
56
+ $newOrder = $ord > -1 ? $ord : $rootFolder->getMaxOrder() + 1;
57
+ $isRelocate = $rootFolderId === $this->parent;
58
+ /**
59
+ * This action is called when a folder was relocated in the folder tree. That
60
+ * means the parent was not changed, only the order was changed.
61
+ *
62
+ * @param {IFolder} $folder The folder object
63
+ * @param {int} $id The new parent folder id
64
+ * @param {int} $order The (new) order number
65
+ * @param {boolean} $force If true the relocating was forced
66
+ * @hook RML/Folder/Relocate
67
+ * @since 4.0.7
68
+ */
69
+ // For backwards compatibility (4.12.0) we need the other action, too
70
+ do_action($isRelocate ? 'RML/Folder/Relocate' : 'RML/Folder/Move', $this, $rootFolderId, $newOrder, $force);
71
+ $oldData = $this->getRowData();
72
+ $beforeId = $this->parent;
73
+ $this->parent = $rootFolderId;
74
+ $this->order = $newOrder;
75
+ $this->debug("Use {$this->order} (passed {$ord} as parameter) as new order value", __METHOD__);
76
+ // Save in database
77
+ if ($this->id > -1) {
78
+ global $wpdb;
79
+ // Update childrens absolute pathes (backwards compatible 4.12.0)
80
+ if ($beforeId !== $this->parent) {
81
+ $this->updateThisAndChildrensAbsolutePath();
82
+ }
83
+ // Update order
84
+ // phpcs:disable WordPress.DB.PreparedSQL
85
+ $table_name = $this->getTableName();
86
+ $wpdb->query(
87
+ $wpdb->prepare(
88
+ "UPDATE {$table_name} SET parent=%d, ord=%d WHERE id = %d",
89
+ $rootFolderId,
90
+ $this->order,
91
+ $this->id
92
+ )
93
+ );
94
+ // phpcs:enable WordPress.DB.PreparedSQL
95
+ /**
96
+ * This action is called when a folder was relocated in the folder tree. That
97
+ * means the parent was not changed, only the order was changed.
98
+ *
99
+ * @param {IFolder} $folder The folder object
100
+ * @param {int} $id The new parent folder id
101
+ * @param {int} $order The (new) order number
102
+ * @param {boolean} $force If true the relocating was forced
103
+ * @param {object} $oldData The old SQL row data (raw) of the folder
104
+ * @hook RML/Folder/Relocated
105
+ */
106
+ // For backwards compatibility (4.12.0) we need the other action, too
107
+ do_action(
108
+ $isRelocate ? 'RML/Folder/Relocated' : 'RML/Folder/Moved',
109
+ $this,
110
+ $rootFolderId,
111
+ $this->order,
112
+ $force,
113
+ $oldData
114
+ );
115
+ $this->debug('Successfully moved and saved in database', __METHOD__);
116
+ \MatthiasWeb\RealMediaLibrary\Util::getInstance()->doActionAnyParentHas($this, 'Folder/RelocatedOrMoved', [
117
+ $this,
118
+ $rootFolderId,
119
+ $this->order,
120
+ $force,
121
+ $oldData
122
+ ]);
123
+ } else {
124
+ $this->debug('Successfully setted the new parent', __METHOD__);
125
+ $this->getAbsolutePath(\true, \true);
126
+ }
127
+ return \true;
128
+ }
129
+ // Documented in IFolderActions
130
+ public function relocate($parentId, $nextFolderId = \false) {
131
+ global $wpdb;
132
+ // Always root as the Lite version does not support subfolders
133
+ $rootFolderId = _wp_rml_root();
134
+ // Collect data
135
+ $table_name = $this->getTableName();
136
+ $this->debug(
137
+ $nextFolderId === \false
138
+ ? 'The folder should take place at the end of the list...'
139
+ : "The folder should take place before folder id {$nextFolderId}...",
140
+ __METHOD__
141
+ );
142
+ $rootFolder = $rootFolderId === $this->id ? $this : wp_rml_get_object_by_id($rootFolderId);
143
+ $next = $nextFolderId === \false ? null : wp_rml_get_object_by_id($nextFolderId);
144
+ // At end of the list
145
+ try {
146
+ if ($next === null && is_rml_folder($rootFolderId)) {
147
+ // Only update the order to the end of the list
148
+ $this->setParent(null);
149
+ } elseif (is_rml_folder($next) && is_rml_folder($rootFolder)) {
150
+ // Reget
151
+ $_this = wp_rml_structure_reset(null, \false, $this->id);
152
+ $next = wp_rml_get_object_by_id($next->id);
153
+ // Get the order of the next folder
154
+ $newOrder = $next->order;
155
+ // Count up the next ids
156
+ // phpcs:disable WordPress.DB.PreparedSQL
157
+ $sql = "UPDATE {$table_name} SET ord = ord + 1 WHERE parent = {$rootFolderId} AND ord >= {$newOrder}";
158
+ $wpdb->query($sql);
159
+ // phpcs:enable WordPress.DB.PreparedSQL
160
+ // Set the new order
161
+ $_this->setParent(null, $newOrder);
162
+ } else {
163
+ // There is nothing given
164
+ throw new \Exception(__('Something went wrong.', RML_TD));
165
+ }
166
+ $this->debug('Successfully relocated', __METHOD__);
167
+ return \true;
168
+ } catch (\Exception $e) {
169
+ $this->debug('Error: ' . $e->getMessage(), __METHOD__);
170
+ return [$e->getMessage()];
171
+ }
172
+ }
173
+ }
inc/overrides/lite/folder/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/lite/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/lite/order/Sortable.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\order;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ trait Sortable {
11
+ // Documented in IFolderContent
12
+ public function contentDeleteOrder() {
13
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
14
+ }
15
+ // Documented in IFolderContent
16
+ public function contentRestoreOldCustomNr() {
17
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
18
+ }
19
+ // Documented in IFolderContent
20
+ public function contentOrder($attachmentId, $nextId, $lastIdInView = \false) {
21
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
22
+ }
23
+ // Documented in IFolderContent
24
+ public function contentOrderBy($orderby, $writeMetadata = \true) {
25
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
26
+ }
27
+ // Documented in IFolderContent
28
+ public function contentIndex($delete = \true) {
29
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
30
+ }
31
+ // Documented in IFolderContent
32
+ public function contentReindex() {
33
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
34
+ }
35
+ // Documented in IFolderContent
36
+ public function contentEnableOrder() {
37
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
38
+ }
39
+ // Documented in IFolderContent
40
+ public function getAttachmentNextTo($attachmentId) {
41
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
42
+ }
43
+ // Documented in IFolderContent
44
+ public function getContentAggregationNr($function = 'MAX') {
45
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
46
+ }
47
+ // Documented in IFolderContent
48
+ public function getContentNrOf($attachmentId) {
49
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
50
+ }
51
+ // Documented in IFolderContent
52
+ public function getContentOldCustomNrCount() {
53
+ throw new \MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException(__METHOD__);
54
+ }
55
+ }
inc/overrides/lite/order/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/lite/rest/Folder.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\rest;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException;
6
+ use WP_Error;
7
+ use WP_REST_Response;
8
+ // @codeCoverageIgnoreStart
9
+ \defined('ABSPATH') or die('No script kiddies please!');
10
+ // Avoid direct file request
11
+ // @codeCoverageIgnoreEnd
12
+ trait Folder {
13
+ // Documented in IOverrideFolder
14
+ public function createItem($request) {
15
+ $name = $request->get_param('name');
16
+ $type = $request->get_param('type');
17
+ try {
18
+ $insert = wp_rml_create($name, null, $type);
19
+ } catch (\MatthiasWeb\RealMediaLibrary\exception\OnlyInProVersionException $e) {
20
+ return new \WP_Error('rest_rml_only_pro', $e->getMessage(), ['status' => 500]);
21
+ }
22
+ if (\is_array($insert)) {
23
+ return new \WP_Error('rest_rml_folder_create_failed', \implode(' ', $insert), ['status' => 500]);
24
+ } else {
25
+ return new \WP_REST_Response(wp_rml_get_object_by_id($insert)->getPlain());
26
+ }
27
+ }
28
+ }
inc/overrides/lite/rest/Service.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\rest;
4
+
5
+ use WP_Error;
6
+ use WP_REST_Response;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ trait Service {
12
+ // Documented in IOverrideService
13
+ public function routeHierarchy($request) {
14
+ $id = $request->get_param('id');
15
+ $nextId = $request->get_param('nextId');
16
+ $folder = wp_rml_get_object_by_id($id);
17
+ if (is_rml_folder($folder)) {
18
+ $result = $folder->relocate(null, $nextId);
19
+ if ($result === \true) {
20
+ return new \WP_REST_Response(['success' => \true]);
21
+ } else {
22
+ return new \WP_Error('rest_rml_hierarchy_failed', \implode(' ', $result), ['status' => 500]);
23
+ }
24
+ } else {
25
+ return new \WP_Error('rest_rml_hierarchy_not_found', __('Folder not found.', RML_TD), ['status' => 500]);
26
+ }
27
+ }
28
+ }
inc/overrides/lite/rest/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/overrides/lite/usersettings/DefaultFolder.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\lite\usersettings;
4
+
5
+ // @codeCoverageIgnoreStart
6
+ \defined('ABSPATH') or die('No script kiddies please!');
7
+ // Avoid direct file request
8
+ // @codeCoverageIgnoreEnd
9
+ trait DefaultFolder {
10
+ // Documented in IOverrideDefaultFolder
11
+ public function overrideConstruct() {
12
+ // Silence is golden.
13
+ }
14
+ // Documented in IMetadata
15
+ public function overrideSave($response, $user, $request) {
16
+ return $response;
17
+ }
18
+ }
inc/overrides/lite/usersettings/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/rest/Attachment.php ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\rest;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\rest\Service;
7
+ use WP_Error;
8
+ use WP_REST_Request;
9
+ use WP_REST_Response;
10
+ use MatthiasWeb\RealMediaLibrary\attachment\CustomField;
11
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
12
+ // @codeCoverageIgnoreStart
13
+ \defined('ABSPATH') or die('No script kiddies please!');
14
+ // Avoid direct file request
15
+ // @codeCoverageIgnoreEnd
16
+ /**
17
+ * Enables the /attachments REST.
18
+ */
19
+ class Attachment {
20
+ use UtilsProvider;
21
+ const MODIFIER_TYPE_BULK_MOVE = 'bulkMove';
22
+ /**
23
+ * Register endpoints.
24
+ */
25
+ public function rest_api_init() {
26
+ if ($this->isPro()) {
27
+ register_rest_route(
28
+ \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE,
29
+ '/attachments/(?P<id>\\d+)',
30
+ [
31
+ 'methods' => 'PUT',
32
+ 'callback' => [$this, 'updateItem'],
33
+ 'permission_callback' => [$this, 'permission_callback']
34
+ ]
35
+ );
36
+ }
37
+ register_rest_route(
38
+ \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE,
39
+ '/attachments/(?P<id>\\d+)/shortcutInfo',
40
+ [
41
+ 'methods' => 'GET',
42
+ 'callback' => [$this, 'routeShortcutInfo'],
43
+ 'permission_callback' => [$this, 'permission_callback']
44
+ ]
45
+ );
46
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/attachments/bulk/move', [
47
+ 'methods' => 'PUT',
48
+ 'callback' => [$this, 'routeBulkMove'],
49
+ 'permission_callback' => [$this, 'permission_callback']
50
+ ]);
51
+ }
52
+ /**
53
+ * Check if user is allowed to call this service requests.
54
+ */
55
+ public function permission_callback() {
56
+ $permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit();
57
+ return $permit === null ? \true : $permit;
58
+ }
59
+ /**
60
+ * Extend the WP core REST API to allow orderby and rml_folder in
61
+ * wp-json/wp/v2/media.
62
+ *
63
+ * @param array $params
64
+ * @return array
65
+ * @since 4.5.3
66
+ */
67
+ public function rest_attachment_collection_params($params) {
68
+ $params['orderby']['enum'][] = 'rml';
69
+ $params['rml_folder'] = [
70
+ 'description' => __('Fetch only media in a folder by folder id.', RML_TD),
71
+ 'type' => 'integer'
72
+ ];
73
+ return $params;
74
+ }
75
+ /**
76
+ * Extend the WP core REST API to parse orderby and rml_folder in
77
+ * wp-json/wp/v2/media.
78
+ *
79
+ * @param array $args
80
+ * @param WP_REST_Request $request
81
+ * @return array
82
+ * @since 4.5.3
83
+ */
84
+ public function rest_attachment_query($args, $request) {
85
+ $fid = $request->get_param('rml_folder');
86
+ if (isset($fid)) {
87
+ $args['rml_folder'] = $fid;
88
+ }
89
+ return $args;
90
+ }
91
+ /**
92
+ * See API docs.
93
+ *
94
+ * @param WP_REST_Request $request
95
+ * @return WP_REST_Response|WP_Error
96
+ *
97
+ * @api {put} /realmedialibrary/v1/attachments/:id Update an attachment order by id
98
+ * @apiParam {int} folderId The folder id
99
+ * @apiParam {int} attachmentId The attachment id
100
+ * @apiParam {int} [nextId] The next id relative to the attachment
101
+ * @apiParam {int} lastId The last id in the current sortable view
102
+ * @apiName UpdateAttachment
103
+ * @apiGroup Attachment
104
+ * @apiVersion 1.0.0
105
+ * @apiPermission upload_files
106
+ * @apiPermission Pro only
107
+ */
108
+ public function updateItem($request) {
109
+ $folderId = $request->get_param('folderId');
110
+ $attachmentId = $request->get_param('id');
111
+ $nextId = $request->get_param('nextId');
112
+ $lastIdInView = $request->get_param('lastId');
113
+ if (!empty($folderId) && !empty($nextId)) {
114
+ $update = wp_attachment_order_update($folderId, $attachmentId, $nextId, $lastIdInView);
115
+ if (\is_array($update)) {
116
+ return new \WP_Error('rest_rml_folder_content_order_failed', \implode(' ', $update), ['status' => 500]);
117
+ } else {
118
+ return new \WP_REST_Response(['success' => \true]);
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * See API docs.
124
+ *
125
+ * @param WP_REST_Request $request
126
+ * @return WP_REST_Response|WP_Error
127
+ *
128
+ * @api {get} /realmedialibrary/v1/posts/:id/shortcutInfo Get the shortcut container
129
+ * @apiName GetAttachmentShortcutInfo
130
+ * @apiGroup Attachment
131
+ * @apiVersion 1.0.0
132
+ * @apiPermission upload_files
133
+ */
134
+ public function routeShortcutInfo($request) {
135
+ $id = $request->get_param('id');
136
+ return new \WP_REST_Response([
137
+ 'html' => \MatthiasWeb\RealMediaLibrary\attachment\CustomField::getInstance()->getShortcutInfoContainer($id)
138
+ ]);
139
+ }
140
+ /**
141
+ * See API docs.
142
+ *
143
+ * @param WP_REST_Request $request
144
+ * @return WP_REST_Response|WP_Error
145
+ *
146
+ * @api {put} /realmedialibrary/v1/attachments/bulk/move Move/Copy multipe attachments
147
+ * @apiParam {int[]} ids The post ids to move / copy
148
+ * @apiParam {int} to The term id
149
+ * @apiParam {boolean} isCopy If true the post is appended to the category
150
+ * @apiName UpdatePostBulkMove
151
+ * @apiGroup Attachment
152
+ * @apiVersion 1.0.0
153
+ * @apiPermission upload_files
154
+ */
155
+ public function routeBulkMove($request) {
156
+ $ids = $request->get_param('ids');
157
+ $to = \intval($request->get_param('to'));
158
+ $isCopy = $request->get_param('isCopy');
159
+ $isCopy = \gettype($isCopy) === 'string' ? $isCopy === 'true' : $isCopy;
160
+ if (!\is_array($ids) || \count($ids) === 0 || $to === null) {
161
+ return new \WP_Error('rest_rml_posts_bulk_move_failed', __('Something went wrong.', RML_TD), [
162
+ 'status' => 500
163
+ ]);
164
+ }
165
+ $result = wp_rml_move($to, $ids, \false, $isCopy);
166
+ if (\is_array($result)) {
167
+ return new \WP_Error('rest_rml_attachment_bulk_move_failed', \implode(' ', $result), ['status' => 500]);
168
+ } else {
169
+ wp_rml_structure_reset();
170
+ return new \WP_REST_Response(
171
+ \MatthiasWeb\RealMediaLibrary\rest\Service::responseModify(self::MODIFIER_TYPE_BULK_MOVE, [
172
+ 'counts' => \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getFolderCounts()
173
+ ])
174
+ );
175
+ }
176
+ }
177
+ }
inc/rest/Folder.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\rest;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\lite\rest\Folder as LiteFolder;
8
+ use MatthiasWeb\RealMediaLibrary\metadata\Meta;
9
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\rest\IOverrideFolder;
10
+ use MatthiasWeb\RealMediaLibrary\rest\Service;
11
+ use WP_Error;
12
+ use WP_REST_Response;
13
+ // @codeCoverageIgnoreStart
14
+ \defined('ABSPATH') or die('No script kiddies please!');
15
+ // Avoid direct file request
16
+ // @codeCoverageIgnoreEnd
17
+ /**
18
+ * Enables the /folders REST for all creatable items.
19
+ */
20
+ class Folder implements \MatthiasWeb\RealMediaLibrary\overrides\interfce\rest\IOverrideFolder {
21
+ use UtilsProvider;
22
+ use LiteFolder;
23
+ /**
24
+ * Register endpoints.
25
+ */
26
+ public function rest_api_init() {
27
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/folders/content/counts', [
28
+ 'methods' => 'GET',
29
+ 'callback' => [$this, 'getContentCounts'],
30
+ 'permission_callback' => [$this, 'permission_callback']
31
+ ]);
32
+ if ($this->isPro()) {
33
+ register_rest_route(
34
+ \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE,
35
+ '/folders/(?P<fid>\\d+)/content/sortables',
36
+ [
37
+ 'methods' => 'POST',
38
+ 'callback' => [$this, 'applyContentSortables'],
39
+ 'permission_callback' => [$this, 'permission_callback']
40
+ ]
41
+ );
42
+ register_rest_route(
43
+ \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE,
44
+ '/folders/(?P<fid>\\d+)/sortables',
45
+ [
46
+ 'methods' => 'POST',
47
+ 'callback' => [$this, 'applyFolderSortables'],
48
+ 'permission_callback' => [$this, 'permission_callback']
49
+ ]
50
+ );
51
+ }
52
+ register_rest_route(
53
+ \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE,
54
+ '/folders/(?P<id>\\d+)/meta',
55
+ [
56
+ 'methods' => 'GET',
57
+ 'callback' => [$this, 'getMetaHTML'],
58
+ 'permission_callback' => [$this, 'permission_callback']
59
+ ]
60
+ );
61
+ register_rest_route(
62
+ \MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE,
63
+ '/folders/(?P<id>\\d+)/meta',
64
+ [
65
+ 'methods' => 'PUT',
66
+ 'callback' => [$this, 'updateMeta'],
67
+ 'permission_callback' => [$this, 'permission_callback']
68
+ ]
69
+ );
70
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/folders/(?P<id>\\d+)', [
71
+ 'methods' => 'PUT',
72
+ 'callback' => [$this, 'updateItem'],
73
+ 'permission_callback' => [$this, 'permission_callback']
74
+ ]);
75
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/folders/(?P<id>\\d+)', [
76
+ 'methods' => 'DELETE',
77
+ 'callback' => [$this, 'deleteItem'],
78
+ 'permission_callback' => [$this, 'permission_callback']
79
+ ]);
80
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/folders', [
81
+ 'methods' => 'POST',
82
+ 'callback' => [$this, 'createItem'],
83
+ 'permission_callback' => [$this, 'permission_callback']
84
+ ]);
85
+ }
86
+ /**
87
+ * Check if user is allowed to call this service requests.
88
+ */
89
+ public function permission_callback() {
90
+ $permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit();
91
+ return $permit === null ? \true : $permit;
92
+ }
93
+ /**
94
+ * See API docs.
95
+ *
96
+ * @param WP_REST_Request $request
97
+ * @return WP_REST_Response|WP_Error
98
+ *
99
+ * @api {get} /realmedialibrary/v1/folders/content/counts Get all folder counts
100
+ * @apiName GetFolderContentCounts
101
+ * @apiGroup Folder
102
+ * @apiVersion 1.0.0
103
+ * @apiPermission upload_files
104
+ */
105
+ public function getContentCounts($request) {
106
+ return new \WP_REST_Response(
107
+ \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()->getFolderCounts()
108
+ );
109
+ }
110
+ /**
111
+ * See API docs.
112
+ *
113
+ * @param WP_REST_Request $request
114
+ * @return WP_REST_Response|WP_Error
115
+ *
116
+ * @api {post} /realmedialibrary/v1/folders/:fid/content/sortables Set a folders content order
117
+ * @apiParam {string} id The sortable id. Pass "original" to reset the folder,
118
+ * pass "deactivate" to deactive the automatic order,
119
+ * pass "reindex" to reindex the order indexes,
120
+ * pass "last" to try to to reset to the last available order
121
+ * @apiParam {boolean} [automatically] Automatically use this order when new files are added to the folder
122
+ * @apiName ApplyFolderContentSorting
123
+ * @apiGroup Folder
124
+ * @apiVersion 1.0.0
125
+ * @apiPermission upload_files
126
+ * @apiPermission Pro only
127
+ * @since 4.4 The old API /folders/content/sortables is deleted
128
+ */
129
+ public function applyContentSortables($request) {
130
+ $sortable = $request->get_param('id');
131
+ $applyTo = $request->get_param('fid');
132
+ $automatically = $request->get_param('automatically');
133
+ $automatically = \gettype($automatically) === 'string' ? $automatically === 'true' : $automatically;
134
+ $folder = wp_rml_get_object_by_id($applyTo);
135
+ $isFolder = is_rml_folder($folder);
136
+ $result = \false;
137
+ if ($sortable === 'original') {
138
+ $result = $isFolder && $folder->contentDeleteOrder();
139
+ } elseif ($sortable === 'deactivate') {
140
+ $result = update_media_folder_meta($folder->getId(), 'orderAutomatically', \false);
141
+ } elseif ($sortable === 'reindex') {
142
+ $result = $isFolder && $folder->contentReindex();
143
+ } elseif ($sortable === 'last') {
144
+ $result = $isFolder && $folder->getContentOldCustomNrCount() > 0 && $folder->contentRestoreOldCustomNr();
145
+ } else {
146
+ $result = $isFolder && $folder->contentOrderBy($sortable);
147
+ if ($result) {
148
+ update_media_folder_meta($folder->getId(), 'orderAutomatically', $automatically);
149
+ }
150
+ }
151
+ return new \WP_REST_Response(['success' => $result]);
152
+ }
153
+ /**
154
+ * See API docs.
155
+ *
156
+ * @param WP_REST_Request $request
157
+ * @return WP_REST_Response|WP_Error
158
+ *
159
+ * @api {post} /realmedialibrary/v1/folders/:fid/sortables Set a folders subfolder order
160
+ * @apiParam {string} id The sortable id. Pass "original" to reset the folder,
161
+ * pass "deactivate" to deactive the automatic order,
162
+ * pass "reindex" to reindex the order indexes,
163
+ * pass "last" to try to to reset to the last available order
164
+ * @apiParam {boolean} [automatically] Automatically use this order when new subfolders are added to the folder
165
+ * @apiName ApplyFolderSorting
166
+ * @apiGroup Folder
167
+ * @apiVersion 1.0.0
168
+ * @apiPermission upload_files
169
+ * @apiPermission Pro only
170
+ * @since 4.4
171
+ */
172
+ public function applyFolderSortables($request) {
173
+ $sortable = $request->get_param('id');
174
+ $applyTo = $request->get_param('fid');
175
+ $automatically = $request->get_param('automatically');
176
+ $automatically = \gettype($automatically) === 'string' ? $automatically === 'true' : $automatically;
177
+ $folder = wp_rml_get_object_by_id($applyTo);
178
+ $isFolder = is_rml_folder($folder);
179
+ $result = \false;
180
+ if ($sortable === 'original') {
181
+ $result = $isFolder && $folder->resetSubfolderOrder();
182
+ } elseif ($sortable === 'deactivate') {
183
+ $result = update_media_folder_meta($folder->getId(), 'subOrderAutomatically', \false);
184
+ } elseif ($sortable === 'reindex') {
185
+ $result = $isFolder && $folder->reindexChildrens();
186
+ } elseif ($sortable === 'last') {
187
+ //$result = $isFolder && $folder->getContentOldCustomNrCount() > 0 && $folder->contentRestoreOldCustomNr();
188
+ } else {
189
+ $result = $isFolder && $folder->orderSubfolders($sortable);
190
+ if ($result) {
191
+ update_media_folder_meta($folder->getId(), 'subOrderAutomatically', $automatically);
192
+ }
193
+ }
194
+ return new \WP_REST_Response(['success' => $result]);
195
+ }
196
+ /**
197
+ * See API docs.
198
+ *
199
+ * @param WP_REST_Request $request
200
+ * @return WP_REST_Response|WP_Error
201
+ *
202
+ * @api {delete} /realmedialibrary/v1/folders/:id Delete a folder by id
203
+ * @apiName DeleteFolder
204
+ * @apiGroup Folder
205
+ * @apiVersion 1.0.0
206
+ * @apiPermission upload_files
207
+ */
208
+ public function deleteItem($request) {
209
+ $id = $request->get_param('id');
210
+ $delete = wp_rml_delete($id);
211
+ if ($delete === \true) {
212
+ return new \WP_REST_Response(['success' => $delete]);
213
+ } else {
214
+ return new \WP_Error('rest_rml_folder_delete', \implode(' ', $delete), ['status' => 500]);
215
+ }
216
+ }
217
+ /**
218
+ * See API docs.
219
+ *
220
+ * @param WP_REST_Request $request
221
+ * @return WP_REST_Response|WP_Error
222
+ *
223
+ * @api {get} /realmedialibrary/v1/folders/:id/meta Get the HTML meta content
224
+ * @apiName GetFolderMeta
225
+ * @apiGroup Folder
226
+ * @apiVersion 1.0.0
227
+ * @apiPermission upload_files
228
+ */
229
+ public function getMetaHTML($request) {
230
+ $id = $request->get_param('id');
231
+ return new \WP_REST_Response([
232
+ 'html' => \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance()->prepare_content($id)
233
+ ]);
234
+ }
235
+ /**
236
+ * See API docs.
237
+ *
238
+ * @param WP_REST_Request $request
239
+ * @return WP_REST_Response|WP_Error
240
+ *
241
+ * @api {put} /realmedialibrary/v1/folders/:id/meta Update meta of a folder
242
+ * @apiDescription Send a key value map of form data so Meta implementations (IMetadata) can handle it
243
+ * @apiName UpdateFolderMeta
244
+ * @apiGroup Folder
245
+ * @apiVersion 1.0.0
246
+ * @apiPermission upload_files
247
+ */
248
+ public function updateMeta($request) {
249
+ $folder = wp_rml_get_object_by_id($request->get_param('id'));
250
+ if (!is_rml_folder($folder)) {
251
+ return new \WP_Error('rest_rml_folder_meta_update_not_found', 'Not found', ['status' => 404]);
252
+ }
253
+ /**
254
+ * This filter is called to save the metadata. You can use the $_POST
255
+ * fields to validate the input. If an error occurs you can pass an
256
+ * "error" array (string) to the response. Do not use this filter directly instead use the
257
+ * add_rml_meta_box() function!
258
+ *
259
+ * @param {array} $response The response passed to the frontend
260
+ * @param {WP_REST_Request} $request The server request
261
+ * @hook RML/Folder/Meta/Save
262
+ * @return {array}
263
+ */
264
+ $response = apply_filters('RML/Folder/Meta/Save', ['errors' => [], 'data' => []], $folder, $request);
265
+ if (\is_array($response) && isset($response['errors']) && \count($response['errors']) > 0) {
266
+ return new \WP_Error('rest_rml_folder_update', $response['errors'], ['status' => 500]);
267
+ } else {
268
+ if (isset($response['data']) && \is_array($response['data'])) {
269
+ $response = $response['data'];
270
+ }
271
+ return new \WP_REST_Response($response);
272
+ }
273
+ }
274
+ /**
275
+ * See API docs.
276
+ *
277
+ * @param WP_REST_Request $request
278
+ * @return WP_REST_Response|WP_Error
279
+ *
280
+ * @api {put} /realmedialibrary/v1/folders/:id Update a folder by id
281
+ * @apiParam {string} name The new name for the folder
282
+ * @apiName UpdateFolder
283
+ * @apiGroup Folder
284
+ * @apiVersion 1.0.0
285
+ * @apiPermission upload_files
286
+ */
287
+ public function updateItem($request) {
288
+ $name = $request->get_param('name');
289
+ $id = $request->get_param('id');
290
+ $update = wp_rml_rename($name, $id);
291
+ if ($update === \true) {
292
+ $folder = wp_rml_get_by_id($id, null, \true);
293
+ return new \WP_REST_Response($folder->getPlain());
294
+ } else {
295
+ return new \WP_Error('rest_rml_folder_update', \implode(' ', $update), ['status' => 500]);
296
+ }
297
+ }
298
+ }
inc/rest/Reset.php ADDED
@@ -0,0 +1,427 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\rest;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\CountCache;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\comp\ExImport;
8
+ use MatthiasWeb\RealMediaLibrary\rest\Service;
9
+ use MatthiasWeb\RealMediaLibrary\Util;
10
+ use WP_REST_Response;
11
+ use MatthiasWeb\RealMediaLibrary\lite\order\Sortable;
12
+ // @codeCoverageIgnoreStart
13
+ \defined('ABSPATH') or die('No script kiddies please!');
14
+ // Avoid direct file request
15
+ // @codeCoverageIgnoreEnd
16
+ /**
17
+ * Enables the /reset, /import and /export REST for admins (manage_options).
18
+ */
19
+ class Reset {
20
+ use UtilsProvider;
21
+ /**
22
+ * Register endpoints.
23
+ */
24
+ public function rest_api_init() {
25
+ if ($this->isPro()) {
26
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/reset/order', [
27
+ 'methods' => 'DELETE',
28
+ 'callback' => [$this, 'resetOrder'],
29
+ 'permission_callback' => [$this, 'permission_callback']
30
+ ]);
31
+ }
32
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/reset/count', [
33
+ 'methods' => 'DELETE',
34
+ 'callback' => [$this, 'resetCount'],
35
+ 'permission_callback' => [$this, 'permission_callback']
36
+ ]);
37
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/reset/slugs', [
38
+ 'methods' => 'DELETE',
39
+ 'callback' => [$this, 'resetSlugs'],
40
+ 'permission_callback' => [$this, 'permission_callback']
41
+ ]);
42
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/reset/relations', [
43
+ 'methods' => 'DELETE',
44
+ 'callback' => [$this, 'resetRelations'],
45
+ 'permission_callback' => [$this, 'permission_callback']
46
+ ]);
47
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/reset/folders', [
48
+ 'methods' => 'DELETE',
49
+ 'callback' => [$this, 'resetFolders'],
50
+ 'permission_callback' => [$this, 'permission_callback']
51
+ ]);
52
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/export', [
53
+ 'methods' => 'GET',
54
+ 'callback' => [$this, 'export'],
55
+ 'permission_callback' => [$this, 'permission_callback']
56
+ ]);
57
+ if ($this->isPro()) {
58
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/import', [
59
+ 'methods' => 'POST',
60
+ 'callback' => [$this, 'import'],
61
+ 'permission_callback' => [$this, 'permission_callback']
62
+ ]);
63
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/import/taxonomy', [
64
+ 'methods' => 'POST',
65
+ 'callback' => [$this, 'importTaxonomy'],
66
+ 'permission_callback' => [$this, 'permission_callback']
67
+ ]);
68
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/import/mlf', [
69
+ 'methods' => 'POST',
70
+ 'callback' => [$this, 'importMlf'],
71
+ 'permission_callback' => [$this, 'permission_callback']
72
+ ]);
73
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/import/filebird', [
74
+ 'methods' => 'POST',
75
+ 'callback' => [$this, 'importFileBird'],
76
+ 'permission_callback' => [$this, 'permission_callback']
77
+ ]);
78
+ }
79
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/reset/debug', [
80
+ 'methods' => 'DELETE',
81
+ 'callback' => [$this, 'resetDebug'],
82
+ 'permission_callback' => [$this, 'permission_callback']
83
+ ]);
84
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/notice/license', [
85
+ 'methods' => 'DELETE',
86
+ 'callback' => [$this, 'routeNoticeDismissLicense'],
87
+ 'permission_callback' => [$this, 'permission_callback_activate_plugins']
88
+ ]);
89
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/notice/lite', [
90
+ 'methods' => 'DELETE',
91
+ 'callback' => [$this, 'routeNoticeDismissLite'],
92
+ 'permission_callback' => [$this, 'permission_callback_activate_plugins']
93
+ ]);
94
+ register_rest_route(\MatthiasWeb\RealMediaLibrary\rest\Service::LEGACY_NAMESPACE, '/notice/import', [
95
+ 'methods' => 'DELETE',
96
+ 'callback' => [$this, 'routeNoticeDismissImportTax'],
97
+ 'permission_callback' => [$this, 'permission_callback_activate_plugins']
98
+ ]);
99
+ }
100
+ /**
101
+ * Check if user is allowed to call this service requests.
102
+ */
103
+ public function permission_callback() {
104
+ $permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options');
105
+ return $permit === null ? \true : $permit;
106
+ }
107
+ /**
108
+ * Check if user is allowed to call this service requests.
109
+ */
110
+ public function permission_callback_activate_plugins() {
111
+ $permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('activate_plugins');
112
+ return $permit === null ? \true : $permit;
113
+ }
114
+ /**
115
+ * See API docs.
116
+ *
117
+ * @param WP_REST_Request $request
118
+ * @return WP_REST_Response|WP_Error
119
+ *
120
+ * @api {delete} /realmedialibrary/v1/reset/order Resets the order of all available folders
121
+ * @apiName ResetOrder
122
+ * @apiGroup Reset
123
+ * @apiVersion 1.0.0
124
+ * @apiPermission manage_options
125
+ * @apiPermission Pro only
126
+ */
127
+ public function resetOrder($request) {
128
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
129
+ return $permit;
130
+ }
131
+ \MatthiasWeb\RealMediaLibrary\lite\order\Sortable::delete_all_order();
132
+ return new \WP_REST_Response(['success' => \true]);
133
+ }
134
+ /**
135
+ * See API docs.
136
+ *
137
+ * @param WP_REST_Request $request
138
+ * @return WP_REST_Response|WP_Error
139
+ *
140
+ * @api {delete} /realmedialibrary/v1/reset/count Resets the count of all available folders
141
+ * @apiName ResetCount
142
+ * @apiGroup Reset
143
+ * @apiVersion 1.0.0
144
+ * @apiPermission manage_options
145
+ */
146
+ public function resetCount($request) {
147
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
148
+ return $permit;
149
+ }
150
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->resetCountCache();
151
+ return new \WP_REST_Response(['success' => \true]);
152
+ }
153
+ /**
154
+ * See API docs.
155
+ *
156
+ * @param WP_REST_Request $request
157
+ * @return WP_REST_Response|WP_Error
158
+ *
159
+ * @api {delete} /realmedialibrary/v1/reset/slugs Resets the slugs of all available folders
160
+ * @apiName ResetSlugs
161
+ * @apiGroup Reset
162
+ * @apiVersion 1.0.0
163
+ * @apiPermission manage_options
164
+ */
165
+ public function resetSlugs($request) {
166
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
167
+ return $permit;
168
+ }
169
+ \MatthiasWeb\RealMediaLibrary\Util::getInstance()->resetAllSlugsAndAbsolutePathes('html_entity_decode');
170
+ return new \WP_REST_Response(['success' => \true]);
171
+ }
172
+ /**
173
+ * See API docs.
174
+ *
175
+ * @param WP_REST_Request $request
176
+ * @return WP_REST_Response|WP_Error
177
+ *
178
+ * @api {delete} /realmedialibrary/v1/reset/relations Resets the relations of all available folders to attachments
179
+ * @apiName ResetRelations
180
+ * @apiGroup Reset
181
+ * @apiVersion 1.0.0
182
+ * @apiPermission manage_options
183
+ */
184
+ public function resetRelations($request) {
185
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
186
+ return $permit;
187
+ }
188
+ global $wpdb;
189
+ $table_posts = $this->getTableName('posts');
190
+ // phpcs:disable WordPress.DB.PreparedSQL
191
+ $wpdb->query("DELETE FROM {$table_posts}");
192
+ // phpcs:enable WordPress.DB.PreparedSQL
193
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->resetCountCache();
194
+ /**
195
+ * This action is fired after folder / attachment relations reset.
196
+ *
197
+ * @hook RML/Reset/Relations
198
+ * @since 4.0.7
199
+ */
200
+ do_action('RML/Reset/Relations');
201
+ return new \WP_REST_Response(['success' => \true]);
202
+ }
203
+ /**
204
+ * See API docs.
205
+ *
206
+ * @param WP_REST_Request $request
207
+ * @return WP_REST_Response|WP_Error
208
+ *
209
+ * @api {delete} /realmedialibrary/v1/reset/folders Deletes all available folders with relations
210
+ * @apiName ResetFolders
211
+ * @apiGroup Reset
212
+ * @apiVersion 1.0.0
213
+ * @apiPermission manage_options
214
+ */
215
+ public function resetFolders($request) {
216
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
217
+ return $permit;
218
+ }
219
+ global $wpdb;
220
+ // phpcs:disable WordPress.DB.PreparedSQL
221
+ $table_posts = $this->getTableName('posts');
222
+ $wpdb->query("DELETE FROM {$table_posts}");
223
+ $table_name = $this->getTableName();
224
+ $wpdb->query("DELETE FROM {$table_name}");
225
+ $table_meta = $this->getTableName('meta');
226
+ $wpdb->query("DELETE FROM {$table_meta}");
227
+ // phpcs:enable WordPress.DB.PreparedSQL
228
+ \MatthiasWeb\RealMediaLibrary\attachment\CountCache::getInstance()->resetCountCache();
229
+ /**
230
+ * This action is fired after whole reset.
231
+ *
232
+ * @hook RML/Reset
233
+ * @since 4.0.7
234
+ */
235
+ do_action('RML/Reset');
236
+ return new \WP_REST_Response(['success' => \true]);
237
+ }
238
+ /**
239
+ * See API docs.
240
+ *
241
+ * @param WP_REST_Request $request
242
+ * @return WP_REST_Response|WP_Error
243
+ *
244
+ * @api {get} /realmedialibrary/v1/export Get exported folders as JSON string
245
+ * @apiName Export
246
+ * @apiGroup Reset
247
+ * @apiVersion 1.0.0
248
+ * @apiPermission manage_options
249
+ */
250
+ public function export($request) {
251
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
252
+ return $permit;
253
+ }
254
+ return new \WP_REST_Response(
255
+ \json_encode(\MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance()->getFolders())
256
+ );
257
+ }
258
+ /**
259
+ * See API docs.
260
+ *
261
+ * @param WP_REST_Request $request
262
+ * @return WP_REST_Response|WP_Error
263
+ *
264
+ * @api {post} /realmedialibrary/v1/import Set exported folders as RML folders
265
+ * @apiParam {string} import The JSON import string
266
+ * @apiName Import
267
+ * @apiGroup Reset
268
+ * @apiVersion 1.0.0
269
+ * @apiPermission manage_options
270
+ * @apiPermission Pro only
271
+ */
272
+ public function import($request) {
273
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
274
+ return $permit;
275
+ }
276
+ // TODO: we could remove `urldecode` as this is no longer needed
277
+ $import = \urldecode($request->get_param('import'));
278
+ $import = \json_decode($import, \true);
279
+ \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance()->import($import);
280
+ return new \WP_REST_Response(['success' => \true]);
281
+ }
282
+ /**
283
+ * See API docs.
284
+ *
285
+ * @param WP_REST_Request $request
286
+ * @return WP_REST_Response|WP_Error
287
+ *
288
+ * @api {post} /realmedialibrary/v1/import/taxonomy Import a taxonomy to RML folders with relations to files
289
+ * @apiParam {string} taxonomy The taxonomy name
290
+ * @apiName ImportTaxonomy
291
+ * @apiGroup Reset
292
+ * @apiVersion 1.0.0
293
+ * @apiPermission manage_options
294
+ * @apiPermission Pro only
295
+ */
296
+ public function importTaxonomy($request) {
297
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
298
+ return $permit;
299
+ }
300
+ $taxonomy = $request->get_param('taxonomy');
301
+ \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance()->importTaxonomy($taxonomy);
302
+ return new \WP_REST_Response(['success' => \true]);
303
+ }
304
+ /**
305
+ * See API docs.
306
+ *
307
+ * @param WP_REST_Request $request
308
+ * @return WP_REST_Response|WP_Error
309
+ * @since 4.8.0
310
+ * @api {post} /realmedialibrary/v1/import/mlf Import "Media Library Folders" to RML folders with relations to files
311
+ * @apiName ImportMlf
312
+ * @apiGroup Reset
313
+ * @apiVersion 1.0.0
314
+ * @apiPermission manage_options
315
+ * @apiPermission Pro only
316
+ */
317
+ public function importMlf($request) {
318
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
319
+ return $permit;
320
+ }
321
+ \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance()->importMlf();
322
+ return new \WP_REST_Response(['success' => \true]);
323
+ }
324
+ /**
325
+ * See API docs.
326
+ *
327
+ * @param WP_REST_Request $request
328
+ * @return WP_REST_Response|WP_Error
329
+ * @since 4.8.0
330
+ * @api {post} /realmedialibrary/v1/import/file Import "Filebird" to RML folders with relations to files
331
+ * @apiName ImportMlf
332
+ * @apiGroup Reset
333
+ * @apiVersion 1.0.0
334
+ * @apiPermission manage_options
335
+ * @apiPermission Pro only
336
+ */
337
+ public function importFileBird($request) {
338
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
339
+ return $permit;
340
+ }
341
+ \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance()->importFileBird();
342
+ return new \WP_REST_Response(['success' => \true]);
343
+ }
344
+ /**
345
+ * See API docs.
346
+ *
347
+ * @param WP_REST_Request $request
348
+ * @return WP_REST_Response|WP_Error
349
+ *
350
+ * @api {delete} /realmedialibrary/v1/notice/license Dismiss the license notice for a given time (transient)
351
+ * @apiName DismissLicenseNotice
352
+ * @apiGroup Plugin
353
+ * @apiVersion 4.1.0
354
+ * @since 4.1.0
355
+ * @apiPermission activate_plugins
356
+ */
357
+ public function routeNoticeDismissLicense() {
358
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('activate_plugins')) !== null) {
359
+ return $permit;
360
+ }
361
+ $this->getCore()->isLicenseNoticeDismissed(\true);
362
+ return new \WP_REST_Response(['success' => \true]);
363
+ }
364
+ /**
365
+ * See API docs.
366
+ *
367
+ * @param WP_REST_Request $request
368
+ * @return WP_REST_Response|WP_Error
369
+ *
370
+ * @api {delete} /realmedialibrary/v1/notice/lite Dismiss the lite notice for a given time (transient)
371
+ * @apiName DismissLiteNotice
372
+ * @apiGroup Plugin
373
+ * @apiVersion 4.6.0
374
+ * @since 4.6.0
375
+ * @apiPermission activate_plugins
376
+ */
377
+ public function routeNoticeDismissLite() {
378
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('activate_plugins')) !== null) {
379
+ return $permit;
380
+ }
381
+ $this->getCore()->isLiteNoticeDismissed(\true);
382
+ return new \WP_REST_Response(['success' => \true]);
383
+ }
384
+ /**
385
+ * See API docs.
386
+ *
387
+ * @param WP_REST_Request $request
388
+ * @return WP_REST_Response|WP_Error
389
+ *
390
+ * @api {delete} /realmedialibrary/v1/notice/import Dismiss the import tax notice for a given time (transient)
391
+ * @apiName DismissImportTaxNotice
392
+ * @apiGroup Plugin
393
+ * @apiVersion 4.6.2
394
+ * @since 4.6.2
395
+ * @apiPermission activate_plugins
396
+ */
397
+ public function routeNoticeDismissImportTax() {
398
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('activate_plugins')) !== null) {
399
+ return $permit;
400
+ }
401
+ \MatthiasWeb\RealMediaLibrary\comp\ExImport::getInstance()->isImportTaxNoticeDismissed(\true);
402
+ return new \WP_REST_Response(['success' => \true]);
403
+ }
404
+ /**
405
+ * See API docs.
406
+ *
407
+ * @param WP_REST_Request $request
408
+ * @return WP_REST_Response|WP_Error
409
+ *
410
+ * @api {delete} /realmedialibrary/v1/reset/debug Reset the database log
411
+ * @apiName ResetDebug
412
+ * @apiGroup Reset
413
+ * @apiVersion 1.0.0
414
+ * @apiPermission manage_options
415
+ */
416
+ public function resetDebug($request) {
417
+ if (($permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit('manage_options')) !== null) {
418
+ return $permit;
419
+ }
420
+ global $wpdb;
421
+ $tablename = $this->getTableName('debug');
422
+ // phpcs:disable WordPress.DB.PreparedSQL
423
+ $wpdb->query("DELETE FROM {$tablename}", ARRAY_A);
424
+ // phpcs:enable WordPress.DB.PreparedSQL
425
+ return new \WP_REST_Response(['success' => \true]);
426
+ }
427
+ }
inc/rest/Service.php ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\rest;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\lite\rest\Service as LiteService;
8
+ use MatthiasWeb\RealMediaLibrary\metadata\Meta;
9
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\rest\IOverrideService;
10
+ use WP_Error;
11
+ use WP_REST_Response;
12
+ // @codeCoverageIgnoreStart
13
+ \defined('ABSPATH') or die('No script kiddies please!');
14
+ // Avoid direct file request
15
+ // @codeCoverageIgnoreEnd
16
+ /**
17
+ * Create a REST Service.
18
+ */
19
+ class Service implements \MatthiasWeb\RealMediaLibrary\overrides\interfce\rest\IOverrideService {
20
+ use UtilsProvider;
21
+ use LiteService;
22
+ private static $responseModifier = [];
23
+ /**
24
+ * Legacy namespace while switched from 4.5.4 to 4.6.0 in a new boilerplate.
25
+ */
26
+ const LEGACY_NAMESPACE = 'realmedialibrary/v1';
27
+ /**
28
+ * Register endpoints.
29
+ */
30
+ public function rest_api_init() {
31
+ register_rest_route(self::LEGACY_NAMESPACE, '/tree', [
32
+ 'methods' => 'GET',
33
+ 'callback' => [$this, 'routeTree'],
34
+ 'permission_callback' => [$this, 'permission_callback']
35
+ ]);
36
+ register_rest_route(self::LEGACY_NAMESPACE, '/tree/dropdown', [
37
+ 'methods' => 'GET',
38
+ 'callback' => [$this, 'routeTreeDropdown'],
39
+ 'permission_callback' => [$this, 'permission_callback']
40
+ ]);
41
+ register_rest_route(self::LEGACY_NAMESPACE, '/hierarchy/(?P<id>\\d+)', [
42
+ 'methods' => 'PUT',
43
+ 'callback' => [$this, 'routeHierarchy'],
44
+ 'permission_callback' => [$this, 'permission_callback']
45
+ ]);
46
+ register_rest_route(self::LEGACY_NAMESPACE, '/usersettings', [
47
+ 'methods' => 'GET',
48
+ 'callback' => [$this, 'getUserSettingsHTML'],
49
+ 'permission_callback' => [$this, 'permission_callback']
50
+ ]);
51
+ register_rest_route(self::LEGACY_NAMESPACE, '/usersettings', [
52
+ 'methods' => 'PUT',
53
+ 'callback' => [$this, 'updateUserSettings'],
54
+ 'permission_callback' => [$this, 'permission_callback']
55
+ ]);
56
+ }
57
+ /**
58
+ * Check if user is allowed to call this service requests.
59
+ */
60
+ public function permission_callback() {
61
+ $permit = \MatthiasWeb\RealMediaLibrary\rest\Service::permit();
62
+ return $permit === null ? \true : $permit;
63
+ }
64
+ /**
65
+ * See API docs.
66
+ *
67
+ * @param WP_REST_Request $request
68
+ * @return WP_REST_Response|WP_Error
69
+ *
70
+ * @api {get} /realmedialibrary/v1/tree Get the full categories tree
71
+ * @apiParam {string} [currentUrl] The current url to detect the active item
72
+ * @apiName GetTree
73
+ * @apiGroup Tree
74
+ * @apiVersion 1.0.0
75
+ * @apiPermission upload_files
76
+ */
77
+ public function routeTree($request) {
78
+ $currentUrl = $request->get_param('currentUrl');
79
+ // Receive structure
80
+ $structure = \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance();
81
+ return new \WP_REST_Response([
82
+ 'tree' => $structure->getPlainTree(),
83
+ 'slugs' => $structure->getView()->namesSlugArray(),
84
+ 'cntAll' => $structure->getCntAttachments(),
85
+ 'cntRoot' => $structure->getCntRoot()
86
+ ]);
87
+ }
88
+ /**
89
+ * See API docs.
90
+ *
91
+ * @param WP_REST_Request $request
92
+ * @return WP_REST_Response|WP_Error
93
+ *
94
+ * @api {get} /realmedialibrary/v1/tree/dropdown Get the full categories tree as dropdown options (HTML)
95
+ * @apiParam {string} [selected] The selected folder id
96
+ * @apiName GetTreeDropdown
97
+ * @apiGroup Tree
98
+ * @apiVersion 1.0.0
99
+ * @apiPermission upload_files
100
+ */
101
+ public function routeTreeDropdown($request) {
102
+ return new \WP_REST_Response([
103
+ 'html' => \MatthiasWeb\RealMediaLibrary\attachment\Structure::getInstance()
104
+ ->getView()
105
+ ->dropdown($request->get_param('selected'), null, \false)
106
+ ]);
107
+ }
108
+ /**
109
+ * See API docs.
110
+ *
111
+ * @return WP_REST_Response|WP_Error
112
+ *
113
+ * @api {get} /realmedialibrary/v1/usersettings Get the HTML for user settings
114
+ * @apiName GetUserSettingsHTML
115
+ * @apiGroup Folder
116
+ * @apiVersion 1.0.0
117
+ * @apiPermission upload_files
118
+ */
119
+ public function getUserSettingsHTML() {
120
+ return new \WP_REST_Response([
121
+ 'html' => \MatthiasWeb\RealMediaLibrary\metadata\Meta::getInstance()->prepare_content('')
122
+ ]);
123
+ }
124
+ /**
125
+ * See API docs.
126
+ *
127
+ * @param WP_REST_Request $request
128
+ * @return WP_REST_Response|WP_Error
129
+ *
130
+ * @api {put} /realmedialibrary/v1/usersettings Update user settings
131
+ * @apiDescription Send a key value map of form data so UserSettings implementations (IUserSettings) can handle it
132
+ * @apiName UpdateUserSettings
133
+ * @apiGroup UserSettings
134
+ * @apiVersion 1.0.0
135
+ * @apiPermission upload_files
136
+ */
137
+ public function updateUserSettings($request) {
138
+ /**
139
+ * This filter is called to save the general user settings. You can use the $_POST
140
+ * fields to validate the input. If an error occurs you can pass an
141
+ * "error" array (string) to the response. Do not use this filter directly instead use the
142
+ * add_rml_user_settings_box() function!
143
+ *
144
+ * @param {array} $response The response passed to the frontend
145
+ * @param {int} $userId The current user id
146
+ * @param {WP_REST_Request} $request The server request
147
+ * @hook RML/User/Settings/Save
148
+ * @return {array}
149
+ */
150
+ $response = apply_filters(
151
+ 'RML/User/Settings/Save',
152
+ ['errors' => [], 'data' => []],
153
+ get_current_user_id(),
154
+ $request
155
+ );
156
+ if (\is_array($response) && isset($response['errors']) && \count($response['errors']) > 0) {
157
+ return new \WP_Error('rest_rml_folder_update', $response['errors'], ['status' => 500]);
158
+ } else {
159
+ if (isset($response['data']) && \is_array($response['data'])) {
160
+ $response = $response['data'];
161
+ }
162
+ return new \WP_REST_Response($response);
163
+ }
164
+ }
165
+ /**
166
+ * Exclude REST API Url from SuperPWA cache
167
+ *
168
+ * @param string $superpwa_sw_never_cache_urls
169
+ * @return string
170
+ * @see https://superpwa.com/codex/superpwa_sw_never_cache_urls/
171
+ */
172
+ function superpwa_exclude_from_cache($superpwa_sw_never_cache_urls) {
173
+ return $superpwa_sw_never_cache_urls . ',/\\/realmedialibrary\\/v1';
174
+ }
175
+ /**
176
+ * Checks if the current user has a given capability and throws an error if not.
177
+ *
178
+ * @param string $cap The capability
179
+ * @return WP_Error|null
180
+ */
181
+ public static function permit($cap = 'upload_files') {
182
+ if (!current_user_can($cap)) {
183
+ return new \WP_Error('rest_rml_forbidden', __('Forbidden'), ['status' => 403]);
184
+ }
185
+ if (!wp_rml_active()) {
186
+ return new \WP_Error(
187
+ 'rest_rml_not_activated',
188
+ __('Real Media Library is not active for the current user.', RML_TD),
189
+ ['status' => 500]
190
+ );
191
+ }
192
+ return null;
193
+ }
194
+ /**
195
+ * Allows you to modify a given type of response body. If you want to find the
196
+ * different types you must have a look at the Service class constants.
197
+ *
198
+ * @param string $type
199
+ * @param array $data
200
+ * @since 4.0.9
201
+ */
202
+ public static function addResponseModifier($type, $data) {
203
+ if (!isset(self::$responseModifier[$type])) {
204
+ self::$responseModifier[$type] = [];
205
+ }
206
+ self::$responseModifier[$type] = \array_merge_recursive(self::$responseModifier[$type], $data);
207
+ }
208
+ /**
209
+ * Apply response modifications to a given array.
210
+ *
211
+ * @param string $type
212
+ * @param array $data
213
+ * @return array
214
+ */
215
+ public static function responseModify($type, $data) {
216
+ if (isset(self::$responseModifier[$type])) {
217
+ return \array_merge_recursive($data, self::$responseModifier[$type]);
218
+ }
219
+ return $data;
220
+ }
221
+ }
inc/rest/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/usersettings/AllFilesShortcuts.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\usersettings;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IUserSettings;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\Filter;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ use WP_Query;
9
+ // @codeCoverageIgnoreStart
10
+ \defined('ABSPATH') or die('No script kiddies please!');
11
+ // Avoid direct file request
12
+ // @codeCoverageIgnoreEnd
13
+ /**
14
+ * Add an option so the user can hide shortcuts in "All files" view.
15
+ *
16
+ * @since 4.0.8
17
+ */
18
+ class AllFilesShortcuts implements \MatthiasWeb\RealMediaLibrary\api\IUserSettings {
19
+ use CommonUserSettingsTrait;
20
+ use UtilsProvider;
21
+ const FIELD_NAME = 'hideAllFilesShortcuts';
22
+ const OPTION_NAME = 'rmlHideAllFilesShortcuts';
23
+ /**
24
+ * C'tor.
25
+ */
26
+ public function __construct() {
27
+ if (self::isEnabled()) {
28
+ add_filter('RML/Filter/PostsClauses', [$this, 'posts_clauses'], 10, 3);
29
+ }
30
+ }
31
+ /**
32
+ * Modify posts clauses to hide shortcuts.
33
+ *
34
+ * @param array $clauses
35
+ * @param WP_Query $query
36
+ * @param int $folderId
37
+ * @return array
38
+ */
39
+ public function posts_clauses($clauses, $query, $folderId) {
40
+ if (\MatthiasWeb\RealMediaLibrary\attachment\Filter::getInstance()->isQuerying() && $folderId === 0) {
41
+ $clauses['where'] .= ' AND IFNULL(rmlposts.isShortcut, 0) = 0 ';
42
+ }
43
+ return $clauses;
44
+ }
45
+ // Documented in IMetadata
46
+ public function content($content, $user) {
47
+ $content .=
48
+ '<label><input name="' .
49
+ self::FIELD_NAME .
50
+ '" type="checkbox" value="1" ' .
51
+ checked(1, self::isEnabled(), \false) .
52
+ ' /> ' .
53
+ __('Hide shortcuts in "All files"', RML_TD) .
54
+ '</label>
55
+ <p class="description">' .
56
+ __('The count always includes shortcuts', RML_TD) .
57
+ '</p>';
58
+ return $content;
59
+ }
60
+ // Documented in IMetadata
61
+ public function save($response, $user, $request) {
62
+ $param = $request->get_param(self::FIELD_NAME);
63
+ if (self::isEnabled($param === '1') !== \false) {
64
+ $this->reloadAfterSave($response);
65
+ }
66
+ return $response;
67
+ }
68
+ // Documented in IMetadata
69
+ public function scripts($assets) {
70
+ // Silence is golden.
71
+ }
72
+ // Documented in CommonUserSettingsTrait
73
+ public static function isEnabled($persist = null) {
74
+ return self::is(self::OPTION_NAME, $persist);
75
+ }
76
+ }
inc/usersettings/CommonUserSettingsTrait.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\usersettings;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\metadata\CommonTrait;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * Trait common user settings helper methods.
12
+ *
13
+ * @since 4.0.8
14
+ */
15
+ trait CommonUserSettingsTrait {
16
+ use CommonTrait;
17
+ /**
18
+ * Gets (and persists) a checkbox to the user (settings) metadata.
19
+ *
20
+ * @param string $meta The meta key
21
+ * @param boolean $persist If setted it will be updated or deleted
22
+ * @return boolean
23
+ */
24
+ protected static function is($meta, $persist = null) {
25
+ if ($persist !== null) {
26
+ if ($persist) {
27
+ return update_user_meta(get_current_user_id(), $meta, $persist);
28
+ } else {
29
+ return delete_user_meta(get_current_user_id(), $meta);
30
+ }
31
+ }
32
+ return (bool) get_user_meta(get_current_user_id(), $meta, \true);
33
+ }
34
+ /**
35
+ * Gets (and persists) a string to the user (settings) metadata.
36
+ *
37
+ * @param string $meta The meta key
38
+ * @param boolean $persist If setted it will be updated or deleted
39
+ * @return string|boolean
40
+ */
41
+ protected static function get($meta, $persist = null) {
42
+ if ($persist !== null) {
43
+ if ($persist) {
44
+ return update_user_meta(get_current_user_id(), $meta, $persist);
45
+ } else {
46
+ return delete_user_meta(get_current_user_id(), $meta);
47
+ }
48
+ }
49
+ return get_user_meta(get_current_user_id(), $meta, \true);
50
+ }
51
+ }
inc/usersettings/DefaultFolder.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\usersettings;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IUserSettings;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ use MatthiasWeb\RealMediaLibrary\lite\usersettings\DefaultFolder as LiteDefaultFolder;
8
+ use MatthiasWeb\RealMediaLibrary\overrides\interfce\usersettings\IOverrideDefaultFolder;
9
+ // @codeCoverageIgnoreStart
10
+ \defined('ABSPATH') or die('No script kiddies please!');
11
+ // Avoid direct file request
12
+ // @codeCoverageIgnoreEnd
13
+ /**
14
+ * Add an option so the user can set the default startup folder.
15
+ * It replaces this plugin: https://wordpress.org/plugins/default-startup-folder-for-real-media-library/
16
+ *
17
+ * @since 4.6.0
18
+ */
19
+ class DefaultFolder implements
20
+ \MatthiasWeb\RealMediaLibrary\api\IUserSettings,
21
+ \MatthiasWeb\RealMediaLibrary\overrides\interfce\usersettings\IOverrideDefaultFolder {
22
+ use CommonUserSettingsTrait;
23
+ use UtilsProvider;
24
+ use LiteDefaultFolder;
25
+ const FIELD_NAME = 'defaultFolder';
26
+ const OPTION_NAME = 'rmlDefaultFolder';
27
+ const ID_NONE = -2;
28
+ const ID_LAST_QUERIED = -3;
29
+ /**
30
+ * C'tor.
31
+ */
32
+ public function __construct() {
33
+ $this->overrideConstruct();
34
+ }
35
+ // Documented in IMetadata
36
+ public function content($content, $user) {
37
+ $default = $this->getDefaultFolder();
38
+ $selectedNone = $default === self::ID_NONE ? 'selected="selected"' : '';
39
+ $selectedLastQueried = $default === self::ID_LAST_QUERIED ? 'selected="selected"' : '';
40
+ $disabled = $this->isPro() ? '' : 'disabled="disabled" ';
41
+ $content .=
42
+ '<label>' .
43
+ __('Default startup folder', RML_TD) .
44
+ '</label><select ' .
45
+ $disabled .
46
+ ' name="' .
47
+ self::FIELD_NAME .
48
+ '"><option value="' .
49
+ self::ID_NONE .
50
+ '" ' .
51
+ $selectedNone .
52
+ '>' .
53
+ __('No folder at startup', RML_TD) .
54
+ '</option><option value="' .
55
+ self::ID_LAST_QUERIED .
56
+ '" ' .
57
+ $selectedLastQueried .
58
+ '>' .
59
+ __('Last opened folder', RML_TD) .
60
+ '</option>' .
61
+ wp_rml_dropdown($default, []) .
62
+ '</select>';
63
+ if (!$this->isPro()) {
64
+ $content .=
65
+ '<p class="description">' .
66
+ __(
67
+ 'Your media library can always open in the last opened folder or a folder you choose. This saves you time every time you open the media library!',
68
+ RML_TD
69
+ ) .
70
+ ' <a href="' .
71
+ (RML_PRO_VERSION . '&feature=start-up-folder') .
72
+ '" target="_blank">' .
73
+ __('Learn more about PRO', RML_TD) .
74
+ '</a></p>';
75
+ }
76
+ return $content;
77
+ }
78
+ // Documented in IMetadata
79
+ public function save($response, $user, $request) {
80
+ return $this->overrideSave($response, $user, $request);
81
+ }
82
+ // Documented in IMetadata
83
+ public function scripts($assets) {
84
+ // Silence is golden.
85
+ }
86
+ // Documented in CommonUserSettingsTrait
87
+ public static function getDefaultFolder($persist = null) {
88
+ $default = self::get(self::OPTION_NAME, $persist);
89
+ return empty($default) ? '' : \intval($default);
90
+ }
91
+ }
inc/usersettings/Demo.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\usersettings;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IUserSettings;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ class Demo implements \MatthiasWeb\RealMediaLibrary\api\IUserSettings {
11
+ // Documented in CommonUserSettingsTrait
12
+ public function content($content, $user) {
13
+ return '<label>Demo for user #' .
14
+ $user .
15
+ '</label>
16
+ <textarea name="demo" type="text" class="regular-text" style="width: 100%;box-sizing: border-box;">Your Text</textarea>
17
+ <p class="description">Data is not saved</p>';
18
+ }
19
+ // Documented in CommonUserSettingsTrait
20
+ public function save($response, $user, $request) {
21
+ $response['errors'][] =
22
+ 'An error occured with demo text: ' . $request->get_param('demo') . '. This is only a demo.';
23
+ return $response;
24
+ }
25
+ // Documented in CommonUserSettingsTrait
26
+ public function scripts($assets) {
27
+ // Silence is golden.
28
+ }
29
+ }
inc/usersettings/InfiniteScrolling.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\usersettings;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\api\IUserSettings;
6
+ use MatthiasWeb\RealMediaLibrary\attachment\Filter;
7
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
8
+ use WP_Query;
9
+ // @codeCoverageIgnoreStart
10
+ \defined('ABSPATH') or die('No script kiddies please!');
11
+ // Avoid direct file request
12
+ // @codeCoverageIgnoreEnd
13
+ /**
14
+ * Add an option so the user can disable the WordPress infinite scrolling.
15
+ *
16
+ * @see https://core.trac.wordpress.org/ticket/40330
17
+ */
18
+ class InfiniteScrolling implements \MatthiasWeb\RealMediaLibrary\api\IUserSettings {
19
+ use CommonUserSettingsTrait;
20
+ use UtilsProvider;
21
+ const MIN_WP_VERSION = '5.8';
22
+ const FIELD_NAME = 'infiniteScrolling';
23
+ const OPTION_NAME = 'rmlInfiniteScrolling';
24
+ /**
25
+ * C'tor.
26
+ */
27
+ public function __construct() {
28
+ if (self::isEnabled()) {
29
+ add_filter('media_library_infinite_scrolling', '__return_true');
30
+ }
31
+ }
32
+ // Documented in IMetadata
33
+ public function content($content, $user) {
34
+ $content .=
35
+ '<label><input name="' .
36
+ self::FIELD_NAME .
37
+ '" type="checkbox" value="1" ' .
38
+ checked(1, self::isEnabled(), \false) .
39
+ ' /> ' .
40
+ __('Enable infinite scrolling in grid view', RML_TD) .
41
+ '</label>
42
+ <p class="description">' .
43
+ __(
44
+ 'Instead of displaying a "Load More" button, all files are loaded automatically as you scroll down. This is not supported in list view.',
45
+ RML_TD
46
+ ) .
47
+ '</p>';
48
+ return $content;
49
+ }
50
+ // Documented in IMetadata
51
+ public function save($response, $user, $request) {
52
+ $param = $request->get_param(self::FIELD_NAME);
53
+ if (self::isEnabled($param === '1') !== \false) {
54
+ $this->hardReloadAfterSaveIfBodyHasClass($response, 'upload-php');
55
+ }
56
+ return $response;
57
+ }
58
+ // Documented in IMetadata
59
+ public function scripts($assets) {
60
+ // Silence is golden.
61
+ }
62
+ /**
63
+ * Check if this setting should be available to the current WordPress instance.
64
+ */
65
+ public function isAvailable() {
66
+ global $wp_version;
67
+ return \version_compare($wp_version, self::MIN_WP_VERSION, '>=');
68
+ }
69
+ // Documented in CommonUserSettingsTrait
70
+ public static function isEnabled($persist = null) {
71
+ return self::is(self::OPTION_NAME, $persist);
72
+ }
73
+ }
inc/usersettings/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
inc/view/FolderShortcode.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\view;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use MatthiasWeb\RealMediaLibrary\folder\Creatable;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * Handles the shortcode for [folder-gallery].
13
+ */
14
+ class FolderShortcode {
15
+ use UtilsProvider;
16
+ private static $me = null;
17
+ public static $TAG = 'folder-gallery';
18
+ /**
19
+ * C'tor.
20
+ */
21
+ function __construct() {
22
+ if (is_admin() && wp_rml_active()) {
23
+ add_action('admin_head', [$this, 'admin_head']);
24
+ add_filter('RML/Localize', [$this, 'localize']);
25
+ }
26
+ }
27
+ /**
28
+ * Modify admin_head section.
29
+ */
30
+ function admin_head() {
31
+ // check user permissions
32
+ if (!current_user_can('edit_posts') && !current_user_can('edit_pages')) {
33
+ return;
34
+ }
35
+ // check if WYSIWYG is enabled
36
+ if (get_user_option('rich_editing')) {
37
+ add_filter('mce_external_plugins', [$this, 'mce_external_plugins']);
38
+ add_filter('mce_buttons', [$this, 'mce_buttons']);
39
+ }
40
+ }
41
+ /**
42
+ * Modify original shortcode attributes of [gallery].
43
+ *
44
+ * @param array $out
45
+ * @param array $pairs
46
+ * @param array $atts
47
+ * @return array
48
+ */
49
+ public function shortcode_atts_gallery($out, $pairs, $atts) {
50
+ $atts = shortcode_atts(['fid' => -2, 'order' => 'DESC', 'orderby' => 'date', 'posts_per_page' => -1], $atts);
51
+ // The fid can also come from $out
52
+ if (isset($out['fid']) && $out['fid'] > -2) {
53
+ $atts['fid'] = $out['fid'];
54
+ }
55
+ // RML order is only available with ASC
56
+ if ($atts['orderby'] === 'rml' || (isset($out['orderby']) && $out['orderby'] === 'rml')) {
57
+ $out['orderby'] = 'menu_order ID';
58
+ }
59
+ if ($atts['fid'] > -2) {
60
+ if (!isset($out['include'])) {
61
+ $out['include'] = '';
62
+ }
63
+ if ($atts['fid'] > -1) {
64
+ $folder = wp_rml_get_object_by_id($atts['fid']);
65
+ if ($folder !== null) {
66
+ $out['include'] .= ',' . \implode(',', $folder->read($atts['order'], $atts['orderby']));
67
+ }
68
+ } else {
69
+ $out['include'] .=
70
+ ',' .
71
+ \implode(
72
+ ',',
73
+ \MatthiasWeb\RealMediaLibrary\folder\Creatable::xread(-1, $atts['order'], $atts['orderby'])
74
+ );
75
+ }
76
+ $out['include'] = \ltrim($out['include'], ',');
77
+ $out['include'] = \rtrim($out['include'], ',');
78
+ }
79
+ // Overwrite the default order by this shortcode
80
+ if (isset($out['orderby']) && $out['orderby'] === 'menu_order ID') {
81
+ $out['orderby'] = 'post__in';
82
+ }
83
+ return $out;
84
+ }
85
+ /**
86
+ * Localized variables for TinyMCE shortcode generator.
87
+ *
88
+ * @param array $arr
89
+ * @return array
90
+ */
91
+ public function localize($arr) {
92
+ $arr['mce'] = [
93
+ 'mceButtonTooltip' => __('Gallery from Media Folder', RML_TD),
94
+ 'mceListBoxDirsTooltip' => __(
95
+ 'Note: You can only select galleries. Folders and collections are grayed.',
96
+ RML_TD
97
+ ),
98
+ 'mceBodyGallery' => __('Folder', RML_TD),
99
+ 'mceBodyLinkTo' => __('Link to'),
100
+ 'mceBodyColumns' => __('Columns'),
101
+ 'mceBodyRandomOrder' => __('Random Order'),
102
+ 'mceBodySize' => __('Size'),
103
+ 'mceBodyLinkToValues' => [
104
+ ['value' => 'post', 'text' => __('Attachment File')],
105
+ ['value' => 'file', 'text' => __('Media File')],
106
+ ['value' => 'none', 'text' => __('None')]
107
+ ],
108
+ 'mceBodySizeValues' => [
109
+ ['value' => 'thumbnail', 'text' => __('Thumbnail')],
110
+ ['value' => 'medium', 'text' => __('Medium')],
111
+ ['value' => 'large', 'text' => __('Large')],
112
+ ['value' => 'full', 'text' => __('Full Size')]
113
+ ]
114
+ ];
115
+ return $arr;
116
+ }
117
+ /**
118
+ * Add external plugin to MCE.
119
+ *
120
+ * @param array $plugin_array
121
+ * @return array
122
+ */
123
+ function mce_external_plugins($plugin_array) {
124
+ $assets = $this->getCore()->getAssets();
125
+ $dir = $assets->getPublicFolder();
126
+ $plugin_array[self::$TAG] = plugins_url(
127
+ $dir . 'rml_shortcode.' . ($this->isPro() ? 'pro' : 'lite') . '.js',
128
+ RML_FILE
129
+ );
130
+ return $plugin_array;
131
+ }
132
+ /**
133
+ * Add button to MCE.
134
+ *
135
+ * @param string[] $buttons
136
+ * @return string[]
137
+ */
138
+ function mce_buttons($buttons) {
139
+ \array_push($buttons, self::$TAG);
140
+ return $buttons;
141
+ }
142
+ /**
143
+ * Get instance.
144
+ *
145
+ * @return FolderShortcode
146
+ */
147
+ public static function getInstance() {
148
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\view\FolderShortcode()) : self::$me;
149
+ }
150
+ }
inc/view/Gutenberg.php ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\view;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ use WP_Query;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * Create gutenberg blocks with Server side rendering.
13
+ */
14
+ class Gutenberg {
15
+ use UtilsProvider;
16
+ private static $me = null;
17
+ const ID_GALLERY = RML_TD . '/gallery';
18
+ /**
19
+ * Register Gutenberg block.
20
+ */
21
+ private function __construct() {
22
+ register_block_type(self::ID_GALLERY, [
23
+ 'render_callback' => [$this, 'renderGallery'],
24
+ 'attributes' => [
25
+ 'fid' => ['type' => 'number'],
26
+ 'align' => ['type' => 'string', 'default' => 'undefined'],
27
+ 'columns' => ['type' => 'number', 'default' => 3],
28
+ 'imageCrop' => ['type' => 'boolean', 'default' => \true],
29
+ 'captions' => ['type' => 'boolean', 'default' => \true],
30
+ 'linkTo' => ['type' => 'string', 'default' => 'none'],
31
+ 'lastEditReload' => ['type' => 'number', 'default' => 0]
32
+ ]
33
+ ]);
34
+ }
35
+ /**
36
+ * Render gallery in website.
37
+ *
38
+ * @param array $attributes
39
+ * @param string $content
40
+ * @return string
41
+ * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-library/src/gallery/index.js#L196-L222
42
+ */
43
+ public function renderGallery($attributes, $content) {
44
+ if (!isset($attributes['fid']) || empty($attributes['fid'])) {
45
+ return '<span></span>';
46
+ }
47
+ // Fetch images
48
+ $query = new \WP_Query([
49
+ 'post_status' => 'inherit',
50
+ 'post_type' => 'attachment',
51
+ 'rml_folder' => $attributes['fid'],
52
+ 'posts_per_page' => -1
53
+ ]);
54
+ $posts = $query->get_posts();
55
+ // Iterate all items
56
+ $html =
57
+ '<ul data-count="' .
58
+ \count($posts) .
59
+ '" class="wp-block-gallery align' .
60
+ $attributes['align'] .
61
+ ' columns-' .
62
+ $attributes['columns'] .
63
+ ' ' .
64
+ ($attributes['imageCrop'] ? 'is-cropped' : '') .
65
+ '">';
66
+ foreach ($posts as $post) {
67
+ if (!wp_attachment_is_image($post)) {
68
+ continue;
69
+ }
70
+ // Collect data
71
+ $href = \false;
72
+ $link = get_attachment_link($post->ID);
73
+ $src = wp_get_attachment_image_src($post->ID, 'full');
74
+ if (!isset($src[0])) {
75
+ continue;
76
+ }
77
+ $src = $src[0];
78
+ $alt = get_post_meta($post->id, '_wp_attachment_image_alt', \true);
79
+ $alt = empty($alt) ? $post->post_title : $alt;
80
+ $caption = $attributes['captions'] ? $post->post_excerpt : '';
81
+ switch ($attributes['linkTo']) {
82
+ case 'media':
83
+ $href = $src;
84
+ break;
85
+ case 'attachment':
86
+ $href = $link;
87
+ break;
88
+ }
89
+ // Create output
90
+ $img =
91
+ '<img src="' .
92
+ $src .
93
+ '" alt="' .
94
+ $alt .
95
+ '" data-id="' .
96
+ $post->ID .
97
+ '" data-link="' .
98
+ $link .
99
+ '" class="wp-image-' .
100
+ $post->ID .
101
+ '"/>';
102
+ $img = empty($href) ? $img : '<a href="' . $href . '">' . $img . '</a>';
103
+ $html .=
104
+ '<li class="blocks-gallery-item"><figure>' .
105
+ $img .
106
+ (empty($caption) ? '' : '<figcaption>' . $caption . '</figcaption>') .
107
+ '</figure></li>';
108
+ }
109
+ return $html . '</ul>';
110
+ }
111
+ /**
112
+ * Get instance.
113
+ *
114
+ * @return Gutenberg
115
+ */
116
+ public static function getInstance() {
117
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\view\Gutenberg()) : self::$me;
118
+ }
119
+ }
inc/view/Lang.php ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\view;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\Assets;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * LEGACY Language texts for the JavaScript frontend. Later when using TypeScript
13
+ * this class is no longer needed because the __() function is used and
14
+ * automatically extracted.
15
+ */
16
+ class Lang {
17
+ use UtilsProvider;
18
+ /**
19
+ * Get an array of language keys and translations.
20
+ *
21
+ * @param Assets $assets
22
+ * @return array
23
+ */
24
+ public function getItems($assets) {
25
+ global $wpdb;
26
+ // Check if already subfolder exist (in Lite Version)
27
+ $liteSubfolderAdditionalText = '';
28
+ if (!$this->isPro()) {
29
+ $table_name = $this->getTableName();
30
+ // phpcs:disable WordPress.DB.PreparedSQL
31
+ $result = $wpdb->get_var("SELECT COUNT(*) FROM {$table_name} WHERE parent > -1");
32
+ // phpcs:enable WordPress.DB.PreparedSQL
33
+ if ($result > 0) {
34
+ $liteSubfolderAdditionalText = \sprintf(
35
+ "\n\n*%s*",
36
+ __(
37
+ 'Subfolders are only available in the PRO version. But you can now create an unlimited number of folders on the main level (instead of the previous max. 10 folders).',
38
+ RML_TD
39
+ )
40
+ );
41
+ }
42
+ }
43
+ return [
44
+ 'noneSelected' => __('No folder selected', RML_TD),
45
+ 'selectFolder' => __('Select folder', RML_TD),
46
+ 'reloadContent' => __('Reload content', RML_TD),
47
+ 'folder' => __('Folder', RML_TD),
48
+ 'subfolders' => __('Subfolders', RML_TD),
49
+ 'gutenBergBlockSelect' => __('Please select a folder (media library) in the block settings.', RML_TD),
50
+ 'warnDelete' => $assets->media_view_strings(\false),
51
+ 'restrictionsInherits' => __('New folders inherit this restriction', RML_TD),
52
+ 'restrictionsSuffix' => __('The current selected folder has some restrictions:', RML_TD),
53
+ 'restrictions.par' => __('You cannot change *parent* folder'),
54
+ 'restrictions.rea' => __('You cannot *rearrange* subfolders', RML_TD),
55
+ 'restrictions.cre' => __('You cannot *create* subfolders', RML_TD),
56
+ 'restrictions.ins' => __('You cannot *insert* new files. New files will be moved to Unorganized…', RML_TD),
57
+ 'restrictions.ren' => __('You cannot *rename* the folder', RML_TD),
58
+ 'restrictions.del' => __('You cannot *delete* the folder', RML_TD),
59
+ 'restrictions.mov' => __('You cannot *move* files outside the folder', RML_TD),
60
+ 'parent' => __('Parent', RML_TD),
61
+ 'beforeThisNode' => __('Before this node', RML_TD),
62
+ 'beforeThisNodeInfo' => __('If no next node is given, the element is placed at the end.', RML_TD),
63
+ 'uploaderUsesLeftTree' => __('The file is uploaded to the folder where you are currently in.', RML_TD),
64
+ 'areYouSure' => __('Are you sure?', RML_TD),
65
+ 'success' => __('Success'),
66
+ 'failed' => __('Failed'),
67
+ 'noEntries' => __('No entries found', RML_TD),
68
+ 'deleteConfirm' => __('Are you sure to delete *{name}*? All files gets moved to Unorganized.', RML_TD),
69
+ 'deleteMultipleConfirm' => __(
70
+ 'Are you sure to delete *{count} folders*? All files gets moved to Unorganized.',
71
+ RML_TD
72
+ ),
73
+ 'ok' => __('Ok'),
74
+ 'cancel' => __('Cancel'),
75
+ 'save' => __('Save'),
76
+ 'back' => __('Back'),
77
+ 'noFoldersTitle' => __('No folders found', RML_TD),
78
+ 'noFoldersDescription' => __(
79
+ 'No folders have been created yet. Just click on the button above to create your first folder.',
80
+ RML_TD
81
+ ),
82
+ 'folders' => __('Folders', RML_TD),
83
+ 'noSearchResult' => __('No search results.', RML_TD),
84
+ 'renameLoadingText' => __('Renaming to *{name}*…', RML_TD),
85
+ 'renameSuccess' => __('Successfully renamed folder to *{name}*', RML_TD),
86
+ 'addLoadingText' => __('Creating *{name}*…', RML_TD),
87
+ 'addSuccess' => __('Successfully created *{name}*', RML_TD),
88
+ 'deleteFailedSub' => __('The folder you try to delete has subfolders.', RML_TD),
89
+ 'deleteLoadingText' => __('Deleting *{name}*…', RML_TD),
90
+ 'deleteSuccess' => __('Successfully deleted *{name}*', RML_TD),
91
+ 'deleteMultipleSuccess' => __('Successfully deleted *{count} folders*', RML_TD),
92
+ 'sortByManual' => __('Rearrange *{name}* placement manually', RML_TD),
93
+ 'sortLoadingText' => __('Reordering the tree hierarchy…', RML_TD),
94
+ 'sortedSuccess' => __('Successfully sorted the tree hierarchy', RML_TD),
95
+ 'sortLoadingText' => __('Reorder subfolders of *{name}*…', RML_TD),
96
+ 'filesRemaining' => __('{count} files remaining…', RML_TD),
97
+ 'receiveData' => __('Receiving data…', RML_TD),
98
+ 'shortcut' => __('Shortcut', RML_TD),
99
+ 'shortcutInfo' => __(
100
+ 'This is a shortcut of a media library file. Shortcuts doesn\'t need any physical storage *(0 kB)*. If you want to change the file itself, you must do this in the original file (for example replace media file through a plugin).
101
+ Note also that the fields in the shortcuts can be different to the original file, for example "Title", "Description" or "Caption".',
102
+ RML_TD
103
+ ),
104
+ 'orderFilterActive' => __(
105
+ 'In the current view of uploads, filters are active. Please reset them and refresh the view.',
106
+ RML_TD
107
+ ),
108
+ 'uploadingCollection' => __('A collection cannot contain files. Upload moved to Unorganized…', RML_TD),
109
+ 'uploadingGallery' => __('A gallery can only contain images. Upload moved to Unorganized…', RML_TD),
110
+ 'orderLoadingText' => __('Order content by *{name}*…', RML_TD),
111
+ 'orderByDnd' => __('Order content by drag & drop', RML_TD),
112
+ 'resetOrder' => __('Reset order', RML_TD),
113
+ 'applyOrderOnce' => __('Apply order once…', RML_TD),
114
+ 'last' => __('Last', RML_TD),
115
+ 'deactivateOrderAutomatically' => __('Deactivate automatic ordering', RML_TD),
116
+ 'applyOrderAutomatically' => __('Apply automatic order…', RML_TD),
117
+ 'latest' => __('Latest', RML_TD),
118
+ 'reindexOrder' => __('Reindex order', RML_TD),
119
+ 'resetToLastOrder' => __('Reset to last order', RML_TD),
120
+ 'allPosts' => __('All files', RML_TD),
121
+ 'unorganized' => __('Unorganized', RML_TD),
122
+ 'move' => __('Move {count} files', RML_TD),
123
+ 'moveOne' => __('Move one file', RML_TD),
124
+ 'append' => __('Copy {count} files', RML_TD),
125
+ 'appendOne' => __('Copy one file', RML_TD),
126
+ 'moveLoadingText' => __('Moving {count} files…', RML_TD),
127
+ 'moveLoadingTextOne' => __('Moving one file…', RML_TD),
128
+ 'appendLoadingText' => __('Copying {count} files…', RML_TD),
129
+ 'appendLoadingTextOne' => __('Copying one file…', RML_TD),
130
+ 'moveSuccess' => __('Successfully moved {count} files', RML_TD),
131
+ 'moveSuccessOne' => __('Successfully moved one file', RML_TD),
132
+ 'appendSuccess' => __('Successfully copied {count} files', RML_TD),
133
+ 'appendSuccessOne' => __('Successfully copied one file', RML_TD),
134
+ 'moveTip' => __('Hold any key to create a shortcut', RML_TD),
135
+ 'appendTip' => __('Release key to move file', RML_TD),
136
+ 'creatable0ToolTipTitle' => __('Click this to create a new folder', RML_TD),
137
+ 'creatable0ToolTipText' => __(
138
+ 'A folder can contain any file type and collection, but not galleries. If you want to create a subfolder, select a folder and click this button.',
139
+ RML_TD
140
+ ),
141
+ 'creatable1ToolTipTitle' => __('Click this to create a new collection', RML_TD),
142
+ 'creatable1ToolTipText' => __(
143
+ 'A collection cannot contain files. However, you can create additional collections and *galleries* there. This gallery is only a *gallery data folder*, i.e. they are not automatically visible on the website.
144
+
145
+ You can create a *visual gallery* by using a shortcode in the Visual Editor on your pages/postings.',
146
+ RML_TD
147
+ ),
148
+ 'creatable2ToolTipTitle' => __('Click this to create a *new gallery data folder*', RML_TD),
149
+ 'creatable2ToolTipText' => __(
150
+ 'A *gallery data folder* can only contain images. It is easier for you to distinguish where your visual galleries are located.
151
+
152
+ You can also order the images into *a custom image order* per drag&drop.',
153
+ RML_TD
154
+ ),
155
+ 'userSettingsToolTipTitle' => __('Settings', RML_TD),
156
+ 'userSettingsToolTipText' => __('General settings for the current logged in user.', RML_TD),
157
+ 'lockedToolTipTitle' => __('Permissions', RML_TD),
158
+ 'orderToolTipTitle' => __('Reorder files in this folder', RML_TD),
159
+ 'orderToolTipText' => __('Start to reorder the files / images by *title, filename, ID, …*', RML_TD),
160
+ 'refreshToolTipTitle' => __('Refresh', RML_TD),
161
+ 'refreshToolTipText' => __('Refreshes the current folder view.', RML_TD),
162
+ 'renameToolTipTitle' => __('Rename', RML_TD),
163
+ 'renameToolTipText' => __('Rename the current selected folder.', RML_TD),
164
+ 'trashToolTipTitle' => __('Delete', RML_TD),
165
+ 'trashToolTipText' => __('Delete the current selected folder.', RML_TD),
166
+ 'trashMultipleToolTipText' => __('Delete the current selected folders.', RML_TD),
167
+ 'sortToolTipTitle' => __('Rearrange', RML_TD),
168
+ 'sortToolTipText' => __('Change the hierarchical order of the folders.', RML_TD),
169
+ 'detailsToolTipTitle' => __('Folder details', RML_TD),
170
+ 'detailsToolTipText' => __('Select a folder and view more details about it.', RML_TD),
171
+ 'defaultFolderNoneLabel' => __('Please select a folder to show items.', RML_TD),
172
+ 'noProductLicense' => __('Product license not yet activated.', RML_TD),
173
+ 'enterLicense' => __('Enter license', RML_TD),
174
+ 'licenseNoticeDismiss' => __('Dismiss notice', RML_TD),
175
+ 'sidebarDetectedTax' => __(
176
+ 'It looks like you have already used another plugin for folders in the media library.',
177
+ RML_TD
178
+ ),
179
+ 'sidebarDetectedTaxImport' => __('Start importing', RML_TD),
180
+ 'sidebarDetectedTaxDismiss' => __('Dismiss', RML_TD),
181
+ 'settingCopyLinkInfoRpm' => __(
182
+ 'Real Media Library creates a virtual folder structure. The URLs of uploads do not change when you move the file. Learn more about <a href="https://devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-structure-to-my-file-system/" target="_blank">how to automatically move files to physical folders.</a>',
183
+ RML_TD
184
+ ),
185
+ 'proRedirect' => __(
186
+ 'You will be redirected to the external website of PRO version. Please confirm to continue!',
187
+ RML_TD
188
+ ),
189
+ 'proFeature' => __('PRO Feature', RML_TD),
190
+ 'proDismiss' => __('Hide for 20 days', RML_TD),
191
+ 'proFooterText' => __('Thanks for using the free version of Real Media Library.', RML_TD),
192
+ 'proLearnMore' => __('Learn more about PRO', RML_TD),
193
+ 'proBoxTitle' => __('Get PRO!', RML_TD),
194
+ 'proBoxOk' => __('I want to learn more!', RML_TD),
195
+ 'proBoxCancel' => __('No, not interested…', RML_TD),
196
+ 'proFeatures' => [
197
+ 'collections' => [
198
+ 'title' => __('You like collections?', RML_TD),
199
+ 'image' => 'collections.jpg',
200
+ 'description' => __(
201
+ 'Get more organized with different types of folders: Collections and galleries help you to easily recognize where your image galleries are located.',
202
+ RML_TD
203
+ )
204
+ ],
205
+ 'order-content' => [
206
+ 'title' => __('Custom content order?', RML_TD),
207
+ 'image' => 'order-content.gif',
208
+ 'description' => __(
209
+ 'Get your folder contents in order and arrange your files according to a criterion (e.g. name descending) or by drag & drop.',
210
+ RML_TD
211
+ )
212
+ ],
213
+ 'order-subfolders' => [
214
+ 'title' => __('Full order control?', RML_TD),
215
+ 'image' => 'order-subfolder.gif',
216
+ 'description' => __(
217
+ 'Organize the nodes within your folder tree according to a criterion (e.g. name descending) or by drag & drop.',
218
+ RML_TD
219
+ )
220
+ ],
221
+ 'subfolder' => [
222
+ 'title' => __('Want to create subfolders?', RML_TD),
223
+ 'image' => 'full-control.gif',
224
+ 'description' =>
225
+ __(
226
+ 'Subfolders offer you the possibility to bring more structure into your media library. They help you to keep the overview, even if you really have many files in your media library.',
227
+ RML_TD
228
+ ) . $liteSubfolderAdditionalText
229
+ ],
230
+ 'insert-media-tree-view' => [
231
+ 'title' => __('Want to switch between folders more comfortably?', RML_TD),
232
+ 'image' => 'inserting-media-dialog.gif',
233
+ 'description' => __(
234
+ 'Let the complete folder tree as in your media library also be displayed in this dialog instead of searching each time in the dropdown. It is simply more comfortable!',
235
+ RML_TD
236
+ )
237
+ ],
238
+ 'recursive-upload' => [
239
+ 'title' => __('Want to upload entire folders?', RML_TD),
240
+ 'description' => __(
241
+ 'With Real Media Library you can upload entire folders using drag and drop. All folders, subfolders and files will be uploaded and displayed in your media library in the same structure. Get PRO to upload folders!',
242
+ RML_TD
243
+ )
244
+ ]
245
+ ]
246
+ ];
247
+ }
248
+ }
inc/view/Options.php ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\view;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
6
+ // @codeCoverageIgnoreStart
7
+ \defined('ABSPATH') or die('No script kiddies please!');
8
+ // Avoid direct file request
9
+ // @codeCoverageIgnoreEnd
10
+ /**
11
+ * This class handles all hooks for the options.
12
+ *
13
+ * If you want to extend the options for your plugin
14
+ * please use the RML/Options/Register action. There are no
15
+ * parameters. The settings section headline must start with
16
+ * RealMediaLibrary:* (also in translation). The *-value will be
17
+ * added as navigation label.
18
+ */
19
+ class Options {
20
+ use UtilsProvider;
21
+ private static $me = null;
22
+ /**
23
+ * C'tor.
24
+ */
25
+ private function __construct() {
26
+ // Silence is golden.
27
+ }
28
+ /**
29
+ * Register RML core fields.
30
+ */
31
+ public function register_fields() {
32
+ if (!wp_rml_active()) {
33
+ return;
34
+ }
35
+ add_settings_section('rml_options_general', __('RealMediaLibrary:General'), [$this, 'empty_callback'], 'media');
36
+ add_option('rml_load_frontend', 1);
37
+ register_setting('media', 'rml_load_frontend', 'esc_attr');
38
+ add_settings_field(
39
+ 'rml_load_frontend',
40
+ '<label for="rml_load_frontend">' . __('Load RML functionality in frontend', RML_TD) . '</label>',
41
+ [$this, 'html_rml_load_frontend'],
42
+ 'media',
43
+ 'rml_options_general'
44
+ );
45
+ /**
46
+ * Allows you to register new options tabs and fields to the Real Media
47
+ * Library options panel (Settings > Media).
48
+ *
49
+ * @example <caption>Create a new tab with a settings field</caption>
50
+ * add_action( 'RML/Options/Register', function() {
51
+ * // Register tab
52
+ * add_settings_section(
53
+ * 'rml_options_custom',
54
+ * __('RealMediaLibrary:My Tab'), // The label must begin with RealMediaLibrary:
55
+ * [MatthiasWeb\RealMediaLibrary\view\Options::getInstance(), 'empty_callback'),
56
+ * 'media'
57
+ * );
58
+ *
59
+ * add_settings_field(
60
+ * 'rml_button_custom',
61
+ * '<label for="rml_button_custom">Your custom button</label>' ,
62
+ * 'my_function_to_print_rml_button_custom',
63
+ * 'media',
64
+ * 'rml_options_custom' // The section
65
+ * );
66
+ * } );
67
+ * @hook RML/Options/Register
68
+ */
69
+ do_action('RML/Options/Register');
70
+ // Reset
71
+ add_settings_section('rml_options_reset', __('RealMediaLibrary:Reset'), [$this, 'empty_callback'], 'media');
72
+ if ($this->isPro()) {
73
+ add_settings_field(
74
+ 'rml_button_order_reset',
75
+ '<label for="rml_button_order_reset">' . __('Reset the order of all galleries', RML_TD) . '</label>',
76
+ [$this, 'html_rml_button_order_reset'],
77
+ 'media',
78
+ 'rml_options_reset'
79
+ );
80
+ }
81
+ add_settings_field(
82
+ 'rml_button_wipe',
83
+ '<label for="rml_button_wipe">' .
84
+ __('Wipe all settings (folders, attachment relations)', RML_TD) .
85
+ '</label>',
86
+ [$this, 'html_rml_button_wipe'],
87
+ 'media',
88
+ 'rml_options_reset'
89
+ );
90
+ add_settings_field(
91
+ 'rml_button_cnt_reset',
92
+ '<label for="rml_button_wipe">' . __('Reset folder count cache', RML_TD) . '</label>',
93
+ [$this, 'html_rml_button_cnt_reset'],
94
+ 'media',
95
+ 'rml_options_reset'
96
+ );
97
+ add_settings_field(
98
+ 'rml_button_slug_reset',
99
+ '<label for="rml_button_wipe">' . __('Reset names, slugs and absolute pathes', RML_TD) . '</label>',
100
+ [$this, 'html_rml_button_slug_reset'],
101
+ 'media',
102
+ 'rml_options_reset'
103
+ );
104
+ }
105
+ // Noop
106
+ public function empty_callback($arg) {
107
+ // Silence is golden.
108
+ }
109
+ /**
110
+ * Output wipe button.
111
+ */
112
+ public function html_rml_button_wipe() {
113
+ // Check if reinstall the database tables
114
+ if (isset($_GET['rml_install'])) {
115
+ echo 'DB Update was executed<br /><br />';
116
+ $this->getCore()
117
+ ->getActivator()
118
+ ->install(\true);
119
+ echo '<br /><br />';
120
+ }
121
+ echo '<a class="rml-rest-button button" data-url="reset/relations" data-method="DELETE">' .
122
+ __('Wipe attachment relations', RML_TD) .
123
+ '</a>
124
+ <a class="rml-rest-button button" data-url="reset/folders" data-method="DELETE">' .
125
+ __('Wipe all', RML_TD) .
126
+ '</a>';
127
+ }
128
+ /**
129
+ * Output count reset button.
130
+ */
131
+ public function html_rml_button_cnt_reset() {
132
+ echo '<a class="rml-rest-button button rml-button-wipe" data-url="reset/count" data-method="DELETE">' .
133
+ __('Reset count', RML_TD) .
134
+ '</a>';
135
+ }
136
+ /**
137
+ * Output reset slug button.
138
+ */
139
+ public function html_rml_button_slug_reset() {
140
+ echo '<a class="rml-rest-button button rml-button-wipe" data-url="reset/slugs" data-method="DELETE">' .
141
+ __('Reset', RML_TD) .
142
+ '</a>';
143
+ }
144
+ /**
145
+ * Output load frontend checkbox.
146
+ */
147
+ public function html_rml_load_frontend() {
148
+ $value = get_option('rml_load_frontend', '1');
149
+ echo '<input type="checkbox" id="rml_load_frontend"
150
+ name="rml_load_frontend" value="1" ' .
151
+ checked(1, $value, \false) .
152
+ ' />
153
+ <label>' .
154
+ __(
155
+ 'Activate this option if you are using a page builder like Divi Page Builder, WPBakery Page Builder or Elementor.',
156
+ RML_TD
157
+ ) .
158
+ '</label>';
159
+ }
160
+ /**
161
+ * Output order reset button.
162
+ */
163
+ public function html_rml_button_order_reset() {
164
+ echo '<a class="rml-rest-button button button-primary" data-url="reset/order" data-method="DELETE">' .
165
+ __('Reset') .
166
+ '</a>
167
+ <p class="description">' .
168
+ __('You can also reset an single folder in its folder details.', RML_TD) .
169
+ '</p>';
170
+ }
171
+ /**
172
+ * Is RML allowed to load on frontend? (Non-Admin area)
173
+ *
174
+ * @return boolean
175
+ */
176
+ public static function load_frontend() {
177
+ return get_option('rml_load_frontend', '1') === '1';
178
+ }
179
+ /**
180
+ * Get instance.
181
+ *
182
+ * @return Options
183
+ */
184
+ public static function getInstance() {
185
+ return self::$me === null ? (self::$me = new \MatthiasWeb\RealMediaLibrary\view\Options()) : self::$me;
186
+ }
187
+ }
inc/view/View.php ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\view;
4
+
5
+ use MatthiasWeb\RealMediaLibrary\attachment\Structure;
6
+ use MatthiasWeb\RealMediaLibrary\base\UtilsProvider;
7
+ // @codeCoverageIgnoreStart
8
+ \defined('ABSPATH') or die('No script kiddies please!');
9
+ // Avoid direct file request
10
+ // @codeCoverageIgnoreEnd
11
+ /**
12
+ * Handles the view for dropdowns and custom UI's for folders.
13
+ */
14
+ class View {
15
+ use UtilsProvider;
16
+ private $structure;
17
+ private $namesSlugArrayCache = null;
18
+ /**
19
+ * C'tor.
20
+ *
21
+ * @param Structure $structure
22
+ */
23
+ public function __construct($structure) {
24
+ $this->structure = $structure;
25
+ }
26
+ // Documented in wp_rml_selector()
27
+ public function selector($options) {
28
+ $options = wp_parse_args($options, [
29
+ 'selected' => _wp_rml_root(),
30
+ 'disabled' => [],
31
+ 'nullable' => \false,
32
+ 'editable' => \true,
33
+ 'name' => \false,
34
+ 'title' => null
35
+ ]);
36
+ $name = empty($options['name']) ? '' : 'name="' . $options['name'] . '"';
37
+ return '<input type="hidden" value="' .
38
+ esc_attr($options['selected']) .
39
+ '" ' .
40
+ $name .
41
+ '
42
+ data-nullable="' .
43
+ esc_attr($options['nullable'] ? 'true' : 'false') .
44
+ '"
45
+ data-editable="' .
46
+ esc_attr($options['editable'] ? 'true' : 'false') .
47
+ '"
48
+ data-disabled="' .
49
+ esc_attr(\join(',', $options['disabled'])) .
50
+ '"
51
+ ' .
52
+ (empty($options['title']) ? '' : 'data-title="' . esc_attr($options['title']) . '"') .
53
+ '
54
+ data-wprfc-visible="1" data-wprfc="preUploadUi" />';
55
+ }
56
+ /**
57
+ * Create dropdown from the current users tree.
58
+ *
59
+ * @param int $selected
60
+ * @param boolean $disabled
61
+ * @param boolean $useAll
62
+ * @return string HTML
63
+ */
64
+ public function dropdown($selected, $disabled, $useAll = \true) {
65
+ return $this->optionsHTML($selected, null, '', '&nbsp;&nbsp;', $useAll, $disabled);
66
+ }
67
+ /**
68
+ * Gets a HTML formatted string for <option>.
69
+ *
70
+ * @param int $selected
71
+ * @param object[] $tree
72
+ * @param string $slashed
73
+ * @param string $spaces
74
+ * @param boolean $useAll
75
+ * @param boolean $disabled
76
+ */
77
+ private function optionsHTML(
78
+ $selected = -1,
79
+ $tree = null,
80
+ $slashed = '',
81
+ $spaces = '&nbsp;&nbsp;',
82
+ $useAll = \true,
83
+ $disabled = null
84
+ ) {
85
+ $return = '';
86
+ $selected = $selected === -1 ? _wp_rml_root() : $selected;
87
+ if ($disabled === null) {
88
+ $disabled = [];
89
+ }
90
+ if ($tree === null) {
91
+ $root = _wp_rml_root();
92
+ $tree = $this->structure->getTree();
93
+ if ($useAll) {
94
+ $return .=
95
+ '<option value="" ' .
96
+ $this->optionsSelected($selected, '') .
97
+ (\in_array(RML_TYPE_ALL, $disabled, \true) ? 'disabled="disabled"' : '') .
98
+ '>' .
99
+ __('All', RML_TD) .
100
+ '</option>';
101
+ }
102
+ $return .=
103
+ '<option value="' .
104
+ $root .
105
+ '" ' .
106
+ $this->optionsSelected($selected, $root) .
107
+ 'data-path="/"' .
108
+ (\in_array(RML_TYPE_ROOT, $disabled, \true) ? 'disabled="disabled"' : '') .
109
+ ' data-name="' .
110
+ esc_attr(__('Unorganized', RML_TD)) .
111
+ '"' .
112
+ ' data-type="' .
113
+ RML_TYPE_ROOT .
114
+ '">' .
115
+ __('Unorganized', RML_TD) .
116
+ '</option>';
117
+ }
118
+ if (!\is_null($tree) && \count($tree) > 0) {
119
+ foreach ($tree as $parent) {
120
+ if (!$parent->isVisible()) {
121
+ continue;
122
+ }
123
+ $return .=
124
+ '<option value="' .
125
+ $parent->getId() .
126
+ '" ' .
127
+ $this->optionsSelected($selected, $parent->getId()) .
128
+ ' data-path="/' .
129
+ esc_attr($parent->getAbsolutePath()) .
130
+ '"' .
131
+ ' data-name="' .
132
+ esc_attr($parent->getName()) .
133
+ '"' .
134
+ ' data-type="' .
135
+ $parent->getType() .
136
+ '"' .
137
+ (\in_array($parent->getType(), $disabled, \true) ? ' disabled="disabled" ' : '') .
138
+ '>' .
139
+ $spaces .
140
+ '&nbsp;' .
141
+ $parent->getName(\true) .
142
+ '</option>';
143
+ if (\is_array($parent->getChildren()) && \count($parent->getChildren()) > 0) {
144
+ $return .= $this->optionsHTML(
145
+ $selected,
146
+ $parent->getChildren(),
147
+ $slashed,
148
+ \str_repeat($spaces, 2),
149
+ $useAll,
150
+ $disabled
151
+ );
152
+ }
153
+ }
154
+ }
155
+ return $return;
156
+ }
157
+ // See optionsHTML
158
+ public function optionsSelected($selected, $value) {
159
+ if ((\is_array($selected) && \in_array($value, $selected, \true)) || $selected === $value) {
160
+ return 'selected="selected"';
161
+ } else {
162
+ return '';
163
+ }
164
+ }
165
+ /**
166
+ * Get array for the javascript backbone view.
167
+ * The private namesSlugArray is for caching purposes
168
+ * and can be reset with the given function.
169
+ *
170
+ * @param object[] $tree
171
+ * @param string $spaces
172
+ * @param boolean $forceReload
173
+ * @return mixed
174
+ */
175
+ public function namesSlugArray($tree = null, $spaces = '--', $forceReload = \false) {
176
+ if ($forceReload || $this->namesSlugArrayCache === null) {
177
+ $result = $this->namesSlugArrayRec($tree, $spaces);
178
+ } else {
179
+ $result = $this->namesSlugArrayCache;
180
+ }
181
+ $this->namesSlugArrayCache = $result;
182
+ return $result;
183
+ }
184
+ // See namesSlugArray
185
+ private function namesSlugArrayRec($tree = null, $spaces = '--') {
186
+ $return = ['names' => [], 'slugs' => [], 'types' => []];
187
+ if ($tree === null) {
188
+ $tree = $this->structure->getTree();
189
+ $return['names'][] = __('Unorganized pictures', RML_TD);
190
+ $return['slugs'][] = _wp_rml_root();
191
+ $return['types'][] = 0;
192
+ }
193
+ if (!\is_null($tree) && \count($tree) > 0) {
194
+ foreach ($tree as $parent) {
195
+ if (!$parent->isVisible()) {
196
+ continue;
197
+ }
198
+ $return['names'][] = $spaces . ' ' . $parent->getName();
199
+ $return['slugs'][] = $parent->getId();
200
+ $return['types'][] = $parent->getType();
201
+ if (\is_array($parent->getChildren()) && \count($parent->getChildren()) > 0) {
202
+ $append = $this->namesSlugArrayRec($parent->getChildren(), $spaces . '--');
203
+ $return['names'] = \array_merge($return['names'], $append['names']);
204
+ $return['slugs'] = \array_merge($return['slugs'], $append['slugs']);
205
+ $return['types'] = \array_merge($return['types'], $append['types']);
206
+ }
207
+ }
208
+ }
209
+ return $return;
210
+ }
211
+ /**
212
+ * Getter.
213
+ *
214
+ * @return Structure
215
+ */
216
+ public function getStructure() {
217
+ return $this->structure;
218
+ }
219
+ }
inc/view/index.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MatthiasWeb\RealMediaLibrary\Vendor;
4
+
5
+ // Silence is golden.
index.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Main file for WordPress.
4
+ *
5
+ * @wordpress-plugin
6
+ * Plugin Name: Real Media Library (Free)
7
+ * Plugin URI: https://devowl.io/wordpress-real-media-library/
8
+ * Description: Organize uploaded media in folders, collections and galleries: A file manager for WordPress. Media management made easy!
9
+ * Author: devowl.io
10
+ * Author URI: https://devowl.io
11
+ * Version: 4.17.3
12
+ * Text Domain: real-media-library
13
+ * Domain Path: /languages
14
+ */
15
+
16
+ defined('ABSPATH') or die('No script kiddies please!'); // Avoid direct file request
17
+
18
+ /**
19
+ * Plugin constants. This file is procedural coding style for initialization of
20
+ * the plugin core and definition of plugin configuration.
21
+ */
22
+ if (defined('RML_PATH')) {
23
+ require_once path_join(dirname(__FILE__), 'inc/base/others/fallback-already.php');
24
+ return;
25
+ }
26
+ define('RML_FILE', __FILE__);
27
+ define('RML_PATH', dirname(RML_FILE));
28
+ define('RML_ROOT_SLUG', 'devowl-wp');
29
+ define('RML_SLUG', basename(RML_PATH));
30
+ define('RML_INC', trailingslashit(path_join(RML_PATH, 'inc')));
31
+ define('RML_MIN_PHP', '7.0.0'); // Minimum of PHP 5.3 required for autoloading and namespacing
32
+ define('RML_MIN_WP', '5.0.0'); // Minimum of WordPress 5.0 required
33
+ define('RML_NS', 'MatthiasWeb\\RealMediaLibrary');
34
+ define('RML_DB_PREFIX', 'realmedialibrary'); // The table name prefix wp_{prefix}
35
+ define('RML_OPT_PREFIX', 'rml'); // The option name prefix in wp_options
36
+ define('RML_SLUG_CAMELCASE', lcfirst(str_replace('-', '', ucwords(RML_SLUG, '-'))));
37
+ //define('RML_TD', ''); This constant is defined in the core class. Use this constant in all your __() methods
38
+ //define('RML_VERSION', ''); This constant is defined in the core class
39
+ //define('RML_DEBUG', true); This constant should be defined in wp-config.php to enable the Base#debug() method
40
+
41
+ define('RML_SLUG_LITE', 'real-media-library-lite');
42
+ define('RML_SLUG_PRO', 'real-media-library');
43
+ define('RML_PRO_VERSION', 'https://devowl.io/go/real-media-library?source=rml-lite');
44
+
45
+ define('RML_TYPE_FOLDER', 0);
46
+ define('RML_TYPE_COLLECTION', 1);
47
+ define('RML_TYPE_GALLERY', 2);
48
+ define('RML_TYPE_ALL', 3);
49
+ define('RML_TYPE_ROOT', 4);
50
+
51
+ // Check PHP Version and print notice if minimum not reached, otherwise start the plugin core
52
+ require_once RML_INC .
53
+ 'base/others/' .
54
+ (version_compare(phpversion(), RML_MIN_PHP, '>=') ? 'start.php' : 'fallback-php-version.php');
languages/real-media-library-da_DK.mo ADDED
Binary file
languages/real-media-library-da_DK.po ADDED
@@ -0,0 +1,1276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: n/a\n"
4
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
5
+ "POT-Creation-Date: n/a\n"
6
+ "PO-Revision-Date: 2021-09-10 08:35+0000\n"
7
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
8
+ "Language-Team: Danish <https://translate.devowl.io/projects/wordpress-real-"
9
+ "media-library-backend-php/ci-mojito/da/>\n"
10
+ "Language: da_DK\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Weblate 4.8\n"
16
+
17
+ #. Plugin Name of the plugin
18
+ #, fuzzy
19
+ #| msgid "RealMediaLibrary:Reset"
20
+ msgid "Real Media Library"
21
+ msgstr "RealMediaLibrary:Nulstil"
22
+
23
+ #. Plugin URI of the plugin
24
+ msgid "https://devowl.io/wordpress-real-media-library/"
25
+ msgstr ""
26
+
27
+ #. Description of the plugin
28
+ msgid ""
29
+ "Organize uploaded media in folders, collections and galleries: A file "
30
+ "manager for WordPress. Media management made easy!"
31
+ msgstr ""
32
+
33
+ #. Author of the plugin
34
+ msgid "devowl.io"
35
+ msgstr ""
36
+
37
+ #. Author URI of the plugin
38
+ msgid "https://devowl.io"
39
+ msgstr ""
40
+
41
+ #: inc/AdInitiator.php:1
42
+ msgid "Complete file and folder manager"
43
+ msgstr "Fuldendt fil og folder manager"
44
+
45
+ #: inc/AdInitiator.php:1
46
+ msgid ""
47
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
48
+ "media management. You can use this plugin to organize the thousands of "
49
+ "images, audio, video and PDF files in your media library into folders. "
50
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
51
+ "WordPress."
52
+ msgstr ""
53
+ "Real Media Library er et WordPress-plugin, der giver dig avanceret "
54
+ "mediehåndtering. Du kan bruge dette plugin til at organisere tusindvis af "
55
+ "billeder, lyd, video og PDF-filer i dit mediebibliotek i mapper. Dybest set "
56
+ "er det en filhåndtering som Windows Stifinder eller Mac Finder, men blot for "
57
+ "WordPress."
58
+
59
+ #: inc/AdInitiator.php:1
60
+ msgid "Filter in insert media dialog"
61
+ msgstr "Filtrer i dialogboksen \"Indsæt medie\""
62
+
63
+ #: inc/AdInitiator.php:1
64
+ msgid ""
65
+ "No matter where you are, the folder structure of Real Media Library is "
66
+ "always where you can select files. For example in the dialog for selecting a "
67
+ "\"Featured Image\"."
68
+ msgstr ""
69
+ "Uanset hvor du er, er mappestrukturen i Real Media Library altid, hvor du "
70
+ "kan vælge filer. For eksempel i dialogen til valg af et \"Fremhævet billede"
71
+ "\"."
72
+
73
+ #: inc/AdInitiator.php:1
74
+ msgid ""
75
+ "In the Lite version you can only select the folder by a simple dropdown."
76
+ msgstr "I Lite-versionen kan du kun vælge mappen ved en simpel rullemenu."
77
+
78
+ #: inc/AdInitiator.php:1
79
+ msgid "Custom image order"
80
+ msgstr "Brugerdefineret billedrækkefølge"
81
+
82
+ #: inc/AdInitiator.php:1
83
+ msgid ""
84
+ "Organizing your media files is really easy with the Real Media Library "
85
+ "plugin. You can arrange the order of your files yourself by dragging and "
86
+ "dropping. This allows you to move important files to the top for faster "
87
+ "access."
88
+ msgstr ""
89
+ "Organisering af dine mediefiler er virkelig let med Real Media Library-"
90
+ "pluginnet. Du kan selv arrangere rækkefølgen af dine filer ved at trække og "
91
+ "slippe. Dette giver dig mulighed for at flytte vigtige filer til toppen for "
92
+ "hurtigere adgang."
93
+
94
+ #: inc/AdInitiator.php:1
95
+ msgid "Get your PRO license now!"
96
+ msgstr "Få din PRO licens nu!"
97
+
98
+ #: inc/api/attachment.php:1
99
+ msgid "The given folder was not found."
100
+ msgstr "Den givne mappe blev ikke fundet."
101
+
102
+ #: inc/Assets.php:1
103
+ msgid "Complementary Plugins"
104
+ msgstr "Supplerende plugins"
105
+
106
+ #: inc/Assets.php:1
107
+ msgid ""
108
+ "\n"
109
+ "\n"
110
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
111
+ "deleted.\n"
112
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
113
+ "deleted, too."
114
+ msgstr ""
115
+ "\n"
116
+ "\n"
117
+ "Bemærk: Hvis du vil slette en genvejsfil, slettes kildefilen IKKE.\n"
118
+ "Hvis du vil slette en ikke-genvejsfil, slettes også alle tilknyttede genveje."
119
+
120
+ #: inc/attachment/CustomField.php:1
121
+ msgid ""
122
+ "If you move this shortcut, the location of the source/main file is not "
123
+ "changed."
124
+ msgstr ""
125
+ "Hvis du flytter denne genvej, ændres kildens/hovedfilens placering ikke."
126
+
127
+ #: inc/attachment/CustomField.php:1
128
+ msgid ""
129
+ "If you move this attachment, the folder location of the associated shortcuts "
130
+ "are not changed."
131
+ msgstr ""
132
+ "Hvis du flytter denne vedhæftede fil, ændres mappeplaceringen for de "
133
+ "tilknyttede genveje ikke."
134
+
135
+ #: inc/attachment/CustomField.php:1
136
+ msgid "Move to another folder"
137
+ msgstr "Flyt til en anden mappe"
138
+
139
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
140
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
141
+ msgid "Folder"
142
+ msgstr "Mappe"
143
+
144
+ #: inc/attachment/CustomField.php:1
145
+ msgid "Shortcut infos"
146
+ msgstr "Genvejs-info"
147
+
148
+ #: inc/attachment/CustomField.php:1
149
+ msgid ""
150
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
151
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
152
+ "itself, you must do this in the original file (for example replace media "
153
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
154
+ "be different to the original file, for example \"Title\", \"Description\" or "
155
+ "\"Caption\"."
156
+ msgstr ""
157
+ "Dette er en genvej til en mediebiblioteksfil. Genveje behøver ikke nogen "
158
+ "fysisk lagring <strong> (0 kB) </strong>. Hvis du vil ændre selve filen, "
159
+ "skal du gøre dette i den originale fil (f.eks. Udskifte mediefil gennem et "
160
+ "plugin). <br/> Bemærk også, at felterne i genveje kan være forskellige fra "
161
+ "den originale fil, for eksempel \"Titel\", \"Beskrivelse\" eller "
162
+ "\"billedtekst\"."
163
+
164
+ #. translators:
165
+ #: inc/attachment/CustomField.php:1
166
+ msgid "For this file is %d shortcut available in the following folder:"
167
+ msgid_plural ""
168
+ "For this file are %d shortcuts available in the following folders:"
169
+ msgstr[0] "For denne fil er %d genvej tilgængelig i følgende mappe:"
170
+ msgstr[1] "For denne fil er %d genvej tilgængelig i følgende mapper:"
171
+
172
+ #: inc/attachment/CustomField.php:1
173
+ msgid ""
174
+ "This file has no associated shortcuts. You can create shortcuts by moving "
175
+ "files per mouse and hold any key."
176
+ msgstr ""
177
+ "Denne fil har ingen tilknyttede genveje. Du kan oprette genveje ved at "
178
+ "flytte filer med musen og holde en vilkårlig tast nede."
179
+
180
+ #: inc/attachment/Permissions.php:1
181
+ msgid "You are not allowed to insert files here."
182
+ msgstr "Du har ikke tilladelse til at indsætte filer her."
183
+
184
+ #: inc/attachment/Permissions.php:1
185
+ msgid "You are not allowed to move the file."
186
+ msgstr "Du har ikke tilladelse til at flytte filen."
187
+
188
+ #: inc/attachment/Permissions.php:1
189
+ msgid "You are not allowed to create a subfolder here."
190
+ msgstr "Du har ikke tilladelse til at oprette en undermappe her."
191
+
192
+ #: inc/attachment/Permissions.php:1
193
+ msgid "You are not allowed to delete this folder."
194
+ msgstr "Du har ikke tilladelse til at slette denne mappe."
195
+
196
+ #: inc/attachment/Permissions.php:1
197
+ msgid "You are not allowed to rename this folder."
198
+ msgstr "Du har ikke tilladelse til at omdøbe denne mappe."
199
+
200
+ #: inc/attachment/Upload.php:1
201
+ msgid "Select destination folder"
202
+ msgstr "Vælg destinationsmappe"
203
+
204
+ #: inc/attachment/Upload.php:1
205
+ msgid ""
206
+ "You can simply upload files directly to a folder. Select a folder and upload "
207
+ "files."
208
+ msgstr ""
209
+ "Du kan blot uploade filer direkte til en mappe. Vælg en mappe, og upload "
210
+ "filer."
211
+
212
+ #: inc/attachment/Upload.php:1
213
+ msgid "upload to folder"
214
+ msgstr "upload to folder"
215
+
216
+ #: inc/comp/ExImport.php:1
217
+ msgid "RealMediaLibrary:Import / Export"
218
+ msgstr "RealMediaLibrary: Import / eksport"
219
+
220
+ #: inc/comp/ExImport.php:1
221
+ msgid "Import from other plugins"
222
+ msgstr "Importer fra andre plugins"
223
+
224
+ #: inc/comp/ExImport.php:1
225
+ msgid "Export / Import Real Media Library folders"
226
+ msgstr "Eksporter / importer mapper til Real Media Library"
227
+
228
+ #: inc/comp/ExImport.php:1
229
+ msgid "Export"
230
+ msgstr "Eksporter"
231
+
232
+ #: inc/comp/ExImport.php:1
233
+ msgid "Import"
234
+ msgstr "Impoter"
235
+
236
+ #: inc/comp/ExImport.php:1
237
+ msgid ""
238
+ "All available folders will be exported. The current structure is not lost "
239
+ "during import - but check that there are no duplicate names in the import "
240
+ "data, as these are not checked."
241
+ msgstr ""
242
+ "Alle tilgængelige mapper eksporteres. Den aktuelle struktur går ikke tabt "
243
+ "under importen - men kontroller, at der ikke er duplikatnavne i "
244
+ "importdataerne, da disse ikke er markeret."
245
+
246
+ #: inc/comp/ExImport.php:1
247
+ msgid "Exported data:"
248
+ msgstr "Eksporteret data:"
249
+
250
+ #: inc/comp/ExImport.php:1
251
+ msgid "Import data:"
252
+ msgstr "Importer data:"
253
+
254
+ #: inc/comp/ExImport.php:1
255
+ msgid "Importing data is only available in PRO version."
256
+ msgstr "Importeret data er kun tilgængelig i PRO-versionen."
257
+
258
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
259
+ #: inc/view/Lang.php:1
260
+ msgid "Learn more about PRO"
261
+ msgstr "Lær mere om PRO"
262
+
263
+ #: inc/comp/ExImport.php:1
264
+ msgid "Imports categories and post relations."
265
+ msgstr "Importkategorier og relateret poster."
266
+
267
+ #: inc/comp/ExImport.php:1
268
+ msgid "Nothing to import."
269
+ msgstr "Intet at importere."
270
+
271
+ #: inc/comp/ExImport.php:1
272
+ msgid ""
273
+ "Importing categories from another plugin is only available in PRO version."
274
+ msgstr ""
275
+ "Importering af kategorier fra et andet plugin er kun tilgængelig i PRO-"
276
+ "versionen."
277
+
278
+ #: inc/comp/ExportMediaLibrary.php:1
279
+ msgid "No valid folder."
280
+ msgstr "Ingen gyldig mappe."
281
+
282
+ #: inc/comp/ExportMediaLibrary.php:1
283
+ msgid "No valid type."
284
+ msgstr "Ingen gyldig filtype."
285
+
286
+ #: inc/comp/PolyLang.php:1
287
+ msgid "PolyLang: Automatically move translations"
288
+ msgstr "PolyLang: Flyt automatisk oversættelser"
289
+
290
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
291
+ msgid ""
292
+ "If you move a file, the corresponding translated file will also be moved."
293
+ msgstr "Hvis du flytter en fil, flyttes den tilsvarende oversatte fil også."
294
+
295
+ #: inc/comp/WPML.php:1
296
+ msgid "WPML: Automatically move translations"
297
+ msgstr "WPML: Flyt automatisk oversættelser"
298
+
299
+ #. translators:
300
+ #: inc/exception/FolderAlreadyExistsException.php:1
301
+ msgid "'%s' already exists in this folder."
302
+ msgstr "'%s' findes allerede i denne mappe."
303
+
304
+ #. translators:
305
+ #: inc/exception/OnlyInProVersionException.php:1
306
+ msgid "This functionality is not available in the free version (%s)."
307
+ msgstr "Denne funktionalitet er ikke tilgængelig i den gratis version (%s)."
308
+
309
+ #: inc/folder/Creatable.php:1
310
+ msgid "You need to provide a set of files."
311
+ msgstr "Du skal angive en gruppe af filer."
312
+
313
+ #: inc/folder/Creatable.php:1
314
+ msgid "The folder could not be created in the database."
315
+ msgstr "Mappen kunne ikke oprettes i databasen."
316
+
317
+ #: inc/folder/Creatable.php:1
318
+ msgid "The folder could not be created because it already exists."
319
+ msgstr "Mappen kunne ikke oprettes, fordi den allerede findes."
320
+
321
+ #: inc/folder/Creatable.php:1
322
+ msgid ""
323
+ "A folder can contain every type of file or a collection, but not gallery."
324
+ msgstr ""
325
+ "En mappe kan indeholde alle typer filer eller samlinger, men ikke et galleri."
326
+
327
+ #. translators:
328
+ #: inc/folder/Creatable.php:1
329
+ msgid "'%s' is not a valid folder name."
330
+ msgstr "'%s' er ikke et gyldigt mappenavn."
331
+
332
+ #: inc/folder/Creatable.php:1
333
+ msgid "Order by name ascending"
334
+ msgstr "Sorter efter navn stigende"
335
+
336
+ #: inc/folder/Creatable.php:1
337
+ msgid "Order by name descending"
338
+ msgstr "Sorter efter navn faldende"
339
+
340
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
341
+ msgid "Order by ID ascending"
342
+ msgstr "Sorter efter ID stigende"
343
+
344
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
345
+ msgid "Order by ID descending"
346
+ msgstr "Sorter efter ID faldende"
347
+
348
+ #: inc/folder/CRUD.php:1
349
+ msgid "The given folder does not exist or you cannot rename this folder."
350
+ msgstr "Den givne mappe findes ikke, eller du kan ikke omdøbe denne mappe."
351
+
352
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
353
+ msgid "The folder you try to delete has subfolders."
354
+ msgstr "Den mappe, du prøver at slette, har undermapper."
355
+
356
+ #: inc/folder/CRUD.php:1
357
+ msgid "The given folder does not exist."
358
+ msgstr "Den givne mappe findes ikke."
359
+
360
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
361
+ msgid "Unorganized"
362
+ msgstr "Uorganiseret"
363
+
364
+ #: inc/folder/Root.php:1
365
+ msgid ""
366
+ "Unorganized is the same as a root folder. Here you can find all files which "
367
+ "are not assigned to a folder."
368
+ msgstr ""
369
+ "Uorganiseret er det samme som en rodmappe. Her kan du finde alle filer, der "
370
+ "ikke er tildelt en mappe."
371
+
372
+ #: inc/metadata/CoverImage.php:1
373
+ msgid ""
374
+ "This option is disabled on this page. Please navigate to the media library."
375
+ msgstr ""
376
+ "Denne mulighed er deaktiveret på denne side. Naviger til mediebiblioteket."
377
+
378
+ #: inc/metadata/CoverImage.php:1
379
+ msgid "Cover image"
380
+ msgstr "Forsidebillede"
381
+
382
+ #: inc/metadata/Description.php:1
383
+ msgid "Description"
384
+ msgstr "Beskrivelse"
385
+
386
+ #: inc/metadata/Meta.php:1
387
+ msgid "Path"
388
+ msgstr "Sti"
389
+
390
+ #: inc/metadata/Meta.php:1
391
+ msgid "Folder type"
392
+ msgstr "Mappetype"
393
+
394
+ #: inc/metadata/Meta.php:1
395
+ msgid "General"
396
+ msgstr "Generelt"
397
+
398
+ #: inc/order/Sortable.php:1
399
+ msgid "Order by date ascending"
400
+ msgstr "Sortering efter dato stigende"
401
+
402
+ #: inc/order/Sortable.php:1
403
+ msgid "Order by date descending"
404
+ msgstr "Sortering efter dato faldende"
405
+
406
+ #: inc/order/Sortable.php:1
407
+ msgid "Order by title ascending"
408
+ msgstr "Sortering efter titel stigende"
409
+
410
+ #: inc/order/Sortable.php:1
411
+ msgid "Order by title descending"
412
+ msgstr "Sortering efter titel faldende"
413
+
414
+ #: inc/order/Sortable.php:1
415
+ msgid "Order by filename ascending"
416
+ msgstr "Sortering efter filnavn stigende"
417
+
418
+ #: inc/order/Sortable.php:1
419
+ msgid "Order by filename descending"
420
+ msgstr "Sortering efter filnavn faldende"
421
+
422
+ #: inc/order/Sortable.php:1
423
+ msgid "Natural order by filename ascending"
424
+ msgstr "Naturlig rækkefølge efter filnavn stigende"
425
+
426
+ #: inc/order/Sortable.php:1
427
+ msgid "Natural order by filename descending"
428
+ msgstr "Naturlig rækkefølge efter filnavn faldende"
429
+
430
+ #: inc/overrides/lite/folder/Creatable.php:1
431
+ #: inc/overrides/pro/folder/Creatable.php:1
432
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
433
+ msgid "Something went wrong."
434
+ msgstr "Noget gik galt."
435
+
436
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
437
+ msgid "Folder not found."
438
+ msgstr "Mappen er ikke fundet."
439
+
440
+ #: inc/overrides/pro/Core.php:1
441
+ msgid ""
442
+ "<strong>You have not yet entered the license key</strong>. To receive "
443
+ "automatic updates, please enter the key in \"Enter license\"."
444
+ msgstr ""
445
+ "<strong> Du har endnu ikke indtastet licensnøglen </strong>. For at modtage "
446
+ "automatiske opdateringer skal du indtaste nøglen i \"Indtast licens\"."
447
+
448
+ #: inc/overrides/pro/folder/Collection.php:1
449
+ msgid "A collection cannot contain files."
450
+ msgstr "En samling kan indeholde filer."
451
+
452
+ #: inc/overrides/pro/folder/Collection.php:1
453
+ msgid "Collection"
454
+ msgstr "Samling"
455
+
456
+ #: inc/overrides/pro/folder/Collection.php:1
457
+ msgid ""
458
+ "A collection cannot contain files. But you can create other collections and "
459
+ "<strong> galleries</strong> there."
460
+ msgstr ""
461
+ "En samling kan ikke indeholde filer. Men du kan oprette andre samlinger og "
462
+ "<strong> gallerier </strong> der."
463
+
464
+ #. translators:
465
+ #: inc/overrides/pro/folder/Creatable.php:1
466
+ msgid "The parent %d does not exist."
467
+ msgstr "Forælderen %d findes ikke."
468
+
469
+ #: inc/overrides/pro/folder/Creatable.php:1
470
+ msgid "The given parent does not exist to set the parent for this folder."
471
+ msgstr ""
472
+ "Den valgte forælder findes ikke for at indstille forælderen til denne mappe."
473
+
474
+ #: inc/overrides/pro/folder/Creatable.php:1
475
+ msgid "You are not allowed to change the parent for this folder."
476
+ msgstr "Du har ikke lov til at ændre forælder for denne mappe."
477
+
478
+ #: inc/overrides/pro/folder/Creatable.php:1
479
+ msgid "The given parent does not allow the folder type."
480
+ msgstr "Den valgte forælder tillader ikke mappetypen."
481
+
482
+ #: inc/overrides/pro/folder/Gallery.php:1
483
+ msgid "You can only move images to a gallery."
484
+ msgstr "Du kan kun flytte billeder til et galleri."
485
+
486
+ #: inc/overrides/pro/folder/Gallery.php:1
487
+ msgid "Gallery"
488
+ msgstr "Galleri"
489
+
490
+ #: inc/overrides/pro/folder/Gallery.php:1
491
+ msgid ""
492
+ "A gallery can only contain images. To view a gallery, go to a post and look "
493
+ "at the buttons of the visual editor.."
494
+ msgstr ""
495
+ "Et galleri kan kun indeholde billeder. For at se et galleri skal du gå til "
496
+ "et indlæg og se på knapperne i den visuelle editor."
497
+
498
+ #: inc/overrides/pro/order/Sortable.php:1
499
+ msgid "The given folder does not allow to reorder the files."
500
+ msgstr "Den valgte mappe tillader ikke at omarrangere filerne."
501
+
502
+ #: inc/overrides/pro/order/Sortable.php:1
503
+ msgid "This folder has an automatic order. Please deactivate that first."
504
+ msgstr "Denne mappe har en automatisk ordre. Deaktiver venligst det først."
505
+
506
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
507
+ msgid "Please select a folder to show items."
508
+ msgstr "Vælg en mappe for at vise indhold."
509
+
510
+ #: inc/rest/Attachment.php:1
511
+ msgid "Fetch only media in a folder by folder id."
512
+ msgstr "Hent kun medier i en mappe efter mappe id."
513
+
514
+ #: inc/rest/Service.php:1
515
+ msgid "Forbidden"
516
+ msgstr "Forbudt"
517
+
518
+ #: inc/rest/Service.php:1
519
+ msgid "Real Media Library is not active for the current user."
520
+ msgstr "Real Media Library er ikke aktivt for den aktuelle bruger."
521
+
522
+ #: inc/usersettings/AllFilesShortcuts.php:1
523
+ msgid "Hide shortcuts in \"All files\""
524
+ msgstr "Skjul genveje i \"Alle filer\""
525
+
526
+ #: inc/usersettings/AllFilesShortcuts.php:1
527
+ msgid "The count always includes shortcuts"
528
+ msgstr "Optællingen indeholder altid genveje"
529
+
530
+ #: inc/usersettings/DefaultFolder.php:1
531
+ msgid "Default startup folder"
532
+ msgstr "Standard opstartsmappe"
533
+
534
+ #: inc/usersettings/DefaultFolder.php:1
535
+ msgid "No folder at startup"
536
+ msgstr "Ingen mappe ved opstart"
537
+
538
+ #: inc/usersettings/DefaultFolder.php:1
539
+ msgid "Last opened folder"
540
+ msgstr "Sidst åbnede mappe"
541
+
542
+ #: inc/usersettings/DefaultFolder.php:1
543
+ msgid ""
544
+ "Your media library can always open in the last opened folder or a folder you "
545
+ "choose. This saves you time every time you open the media library!"
546
+ msgstr ""
547
+ "Dit mediebibliotek kan altid åbne i den sidst åbnede mappe eller en mappe, "
548
+ "du vælger. Dette sparer dig tid hver gang du åbner mediebiblioteket!"
549
+
550
+ #: inc/usersettings/InfiniteScrolling.php:1
551
+ msgid "Enable infinite scrolling in grid view"
552
+ msgstr ""
553
+
554
+ #: inc/usersettings/InfiniteScrolling.php:1
555
+ msgid ""
556
+ "Instead of displaying a \"Load More\" button, all files are loaded "
557
+ "automatically as you scroll down. This is not supported in list view."
558
+ msgstr ""
559
+
560
+ #: inc/view/FolderShortcode.php:1
561
+ msgid "Gallery from Media Folder"
562
+ msgstr "Galleri fra Media Mappe"
563
+
564
+ #: inc/view/FolderShortcode.php:1
565
+ msgid ""
566
+ "Note: You can only select galleries. Folders and collections are grayed."
567
+ msgstr "Bemærk: Du kan kun vælge gallerier. Mapper og samlinger er gråtonede."
568
+
569
+ #: inc/view/FolderShortcode.php:1
570
+ msgid "Link to"
571
+ msgstr "Link til"
572
+
573
+ #: inc/view/FolderShortcode.php:1
574
+ msgid "Columns"
575
+ msgstr "Kolonner"
576
+
577
+ #: inc/view/FolderShortcode.php:1
578
+ msgid "Random Order"
579
+ msgstr "Tilfældig rækkefølge"
580
+
581
+ #: inc/view/FolderShortcode.php:1
582
+ msgid "Size"
583
+ msgstr "Størrelse"
584
+
585
+ #: inc/view/FolderShortcode.php:1
586
+ msgid "Attachment File"
587
+ msgstr "Vedhæftet fil"
588
+
589
+ #: inc/view/FolderShortcode.php:1
590
+ msgid "Media File"
591
+ msgstr "Mediefil"
592
+
593
+ #: inc/view/FolderShortcode.php:1
594
+ msgid "None"
595
+ msgstr "Ingen"
596
+
597
+ #: inc/view/FolderShortcode.php:1
598
+ msgid "Thumbnail"
599
+ msgstr "Ikon"
600
+
601
+ #: inc/view/FolderShortcode.php:1
602
+ msgid "Medium"
603
+ msgstr "Medium"
604
+
605
+ #: inc/view/FolderShortcode.php:1
606
+ msgid "Large"
607
+ msgstr "Stor"
608
+
609
+ #: inc/view/FolderShortcode.php:1
610
+ msgid "Full Size"
611
+ msgstr "Fuld størrelse"
612
+
613
+ #: inc/view/Lang.php:1
614
+ msgid ""
615
+ "Subfolders are only available in the PRO version. But you can now create an "
616
+ "unlimited number of folders on the main level (instead of the previous max. "
617
+ "10 folders)."
618
+ msgstr ""
619
+ "Undermapper er kun tilgængelige i PRO -versionen. Men du kan nu oprette et "
620
+ "ubegrænset antal mapper på hovedniveauet (i stedet for de tidligere maks. 10 "
621
+ "mapper)."
622
+
623
+ #: inc/view/Lang.php:1
624
+ msgid "No folder selected"
625
+ msgstr "Ingen mappe valgt"
626
+
627
+ #: inc/view/Lang.php:1
628
+ msgid "Select folder"
629
+ msgstr "Vælg mappe"
630
+
631
+ #: inc/view/Lang.php:1
632
+ msgid "Reload content"
633
+ msgstr "Genindlæs indhold"
634
+
635
+ #: inc/view/Lang.php:1
636
+ msgid "Subfolders"
637
+ msgstr "Undermapper"
638
+
639
+ #: inc/view/Lang.php:1
640
+ msgid "Please select a folder (media library) in the block settings."
641
+ msgstr "Vælg en mappe (mediebibliotek) i blokindstillingerne."
642
+
643
+ #: inc/view/Lang.php:1
644
+ msgid "New folders inherit this restriction"
645
+ msgstr "Nye mapper arver denne begrænsning"
646
+
647
+ #: inc/view/Lang.php:1
648
+ msgid "The current selected folder has some restrictions:"
649
+ msgstr "Den aktuelle valgte mappe har nogle begrænsninger:"
650
+
651
+ #: inc/view/Lang.php:1
652
+ msgid "You cannot change *parent* folder"
653
+ msgstr "Du kan ikke ændre mappen *forælder*"
654
+
655
+ #: inc/view/Lang.php:1
656
+ msgid "You cannot *rearrange* subfolders"
657
+ msgstr "Du kan ikke *omarrangere* undermapper"
658
+
659
+ #: inc/view/Lang.php:1
660
+ msgid "You cannot *create* subfolders"
661
+ msgstr "Du kan ikke *oprette* undermapper"
662
+
663
+ #: inc/view/Lang.php:1
664
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
665
+ msgstr ""
666
+
667
+ #: inc/view/Lang.php:1
668
+ msgid "You cannot *rename* the folder"
669
+ msgstr "Du kan ikke *omdøbe* mappen"
670
+
671
+ #: inc/view/Lang.php:1
672
+ msgid "You cannot *delete* the folder"
673
+ msgstr "Du kan ikke *slette* mappen"
674
+
675
+ #: inc/view/Lang.php:1
676
+ msgid "You cannot *move* files outside the folder"
677
+ msgstr "Du kan ikke *flytte* filer uden for mappen"
678
+
679
+ #: inc/view/Lang.php:1
680
+ msgid "Parent"
681
+ msgstr "Forælder"
682
+
683
+ #: inc/view/Lang.php:1
684
+ msgid "Before this node"
685
+ msgstr "Før denne node"
686
+
687
+ #: inc/view/Lang.php:1
688
+ msgid "If no next node is given, the element is placed at the end."
689
+ msgstr ""
690
+ "Hvis der ikke er givet nogen næste knude, placeres elementet for enden."
691
+
692
+ #: inc/view/Lang.php:1
693
+ msgid "The file is uploaded to the folder where you are currently in."
694
+ msgstr "Filen uploades til den mappe, hvor du befinder dig i øjeblikket."
695
+
696
+ #: inc/view/Lang.php:1
697
+ msgid "Are you sure?"
698
+ msgstr "Sikker?"
699
+
700
+ #: inc/view/Lang.php:1
701
+ msgid "Success"
702
+ msgstr "Sådan"
703
+
704
+ #: inc/view/Lang.php:1
705
+ msgid "Failed"
706
+ msgstr "Fejl"
707
+
708
+ #: inc/view/Lang.php:1
709
+ msgid "No entries found"
710
+ msgstr "Ingen poster fundet"
711
+
712
+ #: inc/view/Lang.php:1
713
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
714
+ msgstr ""
715
+ "Er du sikker på at slette *{name}*? Alle filer flyttes til Uorganiseret."
716
+
717
+ #: inc/view/Lang.php:1
718
+ msgid ""
719
+ "Are you sure to delete *{count} folders*? All files gets moved to "
720
+ "Unorganized."
721
+ msgstr ""
722
+ "Er du sikker på at slette *{count}* mapper? Alle filer flyttes til "
723
+ "Uorganiseret."
724
+
725
+ #: inc/view/Lang.php:1
726
+ msgid "Ok"
727
+ msgstr "Ok"
728
+
729
+ #: inc/view/Lang.php:1
730
+ msgid "Cancel"
731
+ msgstr "Fortryd"
732
+
733
+ #: inc/view/Lang.php:1
734
+ msgid "Save"
735
+ msgstr "Gem"
736
+
737
+ #: inc/view/Lang.php:1
738
+ msgid "Back"
739
+ msgstr "Tilbage"
740
+
741
+ #: inc/view/Lang.php:1
742
+ msgid "No folders found"
743
+ msgstr "Ingen mapper fundet"
744
+
745
+ #: inc/view/Lang.php:1
746
+ msgid ""
747
+ "No folders have been created yet. Just click on the button above to create "
748
+ "your first folder."
749
+ msgstr ""
750
+ "Der er endnu ikke oprettet nogen mapper. Bare klik på knappen ovenfor for at "
751
+ "oprette din første mappe."
752
+
753
+ #: inc/view/Lang.php:1
754
+ msgid "Folders"
755
+ msgstr "Mapper"
756
+
757
+ #: inc/view/Lang.php:1
758
+ msgid "No search results."
759
+ msgstr "Ingen søgeresultater."
760
+
761
+ #: inc/view/Lang.php:1
762
+ msgid "Renaming to *{name}*…"
763
+ msgstr ""
764
+
765
+ #: inc/view/Lang.php:1
766
+ msgid "Successfully renamed folder to *{name}*"
767
+ msgstr "Omdøbt mappe til *{name}*"
768
+
769
+ #: inc/view/Lang.php:1
770
+ msgid "Creating *{name}*…"
771
+ msgstr ""
772
+
773
+ #: inc/view/Lang.php:1
774
+ msgid "Successfully created *{name}*"
775
+ msgstr "*{name}* er oprettet"
776
+
777
+ #: inc/view/Lang.php:1
778
+ msgid "Deleting *{name}*…"
779
+ msgstr ""
780
+
781
+ #: inc/view/Lang.php:1
782
+ msgid "Successfully deleted *{name}*"
783
+ msgstr "*{name}* er slettet"
784
+
785
+ #: inc/view/Lang.php:1
786
+ msgid "Successfully deleted *{count} folders*"
787
+ msgstr "Slettede *{count}* mapper"
788
+
789
+ #: inc/view/Lang.php:1
790
+ msgid "Rearrange *{name}* placement manually"
791
+ msgstr "Omarrangér *{navn}* placering manuelt"
792
+
793
+ #: inc/view/Lang.php:1
794
+ msgid "Reordering the tree hierarchy…"
795
+ msgstr ""
796
+
797
+ #: inc/view/Lang.php:1
798
+ msgid "Successfully sorted the tree hierarchy"
799
+ msgstr "Træhierarkiet er sorteret"
800
+
801
+ #: inc/view/Lang.php:1
802
+ msgid "Reorder subfolders of *{name}*…"
803
+ msgstr ""
804
+
805
+ #: inc/view/Lang.php:1
806
+ msgid "{count} files remaining…"
807
+ msgstr ""
808
+
809
+ #: inc/view/Lang.php:1
810
+ msgid "Receiving data…"
811
+ msgstr ""
812
+
813
+ #: inc/view/Lang.php:1
814
+ msgid "Shortcut"
815
+ msgstr "Genvej"
816
+
817
+ #: inc/view/Lang.php:1
818
+ msgid ""
819
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
820
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
821
+ "do this in the original file (for example replace media file through a "
822
+ "plugin).\n"
823
+ "Note also that the fields in the shortcuts can be different to the original "
824
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
825
+ msgstr ""
826
+ "Dette er en genvej til en mediebiblioteksfil. Genveje behøver ikke nogen "
827
+ "fysisk lagring *(0 kB) *. Hvis du vil ændre selve filen, skal du gøre dette "
828
+ "i den originale fil (f.eks. Udskifte mediefil via et plugin).\n"
829
+ "Bemærk også, at felterne i genvejene kan være forskellige fra den originale "
830
+ "fil, f.eks. \"Titel\", \"Beskrivelse\" eller \"Billedtekst\"."
831
+
832
+ #: inc/view/Lang.php:1
833
+ msgid ""
834
+ "In the current view of uploads, filters are active. Please reset them and "
835
+ "refresh the view."
836
+ msgstr ""
837
+ "I den aktuelle visning af uploads er filtre aktive. Nulstil dem, og opdater "
838
+ "visningen."
839
+
840
+ #: inc/view/Lang.php:1
841
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
842
+ msgstr ""
843
+
844
+ #: inc/view/Lang.php:1
845
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
846
+ msgstr ""
847
+
848
+ #: inc/view/Lang.php:1
849
+ msgid "Order content by *{name}*…"
850
+ msgstr ""
851
+
852
+ #: inc/view/Lang.php:1
853
+ msgid "Order content by drag & drop"
854
+ msgstr "Sorter indhold ved at trække og slippe"
855
+
856
+ #: inc/view/Lang.php:1
857
+ msgid "Reset order"
858
+ msgstr "Reset sorteringen"
859
+
860
+ #: inc/view/Lang.php:1
861
+ msgid "Apply order once…"
862
+ msgstr ""
863
+
864
+ #: inc/view/Lang.php:1
865
+ msgid "Last"
866
+ msgstr "Sidste"
867
+
868
+ #: inc/view/Lang.php:1
869
+ msgid "Deactivate automatic ordering"
870
+ msgstr "Deaktiver automatisk sortering"
871
+
872
+ #: inc/view/Lang.php:1
873
+ msgid "Apply automatic order…"
874
+ msgstr ""
875
+
876
+ #: inc/view/Lang.php:1
877
+ msgid "Latest"
878
+ msgstr "Sidste"
879
+
880
+ #: inc/view/Lang.php:1
881
+ msgid "Reindex order"
882
+ msgstr "Reindekser sorteringen"
883
+
884
+ #: inc/view/Lang.php:1
885
+ msgid "Reset to last order"
886
+ msgstr "Nulstil til sidste sortering"
887
+
888
+ #: inc/view/Lang.php:1
889
+ msgid "All files"
890
+ msgstr "Alle filer"
891
+
892
+ #: inc/view/Lang.php:1
893
+ msgid "Move {count} files"
894
+ msgstr "Flyt {count} filer"
895
+
896
+ #: inc/view/Lang.php:1
897
+ msgid "Move one file"
898
+ msgstr "Flyt en fil"
899
+
900
+ #: inc/view/Lang.php:1
901
+ msgid "Copy {count} files"
902
+ msgstr "Kopiér {count} filer"
903
+
904
+ #: inc/view/Lang.php:1
905
+ msgid "Copy one file"
906
+ msgstr "Kopier en fil"
907
+
908
+ #: inc/view/Lang.php:1
909
+ msgid "Moving {count} files…"
910
+ msgstr ""
911
+
912
+ #: inc/view/Lang.php:1
913
+ msgid "Moving one file…"
914
+ msgstr ""
915
+
916
+ #: inc/view/Lang.php:1
917
+ msgid "Copying {count} files…"
918
+ msgstr ""
919
+
920
+ #: inc/view/Lang.php:1
921
+ msgid "Copying one file…"
922
+ msgstr ""
923
+
924
+ #: inc/view/Lang.php:1
925
+ msgid "Successfully moved {count} files"
926
+ msgstr "{Count} filer blev flyttet"
927
+
928
+ #: inc/view/Lang.php:1
929
+ msgid "Successfully moved one file"
930
+ msgstr "En fil er blevet flyttet"
931
+
932
+ #: inc/view/Lang.php:1
933
+ msgid "Successfully copied {count} files"
934
+ msgstr "{Count} filer blev kopieret"
935
+
936
+ #: inc/view/Lang.php:1
937
+ msgid "Successfully copied one file"
938
+ msgstr "En fil er blevet kopieret"
939
+
940
+ #: inc/view/Lang.php:1
941
+ msgid "Hold any key to create a shortcut"
942
+ msgstr "Hold en vilkårlig tast nede for at oprette en genvej"
943
+
944
+ #: inc/view/Lang.php:1
945
+ msgid "Release key to move file"
946
+ msgstr "Slip tasten for at flytte fil"
947
+
948
+ #: inc/view/Lang.php:1
949
+ msgid "Click this to create a new folder"
950
+ msgstr "Klik her for at oprette en ny mappe"
951
+
952
+ #: inc/view/Lang.php:1
953
+ msgid ""
954
+ "A folder can contain any file type and collection, but not galleries. If you "
955
+ "want to create a subfolder, select a folder and click this button."
956
+ msgstr ""
957
+ "En mappe kan indeholde enhver filtype og samling, men ikke gallerier. Hvis "
958
+ "du vil oprette en undermappe, skal du vælge en mappe og klikke på denne knap."
959
+
960
+ #: inc/view/Lang.php:1
961
+ msgid "Click this to create a new collection"
962
+ msgstr "Klik her for at oprette en ny samling"
963
+
964
+ #: inc/view/Lang.php:1
965
+ msgid ""
966
+ "A collection cannot contain files. However, you can create additional "
967
+ "collections and *galleries* there. This gallery is only a *gallery data "
968
+ "folder*, i.e. they are not automatically visible on the website.\n"
969
+ "\n"
970
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
971
+ "on your pages/postings."
972
+ msgstr ""
973
+ "En samling kan ikke indeholde filer. Du kan dog oprette flere samlinger og * "
974
+ "gallerier * der. Dette galleri er kun en *galleridatamappe *, dvs. de er "
975
+ "ikke automatisk synlige på webstedet.\n"
976
+ "\n"
977
+ "Du kan oprette et * visuelt galleri * ved at bruge en genvejskode i Visual "
978
+ "Editor på dine sider/opslag."
979
+
980
+ #: inc/view/Lang.php:1
981
+ msgid "Click this to create a *new gallery data folder*"
982
+ msgstr "Klik her for at oprette en *ny galleridatamappe*"
983
+
984
+ #: inc/view/Lang.php:1
985
+ msgid ""
986
+ "A *gallery data folder* can only contain images. It is easier for you to "
987
+ "distinguish where your visual galleries are located.\n"
988
+ "\n"
989
+ "You can also order the images into *a custom image order* per drag&drop."
990
+ msgstr ""
991
+ "En *galleridatamappe* kan kun indeholde billeder. Det er lettere for dig at "
992
+ "skelne mellem dine visuelle gallerier.\n"
993
+ "\n"
994
+ "Du kan også bestille billederne i *en brugerdefineret billedrækkefølge* med "
995
+ "træk og slip."
996
+
997
+ #: inc/view/Lang.php:1
998
+ msgid "Settings"
999
+ msgstr "Indstillinger"
1000
+
1001
+ #: inc/view/Lang.php:1
1002
+ msgid "General settings for the current logged in user."
1003
+ msgstr "Generelle indstillinger for den aktuelle bruger."
1004
+
1005
+ #: inc/view/Lang.php:1
1006
+ msgid "Permissions"
1007
+ msgstr "Tiladelser"
1008
+
1009
+ #: inc/view/Lang.php:1
1010
+ msgid "Reorder files in this folder"
1011
+ msgstr "Omarranger filer i denne mappe"
1012
+
1013
+ #: inc/view/Lang.php:1
1014
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1015
+ msgstr ""
1016
+
1017
+ #: inc/view/Lang.php:1
1018
+ msgid "Refresh"
1019
+ msgstr "Genindlæs"
1020
+
1021
+ #: inc/view/Lang.php:1
1022
+ msgid "Refreshes the current folder view."
1023
+ msgstr "Genindlæs den aktuelle mappevisning."
1024
+
1025
+ #: inc/view/Lang.php:1
1026
+ msgid "Rename"
1027
+ msgstr "Omdøb"
1028
+
1029
+ #: inc/view/Lang.php:1
1030
+ msgid "Rename the current selected folder."
1031
+ msgstr "Omdøb den valgte mappe."
1032
+
1033
+ #: inc/view/Lang.php:1
1034
+ msgid "Delete"
1035
+ msgstr "Slet"
1036
+
1037
+ #: inc/view/Lang.php:1
1038
+ msgid "Delete the current selected folder."
1039
+ msgstr "Slet den valgte mappe."
1040
+
1041
+ #: inc/view/Lang.php:1
1042
+ msgid "Delete the current selected folders."
1043
+ msgstr "Slet de valgte mapper."
1044
+
1045
+ #: inc/view/Lang.php:1
1046
+ msgid "Rearrange"
1047
+ msgstr "Omarranger"
1048
+
1049
+ #: inc/view/Lang.php:1
1050
+ msgid "Change the hierarchical order of the folders."
1051
+ msgstr "Skift mappernes hierarkiske rækkefølge."
1052
+
1053
+ #: inc/view/Lang.php:1
1054
+ msgid "Folder details"
1055
+ msgstr "Mappedetaljer"
1056
+
1057
+ #: inc/view/Lang.php:1
1058
+ msgid "Select a folder and view more details about it."
1059
+ msgstr "Vælg en mappe, og se flere detaljer om den."
1060
+
1061
+ #: inc/view/Lang.php:1
1062
+ msgid "Product license not yet activated."
1063
+ msgstr "Produktlicens er endnu ikke aktiveret."
1064
+
1065
+ #: inc/view/Lang.php:1
1066
+ msgid "Enter license"
1067
+ msgstr "Indtast licens"
1068
+
1069
+ #: inc/view/Lang.php:1
1070
+ msgid "Dismiss notice"
1071
+ msgstr "Afvis meddelelse"
1072
+
1073
+ #: inc/view/Lang.php:1
1074
+ msgid ""
1075
+ "It looks like you have already used another plugin for folders in the media "
1076
+ "library."
1077
+ msgstr ""
1078
+ "Det ser ud til, at du allerede har brugt et andet plugin til mapper i "
1079
+ "mediebiblioteket."
1080
+
1081
+ #: inc/view/Lang.php:1
1082
+ msgid "Start importing"
1083
+ msgstr "Start importen"
1084
+
1085
+ #: inc/view/Lang.php:1
1086
+ msgid "Dismiss"
1087
+ msgstr "Afvis"
1088
+
1089
+ #: inc/view/Lang.php:1
1090
+ msgid ""
1091
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1092
+ "do not change when you move the file. Learn more about <a href=\"https://"
1093
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1094
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1095
+ "files to physical folders.</a>"
1096
+ msgstr ""
1097
+ "Real Media Library opretter en virtuel mappestruktur. URL'erne til uploads "
1098
+ "ændres ikke, når du flytter filen. Lær mere om <a href=\"https://devowl.io/"
1099
+ "knowledge-base/how-can-i-physically-reflect-the-virtual-folder-structure-to-"
1100
+ "my-file-system/\" target =\" _blank\"> hvordan man automatisk flytter filer "
1101
+ "til fysiske mapper. </a>"
1102
+
1103
+ #: inc/view/Lang.php:1
1104
+ msgid ""
1105
+ "You will be redirected to the external website of PRO version. Please "
1106
+ "confirm to continue!"
1107
+ msgstr ""
1108
+ "Du bliver omdirigeret til det eksterne websted for PRO -versionen. Bekræft "
1109
+ "venligst for at fortsætte!"
1110
+
1111
+ #: inc/view/Lang.php:1
1112
+ msgid "PRO Feature"
1113
+ msgstr "PRO funktioner"
1114
+
1115
+ #: inc/view/Lang.php:1
1116
+ msgid "Hide for 20 days"
1117
+ msgstr "Vis ikke i 20 dage"
1118
+
1119
+ #: inc/view/Lang.php:1
1120
+ msgid "Thanks for using the free version of Real Media Library."
1121
+ msgstr "Tak fordi du brugte den gratis version af Real Media Library."
1122
+
1123
+ #: inc/view/Lang.php:1
1124
+ msgid "Get PRO!"
1125
+ msgstr "Få fat i PRO!"
1126
+
1127
+ #: inc/view/Lang.php:1
1128
+ msgid "I want to learn more!"
1129
+ msgstr "Jeg vil gerne lære mere!"
1130
+
1131
+ #: inc/view/Lang.php:1
1132
+ msgid "No, not interested…"
1133
+ msgstr ""
1134
+
1135
+ #: inc/view/Lang.php:1
1136
+ msgid "You like collections?"
1137
+ msgstr "Kan du lide samlinger?"
1138
+
1139
+ #: inc/view/Lang.php:1
1140
+ msgid ""
1141
+ "Get more organized with different types of folders: Collections and "
1142
+ "galleries help you to easily recognize where your image galleries are "
1143
+ "located."
1144
+ msgstr ""
1145
+ "Bliv mere organiseret med forskellige typer mapper: Samlinger og gallerier "
1146
+ "hjælper dig med let at genkende, hvor dine billedgallerier er placeret."
1147
+
1148
+ #: inc/view/Lang.php:1
1149
+ msgid "Custom content order?"
1150
+ msgstr "Tilpasset bestilling af indhold?"
1151
+
1152
+ #: inc/view/Lang.php:1
1153
+ msgid ""
1154
+ "Get your folder contents in order and arrange your files according to a "
1155
+ "criterion (e.g. name descending) or by drag & drop."
1156
+ msgstr ""
1157
+ "Få ordnet mappens indhold og ordne dine filer efter et kriterium (f.eks. "
1158
+ "Navn faldende) eller ved at trække og slippe."
1159
+
1160
+ #: inc/view/Lang.php:1
1161
+ msgid "Full order control?"
1162
+ msgstr "Fuld ordrekontrol?"
1163
+
1164
+ #: inc/view/Lang.php:1
1165
+ msgid ""
1166
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1167
+ "name descending) or by drag & drop."
1168
+ msgstr ""
1169
+ "Organiser knudepunkterne i dit mappetræ efter et kriterium (f.eks. Faldende "
1170
+ "navn) eller ved at trække og slippe."
1171
+
1172
+ #: inc/view/Lang.php:1
1173
+ msgid "Want to create subfolders?"
1174
+ msgstr "Vil du oprette undermapper?"
1175
+
1176
+ #: inc/view/Lang.php:1
1177
+ msgid ""
1178
+ "Subfolders offer you the possibility to bring more structure into your media "
1179
+ "library. They help you to keep the overview, even if you really have many "
1180
+ "files in your media library."
1181
+ msgstr ""
1182
+ "Undermapper giver dig mulighed for at bringe mere struktur ind i dit "
1183
+ "mediebibliotek. De hjælper dig med at bevare overblikket, selvom du virkelig "
1184
+ "har mange filer i dit mediebibliotek."
1185
+
1186
+ #: inc/view/Lang.php:1
1187
+ msgid "Want to switch between folders more comfortably?"
1188
+ msgstr "Vil du skifte mellem mapper på en mere behagelig måde?"
1189
+
1190
+ #: inc/view/Lang.php:1
1191
+ msgid ""
1192
+ "Let the complete folder tree as in your media library also be displayed in "
1193
+ "this dialog instead of searching each time in the dropdown. It is simply "
1194
+ "more comfortable!"
1195
+ msgstr ""
1196
+ "Lad hele mappetræet som i dit mediebibliotek også vises i denne dialog i "
1197
+ "stedet for at søge hver gang i rullemenuen. Det er simpelthen mere "
1198
+ "behageligt!"
1199
+
1200
+ #: inc/view/Lang.php:1
1201
+ msgid "Want to upload entire folders?"
1202
+ msgstr "Vil du uploade hele mapper?"
1203
+
1204
+ #: inc/view/Lang.php:1
1205
+ msgid ""
1206
+ "With Real Media Library you can upload entire folders using drag and drop. "
1207
+ "All folders, subfolders and files will be uploaded and displayed in your "
1208
+ "media library in the same structure. Get PRO to upload folders!"
1209
+ msgstr ""
1210
+ "With Real Media Library you can upload entire folders using drag and drop. "
1211
+ "All folders, subfolders and files will be uploaded and displayed in your "
1212
+ "media library in the same structure. Get PRO to upload folders!"
1213
+
1214
+ #: inc/view/Options.php:1
1215
+ msgid "RealMediaLibrary:General"
1216
+ msgstr "RealMediaLibrary: Generelt"
1217
+
1218
+ #: inc/view/Options.php:1
1219
+ msgid "Load RML functionality in frontend"
1220
+ msgstr "Indlæs RML-funktionalitet i frontend"
1221
+
1222
+ #: inc/view/Options.php:1
1223
+ msgid "RealMediaLibrary:Reset"
1224
+ msgstr "RealMediaLibrary:Nulstil"
1225
+
1226
+ #: inc/view/Options.php:1
1227
+ msgid "Reset the order of all galleries"
1228
+ msgstr "Nulstil rækkefølgen af alle gallerier"
1229
+
1230
+ #: inc/view/Options.php:1
1231
+ msgid "Wipe all settings (folders, attachment relations)"
1232
+ msgstr "Nulstil rækkefølgen af alle gallerier"
1233
+
1234
+ #: inc/view/Options.php:1
1235
+ msgid "Reset folder count cache"
1236
+ msgstr "Nulstil mappetæller cachen"
1237
+
1238
+ #: inc/view/Options.php:1
1239
+ msgid "Reset names, slugs and absolute pathes"
1240
+ msgstr "Nulstil navne, genveje og absolutte stier"
1241
+
1242
+ #: inc/view/Options.php:1
1243
+ msgid "Wipe attachment relations"
1244
+ msgstr "Fjern vedhæftningsrelationer"
1245
+
1246
+ #: inc/view/Options.php:1
1247
+ msgid "Wipe all"
1248
+ msgstr "Fjern alt"
1249
+
1250
+ #: inc/view/Options.php:1
1251
+ msgid "Reset count"
1252
+ msgstr "Nulstil tælling"
1253
+
1254
+ #: inc/view/Options.php:1
1255
+ msgid "Reset"
1256
+ msgstr "Nulstil"
1257
+
1258
+ #: inc/view/Options.php:1
1259
+ msgid ""
1260
+ "Activate this option if you are using a page builder like Divi Page Builder, "
1261
+ "WPBakery Page Builder or Elementor."
1262
+ msgstr ""
1263
+ "Aktiver denne mulighed, hvis du bruger en hjemmesidebygger som Divi Page "
1264
+ "Builder, WPBakery Page Builder eller Elementor."
1265
+
1266
+ #: inc/view/Options.php:1
1267
+ msgid "You can also reset an single folder in its folder details."
1268
+ msgstr "Du kan også nulstille en enkelt mappe i dens mappedetaljer."
1269
+
1270
+ #: inc/view/View.php:1
1271
+ msgid "All"
1272
+ msgstr "Alt"
1273
+
1274
+ #: inc/view/View.php:1
1275
+ msgid "Unorganized pictures"
1276
+ msgstr "Uorganiserede billeder"
languages/real-media-library-de_AT.mo ADDED
Binary file
languages/real-media-library-de_AT.po ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
4
+ "POT-Creation-Date: n/a\n"
5
+ "PO-Revision-Date: 2021-10-12 08:40+0000\n"
6
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
7
+ "Language-Team: German <https://translate.devowl.io/projects/wordpress-real-"
8
+ "media-library-backend-php/develop/de/>\n"
9
+ "Language: de_AT\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: Weblate 4.8\n"
15
+
16
+ #. Plugin Name of the plugin
17
+ msgid "Real Media Library"
18
+ msgstr "Real Media Library"
19
+
20
+ #. Plugin URI of the plugin
21
+ msgid "https://devowl.io/wordpress-real-media-library/"
22
+ msgstr "https://devowl.io/de/wordpress-real-media-library/"
23
+
24
+ #. Description of the plugin
25
+ msgid ""
26
+ "Organize uploaded media in folders, collections and galleries: A file "
27
+ "manager for WordPress. Media management made easy!"
28
+ msgstr ""
29
+ "Organisiere hochgeladene Medien in Ordnern, Sammlungen und Galerien: Ein "
30
+ "Dateimanager für WordPress. Medienmanagement leicht gemacht!"
31
+
32
+ #. Author of the plugin
33
+ msgid "devowl.io"
34
+ msgstr "devowl.io"
35
+
36
+ #. Author URI of the plugin
37
+ msgid "https://devowl.io"
38
+ msgstr "https://devowl.io/de/"
39
+
40
+ #: inc/AdInitiator.php:1
41
+ msgid "Complete file and folder manager"
42
+ msgstr "Vollständiger Datei- und Ordnermanager"
43
+
44
+ #: inc/AdInitiator.php:1
45
+ msgid ""
46
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
47
+ "media management. You can use this plugin to organize the thousands of "
48
+ "images, audio, video and PDF files in your media library into folders. "
49
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
50
+ "WordPress."
51
+ msgstr ""
52
+ "Real Media Library ist ein WordPress-Plugin, das dir eine erweiterte "
53
+ "Medienverwaltung ermöglicht. Mit diesem Plugin kannst du die tausende "
54
+ "Bilder, Audio-, Video- und PDF-Dateien in Ihrer Medienbibliothek in Ordnern "
55
+ "organisieren. Im Grunde ist es ein Dateimanager wie Windows Explorer oder "
56
+ "Mac Finder, aber für WordPress."
57
+
58
+ #: inc/AdInitiator.php:1
59
+ msgid "Filter in insert media dialog"
60
+ msgstr "Filter im Dialog “Medien einfügen”"
61
+
62
+ #: inc/AdInitiator.php:1
63
+ msgid ""
64
+ "No matter where you are, the folder structure of Real Media Library is "
65
+ "always where you can select files. For example in the dialog for selecting a "
66
+ "\"Featured Image\"."
67
+ msgstr ""
68
+ "Egal, wo du dich befindest, die Ordnerstruktur von Real Media Library ist "
69
+ "immer dort, wo du Dateien auswählen kannst. Zum Beispiel im Dialog zur "
70
+ "Auswahl eines “Beitragsbild”."
71
+
72
+ #: inc/AdInitiator.php:1
73
+ msgid ""
74
+ "In the Lite version you can only select the folder by a simple dropdown."
75
+ msgstr ""
76
+ "In der Lite Version kannst du den Ordner nur über ein einfaches Dropdown "
77
+ "auswählen."
78
+
79
+ #: inc/AdInitiator.php:1
80
+ msgid "Custom image order"
81
+ msgstr "Benutzerdefinierte Bildreihenfolge"
82
+
83
+ #: inc/AdInitiator.php:1
84
+ msgid ""
85
+ "Organizing your media files is really easy with the Real Media Library "
86
+ "plugin. You can arrange the order of your files yourself by dragging and "
87
+ "dropping. This allows you to move important files to the top for faster "
88
+ "access."
89
+ msgstr ""
90
+ "Die Organisation deiner Mediendateien ist mit dem Real Media Library Plugin "
91
+ "wirklich einfach. Du kannst die Reihenfolge deiner Dateien selbst durch Drag "
92
+ "& Drop festlegen. Dadurch kannst du wichtige Dateien für einen schnelleren "
93
+ "Zugriff an den Anfang verschieben."
94
+
95
+ #: inc/AdInitiator.php:1
96
+ msgid "Get your PRO license now!"
97
+ msgstr "Holen dir jetzt deine PRO-Lizenz!"
98
+
99
+ #: inc/api/attachment.php:1
100
+ msgid "The given folder was not found."
101
+ msgstr "Der angegebene Ordner wurde nicht gefunden."
102
+
103
+ #: inc/Assets.php:1
104
+ msgid "Complementary Plugins"
105
+ msgstr "Erweiterungen"
106
+
107
+ #: inc/Assets.php:1
108
+ msgid ""
109
+ "\n"
110
+ "\n"
111
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
112
+ "deleted.\n"
113
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
114
+ "deleted, too."
115
+ msgstr ""
116
+ "\n"
117
+ "\n"
118
+ "Beachte: Wenn du eine Verknüpfung löscht, wird die Originaldatei nicht "
119
+ "gelöscht.\n"
120
+ "Wenn du eine normale Datei löscht, werden alle dazugehörigen Verknüpfungen "
121
+ "auch gelöscht."
122
+
123
+ #: inc/attachment/CustomField.php:1
124
+ msgid ""
125
+ "If you move this shortcut, the location of the source/main file is not "
126
+ "changed."
127
+ msgstr ""
128
+ "Wenn du diese Verknüpfung verschiebst, wird der Ordner der Originaldatei "
129
+ "nicht verändert."
130
+
131
+ #: inc/attachment/CustomField.php:1
132
+ msgid ""
133
+ "If you move this attachment, the folder location of the associated shortcuts "
134
+ "are not changed."
135
+ msgstr ""
136
+ "Wenn du diese Datei verschiebst, werden die Ordner der dazugehörigen "
137
+ "Verknüpfungen nicht verändert."
138
+
139
+ #: inc/attachment/CustomField.php:1
140
+ msgid "Move to another folder"
141
+ msgstr "Verschiebe Datei in anderen Ordner"
142
+
143
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
144
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
145
+ msgid "Folder"
146
+ msgstr "Ordner"
147
+
148
+ #: inc/attachment/CustomField.php:1
149
+ msgid "Shortcut infos"
150
+ msgstr "Verknüpfung"
151
+
152
+ #: inc/attachment/CustomField.php:1
153
+ msgid ""
154
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
155
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
156
+ "itself, you must do this in the original file (for example replace media "
157
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
158
+ "be different to the original file, for example \"Title\", \"Description\" or "
159
+ "\"Caption\"."
160
+ msgstr ""
161
+ "Dies ist eine Verknüpfung. Verknüpfungen brauchen keinen physikalischen "
162
+ "Speicherplatz <strong>(0 kB)</strong>. Wenn du die Datei selbst ändern "
163
+ "möchten, verändere die Originaldatei (bspw. Ersetzen der Datei durch ein "
164
+ "Plugin).<br/>Beachten auch, dass die Felder in der Verknüpfung "
165
+ "unterschiedlich zur Originaldatei sein können, zum Beispiel “Titel”, "
166
+ "“Beschreibung”."
167
+
168
+ #. translators:
169
+ #: inc/attachment/CustomField.php:1
170
+ msgid "For this file is %d shortcut available in the following folder:"
171
+ msgid_plural ""
172
+ "For this file are %d shortcuts available in the following folders:"
173
+ msgstr[0] "Für diese Datei gibt es eine Verknüpfung im folgenden Ordner:"
174
+ msgstr[1] ""
175
+ "Für diese Datei sind %s Verknüpfungen verfügbar in folgenden Ordnern:"
176
+
177
+ #: inc/attachment/CustomField.php:1
178
+ msgid ""
179
+ "This file has no associated shortcuts. You can create shortcuts by moving "
180
+ "files per mouse and hold any key."
181
+ msgstr ""
182
+ "Die Datei hat keine zugehörige Verknüpfung. Du kannst Verknüpfung erstellen, "
183
+ "indem du per Drag&Drop die Datei bewegst und eine beliebige Taste hältst."
184
+
185
+ #: inc/attachment/Permissions.php:1
186
+ msgid "You are not allowed to insert files here."
187
+ msgstr "Du hast keine Berechtigung, hier neue Dateien hinzuzufügen."
188
+
189
+ #: inc/attachment/Permissions.php:1
190
+ msgid "You are not allowed to move the file."
191
+ msgstr "Du hast keine Berechtigung, die Datei zu verschieben."
192
+
193
+ #: inc/attachment/Permissions.php:1
194
+ msgid "You are not allowed to create a subfolder here."
195
+ msgstr "Du hast keine Berechtigung hier Unterordner zu erstellen."
196
+
197
+ #: inc/attachment/Permissions.php:1
198
+ msgid "You are not allowed to delete this folder."
199
+ msgstr "Du hast keine Berechtigung den Ordner zu löschen."
200
+
201
+ #: inc/attachment/Permissions.php:1
202
+ msgid "You are not allowed to rename this folder."
203
+ msgstr "Du hast keine Berechtigung den Ordner umzubenennen."
204
+
205
+ #: inc/attachment/Upload.php:1
206
+ msgid "Select destination folder"
207
+ msgstr "Zielordner auswählen"
208
+
209
+ #: inc/attachment/Upload.php:1
210
+ msgid ""
211
+ "You can simply upload files directly to a folder. Select a folder and upload "
212
+ "files."
213
+ msgstr "Du kannst Dateien direkt in einen Ordner hochladen."
214
+
215
+ #: inc/attachment/Upload.php:1
216
+ msgid "upload to folder"
217
+ msgstr "in den Ordner hochladen"
218
+
219
+ #: inc/comp/ExImport.php:1
220
+ msgid "RealMediaLibrary:Import / Export"
221
+ msgstr "RealMediaLibrary:Import / Export"
222
+
223
+ #: inc/comp/ExImport.php:1
224
+ msgid "Import from other plugins"
225
+ msgstr "Von anderen Plugins importieren"
226
+
227
+ #: inc/comp/ExImport.php:1
228
+ msgid "Export / Import Real Media Library folders"
229
+ msgstr "Export / Image Real Media Library Ordner"
230
+
231
+ #: inc/comp/ExImport.php:1
232
+ msgid "Export"
233
+ msgstr "Exportieren"
234
+
235
+ #: inc/comp/ExImport.php:1
236
+ msgid "Import"
237
+ msgstr "Importieren"
238
+
239
+ #: inc/comp/ExImport.php:1
240
+ msgid ""
241
+ "All available folders will be exported. The current structure is not lost "
242
+ "during import - but check that there are no duplicate names in the import "
243
+ "data, as these are not checked."
244
+ msgstr ""
245
+ "Exportiert werden alle verfügbaren Ordner. Beim Import geht die aktuelle "
246
+ "Struktur nicht verloren - prüfe aber, dass bei den Import-Daten keine "
247
+ "doppelten Namen vorkommen, da diese nicht geprüft werden."
248
+
249
+ #: inc/comp/ExImport.php:1
250
+ msgid "Exported data:"
251
+ msgstr "Exportieren:"
252
+
253
+ #: inc/comp/ExImport.php:1
254
+ msgid "Import data:"
255
+ msgstr "Importieren:"
256
+
257
+ #: inc/comp/ExImport.php:1
258
+ msgid "Importing data is only available in PRO version."
259
+ msgstr "Das Importieren von Daten ist nur in der PRO-Version verfügbar."
260
+
261
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
262
+ #: inc/view/Lang.php:1
263
+ msgid "Learn more about PRO"
264
+ msgstr "Erfahre mehr über PRO"
265
+
266
+ #: inc/comp/ExImport.php:1
267
+ msgid "Imports categories and post relations."
268
+ msgstr "Importiert Kategorien und Beziehungen."
269
+
270
+ #: inc/comp/ExImport.php:1
271
+ msgid "Nothing to import."
272
+ msgstr "Nichts zu importieren."
273
+
274
+ #: inc/comp/ExImport.php:1
275
+ msgid ""
276
+ "Importing categories from another plugin is only available in PRO version."
277
+ msgstr ""
278
+ "Der Import von Kategorien aus einem anderen Plugin ist nur in der PRO-"
279
+ "Version verfügbar."
280
+
281
+ #: inc/comp/ExportMediaLibrary.php:1
282
+ msgid "No valid folder."
283
+ msgstr "Kein gültiger Ordner."
284
+
285
+ #: inc/comp/ExportMediaLibrary.php:1
286
+ msgid "No valid type."
287
+ msgstr "Kein gültiger Typ."
288
+
289
+ #: inc/comp/PolyLang.php:1
290
+ msgid "PolyLang: Automatically move translations"
291
+ msgstr "PolyLang: Automatisch Übersetzungen verschieben"
292
+
293
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
294
+ msgid ""
295
+ "If you move a file, the corresponding translated file will also be moved."
296
+ msgstr ""
297
+ "Wenn du eine Datei verschiebst, wird auch die dazugehörigen übersetzte Datei "
298
+ "verschoben."
299
+
300
+ #: inc/comp/WPML.php:1
301
+ msgid "WPML: Automatically move translations"
302
+ msgstr "WPML: Automatisch übersetzte Bilder in Ordner verschieben"
303
+
304
+ #. translators:
305
+ #: inc/exception/FolderAlreadyExistsException.php:1
306
+ msgid "'%s' already exists in this folder."
307
+ msgstr "'%s' existiert bereits in diesem Ordner."
308
+
309
+ #. translators:
310
+ #: inc/exception/OnlyInProVersionException.php:1
311
+ msgid "This functionality is not available in the free version (%s)."
312
+ msgstr ""
313
+ "Diese Funktionalität ist in der kostenlosen Version (%s) nicht verfügbar."
314
+
315
+ #: inc/folder/Creatable.php:1
316
+ msgid "You need to provide a set of files."
317
+ msgstr "Du musst mehrere Dateien bereitstellen."
318
+
319
+ #: inc/folder/Creatable.php:1
320
+ msgid "The folder could not be created in the database."
321
+ msgstr "Der Ordner konnte nicht in die Datenbank geschrieben werden."
322
+
323
+ #: inc/folder/Creatable.php:1
324
+ msgid "The folder could not be created because it already exists."
325
+ msgstr "Der Ordner konnte nicht erstellt werden, da er bereits existiert."
326
+
327
+ #: inc/folder/Creatable.php:1
328
+ msgid ""
329
+ "A folder can contain every type of file or a collection, but not gallery."
330
+ msgstr ""
331
+ "Ein Ordner kann alle Typen von Dateien enthalten oder eine Kollektion, aber "
332
+ "keine Galerie."
333
+
334
+ #. translators:
335
+ #: inc/folder/Creatable.php:1
336
+ msgid "'%s' is not a valid folder name."
337
+ msgstr "'%s' ist kein gültiger Ordnername."
338
+
339
+ #: inc/folder/Creatable.php:1
340
+ msgid "Order by name ascending"
341
+ msgstr "Sortiere nach Name aufsteigend"
342
+
343
+ #: inc/folder/Creatable.php:1
344
+ msgid "Order by name descending"
345
+ msgstr "Sortiere nach Name absteigend"
346
+
347
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
348
+ msgid "Order by ID ascending"
349
+ msgstr "Sortiere nach ID aufsteigend"
350
+
351
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
352
+ msgid "Order by ID descending"
353
+ msgstr "Sortiere nach ID absteigend"
354
+
355
+ #: inc/folder/CRUD.php:1
356
+ msgid "The given folder does not exist or you cannot rename this folder."
357
+ msgstr ""
358
+ "Der Ordner kann nicht gefunden werden oder du kannst diesen Ordner nicht "
359
+ "umbenennen."
360
+
361
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
362
+ msgid "The folder you try to delete has subfolders."
363
+ msgstr "Den Ordner, den du löschen möchtest, enthält Unterordner."
364
+
365
+ #: inc/folder/CRUD.php:1
366
+ msgid "The given folder does not exist."
367
+ msgstr "Der angegebene Ordner existiert nicht."
368
+
369
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
370
+ msgid "Unorganized"
371
+ msgstr "Unorganisiert"
372
+
373
+ #: inc/folder/Root.php:1
374
+ msgid ""
375
+ "Unorganized is the same as a root folder. Here you can find all files which "
376
+ "are not assigned to a folder."
377
+ msgstr ""
378
+ "Unorganisiert ist der Stamm-Ordner. Alle nicht zugewiesenen Dateien können "
379
+ "hier aufgefunden werden."
380
+
381
+ #: inc/metadata/CoverImage.php:1
382
+ msgid ""
383
+ "This option is disabled on this page. Please navigate to the media library."
384
+ msgstr ""
385
+ "Diese Option ist auf dieser Seite deaktiviert. Navigiere bitte zur "
386
+ "Medienbibliothek."
387
+
388
+ #: inc/metadata/CoverImage.php:1
389
+ msgid "Cover image"
390
+ msgstr "Vorschaubild"
391
+
392
+ #: inc/metadata/Description.php:1
393
+ msgid "Description"
394
+ msgstr "Beschreibung"
395
+
396
+ #: inc/metadata/Meta.php:1
397
+ msgid "Path"
398
+ msgstr "Pfad"
399
+
400
+ #: inc/metadata/Meta.php:1
401
+ msgid "Folder type"
402
+ msgstr "Ordnertyp"
403
+
404
+ #: inc/metadata/Meta.php:1
405
+ msgid "General"
406
+ msgstr "Allgemein"
407
+
408
+ #: inc/order/Sortable.php:1
409
+ msgid "Order by date ascending"
410
+ msgstr "Sortiere nach Datum aufsteigend"
411
+
412
+ #: inc/order/Sortable.php:1
413
+ msgid "Order by date descending"
414
+ msgstr "Sortiere nach Datum absteigend"
415
+
416
+ #: inc/order/Sortable.php:1
417
+ msgid "Order by title ascending"
418
+ msgstr "Sortiere nach Titel aufsteigend"
419
+
420
+ #: inc/order/Sortable.php:1
421
+ msgid "Order by title descending"
422
+ msgstr "Sortiere nach Titel absteigend"
423
+
424
+ #: inc/order/Sortable.php:1
425
+ msgid "Order by filename ascending"
426
+ msgstr "Sortiere nach Dateiname aufsteigend"
427
+
428
+ #: inc/order/Sortable.php:1
429
+ msgid "Order by filename descending"
430
+ msgstr "Sortiere nach Dateiname absteigend"
431
+
432
+ #: inc/order/Sortable.php:1
433
+ msgid "Natural order by filename ascending"
434
+ msgstr "Natürliche Ordnung nach Dateinamen aufsteigend"
435
+
436
+ #: inc/order/Sortable.php:1
437
+ msgid "Natural order by filename descending"
438
+ msgstr "Natürliche Ordnung nach Dateinamen absteigend"
439
+
440
+ #: inc/overrides/lite/folder/Creatable.php:1
441
+ #: inc/overrides/pro/folder/Creatable.php:1
442
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
443
+ msgid "Something went wrong."
444
+ msgstr "Etwas ist schiefgelaufen."
445
+
446
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
447
+ msgid "Folder not found."
448
+ msgstr "Ordner nicht gefunden."
449
+
450
+ #: inc/overrides/pro/Core.php:1
451
+ msgid ""
452
+ "<strong>You have not yet entered the license key</strong>. To receive "
453
+ "automatic updates, please enter the key in \"Enter license\"."
454
+ msgstr ""
455
+ "<strong>Der Lizenzschlüssel wurde noch nicht eingegeben</strong>. Um "
456
+ "automatische Updates zu erhalten klicke auf \"Enter license\"."
457
+
458
+ #: inc/overrides/pro/folder/Collection.php:1
459
+ msgid "A collection cannot contain files."
460
+ msgstr "Eine Kollektion kann keine Dateien enthalten."
461
+
462
+ #: inc/overrides/pro/folder/Collection.php:1
463
+ msgid "Collection"
464
+ msgstr "Kollektion"
465
+
466
+ #: inc/overrides/pro/folder/Collection.php:1
467
+ msgid ""
468
+ "A collection cannot contain files. But you can create other collections and "
469
+ "<strong> galleries</strong> there."
470
+ msgstr ""
471
+ "Eine Kollektion kann keine Dateien enthalten. Aber es können dort neue "
472
+ "Kollektionen und <strong>Galerien</strong> angelegt werden."
473
+
474
+ #. translators:
475
+ #: inc/overrides/pro/folder/Creatable.php:1
476
+ msgid "The parent %d does not exist."
477
+ msgstr "Das übergeordnete Ordner %d existiert nicht."
478
+
479
+ #: inc/overrides/pro/folder/Creatable.php:1
480
+ msgid "The given parent does not exist to set the parent for this folder."
481
+ msgstr "Der übergeordnete Ordner existiert nicht."
482
+
483
+ #: inc/overrides/pro/folder/Creatable.php:1
484
+ msgid "You are not allowed to change the parent for this folder."
485
+ msgstr ""
486
+ "Du hast keine Berechtigung den übergeordneten Ordner für diesen Ordner zu "
487
+ "ändern."
488
+
489
+ #: inc/overrides/pro/folder/Creatable.php:1
490
+ msgid "The given parent does not allow the folder type."
491
+ msgstr "Der übergeordnete Ordner erlaubt diesen Ordner-Typ nicht."
492
+
493
+ #: inc/overrides/pro/folder/Gallery.php:1
494
+ msgid "You can only move images to a gallery."
495
+ msgstr "Du kannst nur Bilder zu einer Galerie hinzufügen."
496
+
497
+ #: inc/overrides/pro/folder/Gallery.php:1
498
+ msgid "Gallery"
499
+ msgstr "Galerie"
500
+
501
+ #: inc/overrides/pro/folder/Gallery.php:1
502
+ msgid ""
503
+ "A gallery can only contain images. To view a gallery, go to a post and look "
504
+ "at the buttons of the visual editor.."
505
+ msgstr ""
506
+ "Eine Galerie kann nur Bilder enthalten. Um eine Galerie in einem Beitrag "
507
+ "anzuzeigen, werfe einen Blick auf den visuellen Editor."
508
+
509
+ #: inc/overrides/pro/order/Sortable.php:1
510
+ msgid "The given folder does not allow to reorder the files."
511
+ msgstr ""
512
+ "Der angegebene Ordner erlaubt es nicht Dateien benutzerdefiniert zu "
513
+ "sortieren."
514
+
515
+ #: inc/overrides/pro/order/Sortable.php:1
516
+ msgid "This folder has an automatic order. Please deactivate that first."
517
+ msgstr ""
518
+ "Dieser Ordner hat eine automatische Sortierung. Bitte deaktiviere diese erst."
519
+
520
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
521
+ msgid "Please select a folder to show items."
522
+ msgstr "Bitte wähle einen Ordner aus, um die Artikel anzuzeigen."
523
+
524
+ #: inc/rest/Attachment.php:1
525
+ msgid "Fetch only media in a folder by folder id."
526
+ msgstr "Lade nur Medien in einem Ordner nach Ordnerkennung."
527
+
528
+ #: inc/rest/Service.php:1
529
+ msgid "Forbidden"
530
+ msgstr "Verboten"
531
+
532
+ #: inc/rest/Service.php:1
533
+ msgid "Real Media Library is not active for the current user."
534
+ msgstr "Real Media Library ist für den aktuellen Benutzer nicht aktiviert."
535
+
536
+ #: inc/usersettings/AllFilesShortcuts.php:1
537
+ msgid "Hide shortcuts in \"All files\""
538
+ msgstr "Verknüpfungen in \"Alle Dateien\" ausblenden"
539
+
540
+ #: inc/usersettings/AllFilesShortcuts.php:1
541
+ msgid "The count always includes shortcuts"
542
+ msgstr "Die Anzahl ist immer inklusive Verknüpfungen"
543
+
544
+ #: inc/usersettings/DefaultFolder.php:1
545
+ msgid "Default startup folder"
546
+ msgstr "Standard Ordner beim Start"
547
+
548
+ #: inc/usersettings/DefaultFolder.php:1
549
+ msgid "No folder at startup"
550
+ msgstr "Keinen Ordner öffnen"
551
+
552
+ #: inc/usersettings/DefaultFolder.php:1
553
+ msgid "Last opened folder"
554
+ msgstr "Zuletzt geöffneter Ordner"
555
+
556
+ #: inc/usersettings/DefaultFolder.php:1
557
+ msgid ""
558
+ "Your media library can always open in the last opened folder or a folder you "
559
+ "choose. This saves you time every time you open the media library!"
560
+ msgstr ""
561
+ "Deine Mediathek kann sich immer im zuletzt geöffneten Ordner oder einem von "
562
+ "dir gewählten Ordner öffnen. So sparst du jedes Mal Zeit, wenn du die "
563
+ "Mediathek öffnest!"
564
+
565
+ #: inc/usersettings/InfiniteScrolling.php:1
566
+ msgid "Enable infinite scrolling in grid view"
567
+ msgstr "Automatisches Nachladen beim Scrollen in der Kachel-Ansicht aktivieren"
568
+
569
+ #: inc/usersettings/InfiniteScrolling.php:1
570
+ msgid ""
571
+ "Instead of displaying a \"Load More\" button, all files are loaded "
572
+ "automatically as you scroll down. This is not supported in list view."
573
+ msgstr ""
574
+ "Anstatt eine Schaltfläche \"Mehr laden\" anzuzeigen, werden alle Dateien "
575
+ "automatisch nachgeladen, wenn du nach unten scrollst. Dies wird in der "
576
+ "Listenansicht nicht unterstützt."
577
+
578
+ #: inc/view/FolderShortcode.php:1
579
+ msgid "Gallery from Media Folder"
580
+ msgstr "Galerie aus Medienordner"
581
+
582
+ #: inc/view/FolderShortcode.php:1
583
+ msgid ""
584
+ "Note: You can only select galleries. Folders and collections are grayed."
585
+ msgstr ""
586
+ "Beachte: Du kannst nur Galerien auswählen. Ordner und Kollektionen sind "
587
+ "ausgegraut."
588
+
589
+ #: inc/view/FolderShortcode.php:1
590
+ msgid "Link to"
591
+ msgstr "Link auf"
592
+
593
+ #: inc/view/FolderShortcode.php:1
594
+ msgid "Columns"
595
+ msgstr "Spalten"
596
+
597
+ #: inc/view/FolderShortcode.php:1
598
+ msgid "Random Order"
599
+ msgstr "Zufällige Anordnung"
600
+
601
+ #: inc/view/FolderShortcode.php:1
602
+ msgid "Size"
603
+ msgstr "Größe"
604
+
605
+ #: inc/view/FolderShortcode.php:1
606
+ msgid "Attachment File"
607
+ msgstr "Mediendatei"
608
+
609
+ #: inc/view/FolderShortcode.php:1
610
+ msgid "Media File"
611
+ msgstr "Mediendatei"
612
+
613
+ #: inc/view/FolderShortcode.php:1
614
+ msgid "None"
615
+ msgstr "Keine"
616
+
617
+ #: inc/view/FolderShortcode.php:1
618
+ msgid "Thumbnail"
619
+ msgstr "Thumbnail"
620
+
621
+ #: inc/view/FolderShortcode.php:1
622
+ msgid "Medium"
623
+ msgstr "Medium"
624
+
625
+ #: inc/view/FolderShortcode.php:1
626
+ msgid "Large"
627
+ msgstr "Groß"
628
+
629
+ #: inc/view/FolderShortcode.php:1
630
+ msgid "Full Size"
631
+ msgstr "Volle Größe"
632
+
633
+ #: inc/view/Lang.php:1
634
+ msgid ""
635
+ "Subfolders are only available in the PRO version. But you can now create an "
636
+ "unlimited number of folders on the main level (instead of the previous max. "
637
+ "10 folders)."
638
+ msgstr ""
639
+ "Unterordner sind nur in der PRO Version verfügbar. Aber du kannst jetzt eine "
640
+ "unbegrenzte Anzahl von Ordnern auf der Hauptebene erstellen (statt der "
641
+ "bisherigen max. 10 Ordner)."
642
+
643
+ #: inc/view/Lang.php:1
644
+ msgid "No folder selected"
645
+ msgstr "Kein Ordner ausgewählt"
646
+
647
+ #: inc/view/Lang.php:1
648
+ msgid "Select folder"
649
+ msgstr "Zielordner auswählen"
650
+
651
+ #: inc/view/Lang.php:1
652
+ msgid "Reload content"
653
+ msgstr "Inhalt neuladen"
654
+
655
+ #: inc/view/Lang.php:1
656
+ msgid "Subfolders"
657
+ msgstr "Unterordner"
658
+
659
+ #: inc/view/Lang.php:1
660
+ msgid "Please select a folder (media library) in the block settings."
661
+ msgstr "Bitte wähle einen Ordner in den Block-Einstellungen aus."
662
+
663
+ #: inc/view/Lang.php:1
664
+ msgid "New folders inherit this restriction"
665
+ msgstr "Neue Unterordner erben diese Einschränkung"
666
+
667
+ #: inc/view/Lang.php:1
668
+ msgid "The current selected folder has some restrictions:"
669
+ msgstr "Der aktuell ausgewählte Ordner besitzt Einschränkungen:"
670
+
671
+ #: inc/view/Lang.php:1
672
+ msgid "You cannot change *parent* folder"
673
+ msgstr "Der *übergeordnete* Ordner darf nicht geändert werden"
674
+
675
+ #: inc/view/Lang.php:1
676
+ msgid "You cannot *rearrange* subfolders"
677
+ msgstr "Unterordner dürfen nicht neu *angeordnet* werden"
678
+
679
+ #: inc/view/Lang.php:1
680
+ msgid "You cannot *create* subfolders"
681
+ msgstr "Keine *Unterordner* erlaubt"
682
+
683
+ #: inc/view/Lang.php:1
684
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
685
+ msgstr ""
686
+ "Du kannst keine neuen Dateien *einfügen*. Neue Dateien werden nach "
687
+ "Unorganisiert verschoben…"
688
+
689
+ #: inc/view/Lang.php:1
690
+ msgid "You cannot *rename* the folder"
691
+ msgstr "Der Ordner darf nicht *umbenannt* werden"
692
+
693
+ #: inc/view/Lang.php:1
694
+ msgid "You cannot *delete* the folder"
695
+ msgstr "Der Ordner darf nicht *gelöscht* werden"
696
+
697
+ #: inc/view/Lang.php:1
698
+ msgid "You cannot *move* files outside the folder"
699
+ msgstr "Enthaltene Dateien dürfen nicht *verschoben* werden"
700
+
701
+ #: inc/view/Lang.php:1
702
+ msgid "Parent"
703
+ msgstr "Übergeordnet"
704
+
705
+ #: inc/view/Lang.php:1
706
+ msgid "Before this node"
707
+ msgstr "Vor diesem Eintrag"
708
+
709
+ #: inc/view/Lang.php:1
710
+ msgid "If no next node is given, the element is placed at the end."
711
+ msgstr "Wenn kein Eintrag ausgewählt, wird es an das Ende angehängt."
712
+
713
+ #: inc/view/Lang.php:1
714
+ msgid "The file is uploaded to the folder where you are currently in."
715
+ msgstr ""
716
+ "Die Datei wird in den Ordner hochgeladen, in dem du dich gerade befindest."
717
+
718
+ #: inc/view/Lang.php:1
719
+ msgid "Are you sure?"
720
+ msgstr "Bist du sicher?"
721
+
722
+ #: inc/view/Lang.php:1
723
+ msgid "Success"
724
+ msgstr "Erfolgreich"
725
+
726
+ #: inc/view/Lang.php:1
727
+ msgid "Failed"
728
+ msgstr "Fehlgeschlagen"
729
+
730
+ #: inc/view/Lang.php:1
731
+ msgid "No entries found"
732
+ msgstr "Keine Einträge gefunden"
733
+
734
+ #: inc/view/Lang.php:1
735
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
736
+ msgstr ""
737
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
738
+ "verschoben."
739
+
740
+ #: inc/view/Lang.php:1
741
+ msgid ""
742
+ "Are you sure to delete *{count} folders*? All files gets moved to "
743
+ "Unorganized."
744
+ msgstr ""
745
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
746
+ "verschoben."
747
+
748
+ #: inc/view/Lang.php:1
749
+ msgid "Ok"
750
+ msgstr "Ok"
751
+
752
+ #: inc/view/Lang.php:1
753
+ msgid "Cancel"
754
+ msgstr "Abbrechen"
755
+
756
+ #: inc/view/Lang.php:1
757
+ msgid "Save"
758
+ msgstr "Speichern"
759
+
760
+ #: inc/view/Lang.php:1
761
+ msgid "Back"
762
+ msgstr "Zurück"
763
+
764
+ #: inc/view/Lang.php:1
765
+ msgid "No folders found"
766
+ msgstr "Keine Ordner gefunden"
767
+
768
+ #: inc/view/Lang.php:1
769
+ msgid ""
770
+ "No folders have been created yet. Just click on the button above to create "
771
+ "your first folder."
772
+ msgstr ""
773
+ "Bisher wurden keine Ordner angelegt. Klicke auf den obigen Button, um deinen "
774
+ "ersten Ordner zu erstellen."
775
+
776
+ #: inc/view/Lang.php:1
777
+ msgid "Folders"
778
+ msgstr "Ordner"
779
+
780
+ #: inc/view/Lang.php:1
781
+ msgid "No search results."
782
+ msgstr "Keine Suchergebnisse."
783
+
784
+ #: inc/view/Lang.php:1
785
+ msgid "Renaming to *{name}*…"
786
+ msgstr "Umbenennen in *{name}*…"
787
+
788
+ #: inc/view/Lang.php:1
789
+ msgid "Successfully renamed folder to *{name}*"
790
+ msgstr "Ordner erfolgreich in *{name}* umbenannt"
791
+
792
+ #: inc/view/Lang.php:1
793
+ msgid "Creating *{name}*…"
794
+ msgstr "Erstelle *{name}*…"
795
+
796
+ #: inc/view/Lang.php:1
797
+ msgid "Successfully created *{name}*"
798
+ msgstr "Erfolgreich *{name}* erstellt"
799
+
800
+ #: inc/view/Lang.php:1
801
+ msgid "Deleting *{name}*…"
802
+ msgstr "Löschen von *{name}*…"
803
+
804
+ #: inc/view/Lang.php:1
805
+ msgid "Successfully deleted *{name}*"
806
+ msgstr "Erfolgreich *{name}* gelöscht"
807
+
808
+ #: inc/view/Lang.php:1
809
+ msgid "Successfully deleted *{count} folders*"
810
+ msgstr "*{count} Order* erfolgreich geschlöscht"
811
+
812
+ #: inc/view/Lang.php:1
813
+ msgid "Rearrange *{name}* placement manually"
814
+ msgstr "Ordne *{name}* manuell an"
815
+
816
+ #: inc/view/Lang.php:1
817
+ msgid "Reordering the tree hierarchy…"
818
+ msgstr "Der Baum wird neu angeordnet…"
819
+
820
+ #: inc/view/Lang.php:1
821
+ msgid "Successfully sorted the tree hierarchy"
822
+ msgstr "Der Baum wurde erfolgreich neu angeordnet"
823
+
824
+ #: inc/view/Lang.php:1
825
+ msgid "Reorder subfolders of *{name}*…"
826
+ msgstr "Unterordner von *{name}* werden neu angeordnet…"
827
+
828
+ #: inc/view/Lang.php:1
829
+ msgid "{count} files remaining…"
830
+ msgstr "{count} Dateien verbleibend…"
831
+
832
+ #: inc/view/Lang.php:1
833
+ msgid "Receiving data…"
834
+ msgstr "Empfange Daten…"
835
+
836
+ #: inc/view/Lang.php:1
837
+ msgid "Shortcut"
838
+ msgstr "Verknüpfung"
839
+
840
+ #: inc/view/Lang.php:1
841
+ msgid ""
842
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
843
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
844
+ "do this in the original file (for example replace media file through a "
845
+ "plugin).\n"
846
+ "Note also that the fields in the shortcuts can be different to the original "
847
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
848
+ msgstr ""
849
+ "Dies ist eine Datei-Verknüpfung. Verknüpfungen brauchen keinen physischen "
850
+ "Speicherplatz *(0 kB)*. Wenn du die Datei selbst bearbeiten möchtest, musst "
851
+ "du das für die Original-Datei tun (Beispiel: Ersetzen der Datei durch ein "
852
+ "Plugin).\n"
853
+ "Beachte auch, dass Felder wie der Titel und Beschreibung unterschiedlich zur "
854
+ "Original-Datei sein können."
855
+
856
+ #: inc/view/Lang.php:1
857
+ msgid ""
858
+ "In the current view of uploads, filters are active. Please reset them and "
859
+ "refresh the view."
860
+ msgstr ""
861
+ "Im Moment sind Filter aktiv. Bitte setze diese zurück und aktualisiere die "
862
+ "Ansicht."
863
+
864
+ #: inc/view/Lang.php:1
865
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
866
+ msgstr ""
867
+ "Eine Kollektion darf keine Dateien enthalten. Datei wird nach Unorganisiert "
868
+ "verschoben…"
869
+
870
+ #: inc/view/Lang.php:1
871
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
872
+ msgstr ""
873
+ "Eine Galerie darf nur Bilder enthalten. Datei wird nach Unorganisiert "
874
+ "verschoben…"
875
+
876
+ #: inc/view/Lang.php:1
877
+ msgid "Order content by *{name}*…"
878
+ msgstr "Ordne Inhalt nach *{name}*…"
879
+
880
+ #: inc/view/Lang.php:1
881
+ msgid "Order content by drag & drop"
882
+ msgstr "Ordne Inhalte per Drag&Drop"
883
+
884
+ #: inc/view/Lang.php:1
885
+ msgid "Reset order"
886
+ msgstr "Reihenfolge zurücksetzen"
887
+
888
+ #: inc/view/Lang.php:1
889
+ msgid "Apply order once…"
890
+ msgstr "Einmalige Sortierung anwenden…"
891
+
892
+ #: inc/view/Lang.php:1
893
+ msgid "Last"
894
+ msgstr "zuletzt"
895
+
896
+ #: inc/view/Lang.php:1
897
+ msgid "Deactivate automatic ordering"
898
+ msgstr "Deaktiviere automatische Sortierung"
899
+
900
+ #: inc/view/Lang.php:1
901
+ msgid "Apply automatic order…"
902
+ msgstr "Automatische Sortierung anwenden…"
903
+
904
+ #: inc/view/Lang.php:1
905
+ msgid "Latest"
906
+ msgstr "Aktuell"
907
+
908
+ #: inc/view/Lang.php:1
909
+ msgid "Reindex order"
910
+ msgstr "Reihenfolge reparieren"
911
+
912
+ #: inc/view/Lang.php:1
913
+ msgid "Reset to last order"
914
+ msgstr "Letzte Reihenfolge wiederherstellen"
915
+
916
+ #: inc/view/Lang.php:1
917
+ msgid "All files"
918
+ msgstr "Alle Dateien"
919
+
920
+ #: inc/view/Lang.php:1
921
+ msgid "Move {count} files"
922
+ msgstr "Verschiebe {count} Dateien"
923
+
924
+ #: inc/view/Lang.php:1
925
+ msgid "Move one file"
926
+ msgstr "Verschiebe Datei"
927
+
928
+ #: inc/view/Lang.php:1
929
+ msgid "Copy {count} files"
930
+ msgstr "Kopiere {count} Dateien"
931
+
932
+ #: inc/view/Lang.php:1
933
+ msgid "Copy one file"
934
+ msgstr "Kopiere Datei"
935
+
936
+ #: inc/view/Lang.php:1
937
+ msgid "Moving {count} files…"
938
+ msgstr "{count} Dateien verschieben…"
939
+
940
+ #: inc/view/Lang.php:1
941
+ msgid "Moving one file…"
942
+ msgstr "Datei verschieben…"
943
+
944
+ #: inc/view/Lang.php:1
945
+ msgid "Copying {count} files…"
946
+ msgstr "{count} Dateien kopieren…"
947
+
948
+ #: inc/view/Lang.php:1
949
+ msgid "Copying one file…"
950
+ msgstr "Datei kopieren…"
951
+
952
+ #: inc/view/Lang.php:1
953
+ msgid "Successfully moved {count} files"
954
+ msgstr "{count} Dateien erfolgreich verschoben"
955
+
956
+ #: inc/view/Lang.php:1
957
+ msgid "Successfully moved one file"
958
+ msgstr "Datei erfolgreich verschoben"
959
+
960
+ #: inc/view/Lang.php:1
961
+ msgid "Successfully copied {count} files"
962
+ msgstr "{count} Dateien erfolgreich kopiert"
963
+
964
+ #: inc/view/Lang.php:1
965
+ msgid "Successfully copied one file"
966
+ msgstr "Datei erfolgreich kopiert"
967
+
968
+ #: inc/view/Lang.php:1
969
+ msgid "Hold any key to create a shortcut"
970
+ msgstr "Eine Taste festhalten, um Datei zu kopieren"
971
+
972
+ #: inc/view/Lang.php:1
973
+ msgid "Release key to move file"
974
+ msgstr "Taste loslassen, um Datei zu verschieben"
975
+
976
+ #: inc/view/Lang.php:1
977
+ msgid "Click this to create a new folder"
978
+ msgstr "Klicke hier, um einen neuen Ordner anzulegen"
979
+
980
+ #: inc/view/Lang.php:1
981
+ msgid ""
982
+ "A folder can contain any file type and collection, but not galleries. If you "
983
+ "want to create a subfolder, select a folder and click this button."
984
+ msgstr ""
985
+ "Ein Ordner kann jeden Dateitypen und Kollektionen enthalten, jedoch keine "
986
+ "Galerien. Wenn du einen Unterordner erstellen möchtest, selektiere einen "
987
+ "Ordner und klicke diesen Button."
988
+
989
+ #: inc/view/Lang.php:1
990
+ msgid "Click this to create a new collection"
991
+ msgstr "Klicke hier, um eine neue Kollektion anzulegen"
992
+
993
+ #: inc/view/Lang.php:1
994
+ msgid ""
995
+ "A collection cannot contain files. However, you can create additional "
996
+ "collections and *galleries* there. This gallery is only a *gallery data "
997
+ "folder*, i.e. they are not automatically visible on the website.\n"
998
+ "\n"
999
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
1000
+ "on your pages/postings."
1001
+ msgstr ""
1002
+ "Eine Kollektion kann keine Dateien enthalten. Dort können jedoch weitere "
1003
+ "Kollektionen und *Galerien* angelegt werden. Diese Galerie ist nur ein "
1004
+ "*Galerie-Daten-Ordner*, d. h. diese sind nicht automatisch auf der Webseite "
1005
+ "zu sehen.\n"
1006
+ "\n"
1007
+ "Eine *visuelle Galerie* kann durch einen Shortcode im Visual Editor auf "
1008
+ "deinen Seiten/Beiträgen erstellt werden."
1009
+
1010
+ #: inc/view/Lang.php:1
1011
+ msgid "Click this to create a *new gallery data folder*"
1012
+ msgstr "Klicke hier, um einen neuen *Galerie-Daten-Ordner* anzulegen"
1013
+
1014
+ #: inc/view/Lang.php:1
1015
+ msgid ""
1016
+ "A *gallery data folder* can only contain images. It is easier for you to "
1017
+ "distinguish where your visual galleries are located.\n"
1018
+ "\n"
1019
+ "You can also order the images into *a custom image order* per drag&drop."
1020
+ msgstr ""
1021
+ "Ein *Galerie-Daten-Ordner* kann nur Bilder enthalten - für dich ist es dann "
1022
+ "einfach zu entscheiden, wo deine visuellen Galerien liegen.\n"
1023
+ "\n"
1024
+ "Sie können per Drag & Drop eine *benutzerdefinierte Reihenfolge* erstellen."
1025
+
1026
+ #: inc/view/Lang.php:1
1027
+ msgid "Settings"
1028
+ msgstr "Einstellungen"
1029
+
1030
+ #: inc/view/Lang.php:1
1031
+ msgid "General settings for the current logged in user."
1032
+ msgstr "Allgemeine Einstellungen für den eingeloggten Benutzer."
1033
+
1034
+ #: inc/view/Lang.php:1
1035
+ msgid "Permissions"
1036
+ msgstr "Berechtigungen"
1037
+
1038
+ #: inc/view/Lang.php:1
1039
+ msgid "Reorder files in this folder"
1040
+ msgstr "Dateien sortieren"
1041
+
1042
+ #: inc/view/Lang.php:1
1043
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1044
+ msgstr "Ordne die Dateien / Bilder nach *Titel, Dateiname, ID, …*"
1045
+
1046
+ #: inc/view/Lang.php:1
1047
+ msgid "Refresh"
1048
+ msgstr "Neuladen"
1049
+
1050
+ #: inc/view/Lang.php:1
1051
+ msgid "Refreshes the current folder view."
1052
+ msgstr "Aktualisiert die aktuelle Ordneransicht."
1053
+
1054
+ #: inc/view/Lang.php:1
1055
+ msgid "Rename"
1056
+ msgstr "Umbenennen"
1057
+
1058
+ #: inc/view/Lang.php:1
1059
+ msgid "Rename the current selected folder."
1060
+ msgstr "Den aktuell ausgewählten Ordner umbenennen."
1061
+
1062
+ #: inc/view/Lang.php:1
1063
+ msgid "Delete"
1064
+ msgstr "Löschen"
1065
+
1066
+ #: inc/view/Lang.php:1
1067
+ msgid "Delete the current selected folder."
1068
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1069
+
1070
+ #: inc/view/Lang.php:1
1071
+ msgid "Delete the current selected folders."
1072
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1073
+
1074
+ #: inc/view/Lang.php:1
1075
+ msgid "Rearrange"
1076
+ msgstr "Neu anordnen"
1077
+
1078
+ #: inc/view/Lang.php:1
1079
+ msgid "Change the hierarchical order of the folders."
1080
+ msgstr "Ändern der hierarchischen Anordnung der Ordner."
1081
+
1082
+ #: inc/view/Lang.php:1
1083
+ msgid "Folder details"
1084
+ msgstr "Ordner Details"
1085
+
1086
+ #: inc/view/Lang.php:1
1087
+ msgid "Select a folder and view more details about it."
1088
+ msgstr "Selektiere einen Ordner, um mehr Details anzuzeigen."
1089
+
1090
+ #: inc/view/Lang.php:1
1091
+ msgid "Product license not yet activated."
1092
+ msgstr "Produkt-Lizenz noch nicht aktiviert."
1093
+
1094
+ #: inc/view/Lang.php:1
1095
+ msgid "Enter license"
1096
+ msgstr "Lizenzschlüssel eingeben"
1097
+
1098
+ #: inc/view/Lang.php:1
1099
+ msgid "Dismiss notice"
1100
+ msgstr "Meldung ausblenden"
1101
+
1102
+ #: inc/view/Lang.php:1
1103
+ msgid ""
1104
+ "It looks like you have already used another plugin for folders in the media "
1105
+ "library."
1106
+ msgstr ""
1107
+ "Es scheint, als hättest Du zuvor ein anderes Plugin zur "
1108
+ "Medienkategorisierung verwendet."
1109
+
1110
+ #: inc/view/Lang.php:1
1111
+ msgid "Start importing"
1112
+ msgstr "Import starten"
1113
+
1114
+ #: inc/view/Lang.php:1
1115
+ msgid "Dismiss"
1116
+ msgstr "Ausblenden"
1117
+
1118
+ #: inc/view/Lang.php:1
1119
+ msgid ""
1120
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1121
+ "do not change when you move the file. Learn more about <a href=\"https://"
1122
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1123
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1124
+ "files to physical folders.</a>"
1125
+ msgstr ""
1126
+ "Real Media Library erstellt eine virtuelle Ordnerstruktur. Die URLs der "
1127
+ "Uploads ändern sich nicht, wenn du die Datei verschiebst. Erfahre mehr "
1128
+ "darüber, wie du <a href=\"https://devowl.io/knowledge-base/how-can-i-"
1129
+ "physically-reflect-the-virtual-folder-structure-to-my-file-system/\" target="
1130
+ "\"_blank\">Dateien automatisch in physische Ordner verschieben kannst.</a>"
1131
+
1132
+ #: inc/view/Lang.php:1
1133
+ msgid ""
1134
+ "You will be redirected to the external website of PRO version. Please "
1135
+ "confirm to continue!"
1136
+ msgstr ""
1137
+ "Sie werden auf die externe Website der PRO-Version weitergeleitet. Bitte "
1138
+ "bestätige die Fortsetzung!"
1139
+
1140
+ #: inc/view/Lang.php:1
1141
+ msgid "PRO Feature"
1142
+ msgstr "PRO Feature"
1143
+
1144
+ #: inc/view/Lang.php:1
1145
+ msgid "Hide for 20 days"
1146
+ msgstr "20 Tage verstecken"
1147
+
1148
+ #: inc/view/Lang.php:1
1149
+ msgid "Thanks for using the free version of Real Media Library."
1150
+ msgstr ""
1151
+ "Vielen Dank für die Nutzung der kostenlosen Version von Real Media Library."
1152
+
1153
+ #: inc/view/Lang.php:1
1154
+ msgid "Get PRO!"
1155
+ msgstr "Hole dir PRO!"
1156
+
1157
+ #: inc/view/Lang.php:1
1158
+ msgid "I want to learn more!"
1159
+ msgstr "Ich will mehr erfahren!"
1160
+
1161
+ #: inc/view/Lang.php:1
1162
+ msgid "No, not interested…"
1163
+ msgstr "Nein, kein Interesse…"
1164
+
1165
+ #: inc/view/Lang.php:1
1166
+ msgid "You like collections?"
1167
+ msgstr "Magst Du Kollektionen?"
1168
+
1169
+ #: inc/view/Lang.php:1
1170
+ msgid ""
1171
+ "Get more organized with different types of folders: Collections and "
1172
+ "galleries help you to easily recognize where your image galleries are "
1173
+ "located."
1174
+ msgstr ""
1175
+ "Sorgen für mehr Ordnung mit verschiedenen Arten von Ordnern: Sammlungen und "
1176
+ "Galerien helfen dir leicht zu erkennen, wo sich deine Bildergalerien "
1177
+ "befinden."
1178
+
1179
+ #: inc/view/Lang.php:1
1180
+ msgid "Custom content order?"
1181
+ msgstr "Dateien sortieren?"
1182
+
1183
+ #: inc/view/Lang.php:1
1184
+ msgid ""
1185
+ "Get your folder contents in order and arrange your files according to a "
1186
+ "criterion (e.g. name descending) or by drag & drop."
1187
+ msgstr ""
1188
+ "Bringen Ordnung in deinen Ordnerinhalt und ordne deine Dateien nach einem "
1189
+ "Kriterium (z.B. Name absteigend) oder per Drag & Drop an."
1190
+
1191
+ #: inc/view/Lang.php:1
1192
+ msgid "Full order control?"
1193
+ msgstr "Volle Kontrolle über die Sortierung?"
1194
+
1195
+ #: inc/view/Lang.php:1
1196
+ msgid ""
1197
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1198
+ "name descending) or by drag & drop."
1199
+ msgstr ""
1200
+ "Organisiere die Knoten innerhalb deines Ordnerbaums nach einem Kriterium (z."
1201
+ "B. Name absteigend) oder per Drag & Drop an."
1202
+
1203
+ #: inc/view/Lang.php:1
1204
+ msgid "Want to create subfolders?"
1205
+ msgstr "Unterordner erstellen?"
1206
+
1207
+ #: inc/view/Lang.php:1
1208
+ msgid ""
1209
+ "Subfolders offer you the possibility to bring more structure into your media "
1210
+ "library. They help you to keep the overview, even if you really have many "
1211
+ "files in your media library."
1212
+ msgstr ""
1213
+ "Unterordner bieten dir die Möglichkeit, mehr Struktur in deine "
1214
+ "Medienbibliothek zu bringen. Sie helfen dir, den Überblick zu behalten, auch "
1215
+ "wenn du wirklich viele Dateien in deiner Mediathek hast."
1216
+
1217
+ #: inc/view/Lang.php:1
1218
+ msgid "Want to switch between folders more comfortably?"
1219
+ msgstr "Komfortabler zwischen den Ordnern wechseln?"
1220
+
1221
+ #: inc/view/Lang.php:1
1222
+ msgid ""
1223
+ "Let the complete folder tree as in your media library also be displayed in "
1224
+ "this dialog instead of searching each time in the dropdown. It is simply "
1225
+ "more comfortable!"
1226
+ msgstr ""
1227
+ "Lass dir den kompletten Ordnerbaum wie in deiner Medienbibliothek auch in "
1228
+ "diesem Dialog anzeigen, anstatt jedes Mal im Dropdown zu suchen. Das ist "
1229
+ "einfach komfortabler!"
1230
+
1231
+ #: inc/view/Lang.php:1
1232
+ msgid "Want to upload entire folders?"
1233
+ msgstr "Möchtest du ganze Ordner hochladen?"
1234
+
1235
+ #: inc/view/Lang.php:1
1236
+ msgid ""
1237
+ "With Real Media Library you can upload entire folders using drag and drop. "
1238
+ "All folders, subfolders and files will be uploaded and displayed in your "
1239
+ "media library in the same structure. Get PRO to upload folders!"
1240
+ msgstr ""
1241
+ "Mit Real Media Library kannst du ganze Ordner per Drag & Drop hochladen. "
1242
+ "Alle Ordner, Unterordner und Dateien werden hochgeladen und in deiner "
1243
+ "Medienbibliothek in der gleichen Struktur angezeigt. Hol dir PRO zum "
1244
+ "Hochladen von Ordnern!"
1245
+
1246
+ #: inc/view/Options.php:1
1247
+ msgid "RealMediaLibrary:General"
1248
+ msgstr "RealMediaLibrary:Allgemein"
1249
+
1250
+ #: inc/view/Options.php:1
1251
+ msgid "Load RML functionality in frontend"
1252
+ msgstr "Lade RML-Funktionalitäten im Frontend"
1253
+
1254
+ #: inc/view/Options.php:1
1255
+ msgid "RealMediaLibrary:Reset"
1256
+ msgstr "RealMediaLibrary:Zurücksetzen"
1257
+
1258
+ #: inc/view/Options.php:1
1259
+ msgid "Reset the order of all galleries"
1260
+ msgstr "Die Reihenfolge aller Galerien zurücksetzen"
1261
+
1262
+ #: inc/view/Options.php:1
1263
+ msgid "Wipe all settings (folders, attachment relations)"
1264
+ msgstr ""
1265
+ "Alle Einstellungen zurücksetzen (Ordner, Medien-Beziehungen zu den Ordnern)"
1266
+
1267
+ #: inc/view/Options.php:1
1268
+ msgid "Reset folder count cache"
1269
+ msgstr "Ordneranzahl-Cache zurücksetzen"
1270
+
1271
+ #: inc/view/Options.php:1
1272
+ msgid "Reset names, slugs and absolute pathes"
1273
+ msgstr "Namen, Slugs und absolute Pfade zurücksetzen"
1274
+
1275
+ #: inc/view/Options.php:1
1276
+ msgid "Wipe attachment relations"
1277
+ msgstr "Setze Medien-Beziehungen zurück"
1278
+
1279
+ #: inc/view/Options.php:1
1280
+ msgid "Wipe all"
1281
+ msgstr "Setze alles zurück"
1282
+
1283
+ #: inc/view/Options.php:1
1284
+ msgid "Reset count"
1285
+ msgstr "Anzahl zurücksetzen"
1286
+
1287
+ #: inc/view/Options.php:1
1288
+ msgid "Reset"
1289
+ msgstr "Zurücksetzen"
1290
+
1291
+ #: inc/view/Options.php:1
1292
+ msgid ""
1293
+ "Activate this option if you are using a page builder like Divi Page Builder, "
1294
+ "WPBakery Page Builder or Elementor."
1295
+ msgstr ""
1296
+ "Aktiviere diese Option, wenn du einen Page Builder wie Divi Page Builder, "
1297
+ "WPBakery Page Builder oder Elementor verwendest."
1298
+
1299
+ #: inc/view/Options.php:1
1300
+ msgid "You can also reset an single folder in its folder details."
1301
+ msgstr "Du kannst auch einen einzelnen Ordner zurücksetzen."
1302
+
1303
+ #: inc/view/View.php:1
1304
+ msgid "All"
1305
+ msgstr "Alles"
1306
+
1307
+ #: inc/view/View.php:1
1308
+ msgid "Unorganized pictures"
1309
+ msgstr "Unorganisierte Bilder"
languages/real-media-library-de_CH.mo ADDED
Binary file
languages/real-media-library-de_CH.po ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
4
+ "POT-Creation-Date: n/a\n"
5
+ "PO-Revision-Date: 2021-10-12 08:40+0000\n"
6
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
7
+ "Language-Team: German <https://translate.devowl.io/projects/wordpress-real-"
8
+ "media-library-backend-php/develop/de/>\n"
9
+ "Language: de_CH\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: Weblate 4.8\n"
15
+
16
+ #. Plugin Name of the plugin
17
+ msgid "Real Media Library"
18
+ msgstr "Real Media Library"
19
+
20
+ #. Plugin URI of the plugin
21
+ msgid "https://devowl.io/wordpress-real-media-library/"
22
+ msgstr "https://devowl.io/de/wordpress-real-media-library/"
23
+
24
+ #. Description of the plugin
25
+ msgid ""
26
+ "Organize uploaded media in folders, collections and galleries: A file "
27
+ "manager for WordPress. Media management made easy!"
28
+ msgstr ""
29
+ "Organisiere hochgeladene Medien in Ordnern, Sammlungen und Galerien: Ein "
30
+ "Dateimanager für WordPress. Medienmanagement leicht gemacht!"
31
+
32
+ #. Author of the plugin
33
+ msgid "devowl.io"
34
+ msgstr "devowl.io"
35
+
36
+ #. Author URI of the plugin
37
+ msgid "https://devowl.io"
38
+ msgstr "https://devowl.io/de/"
39
+
40
+ #: inc/AdInitiator.php:1
41
+ msgid "Complete file and folder manager"
42
+ msgstr "Vollständiger Datei- und Ordnermanager"
43
+
44
+ #: inc/AdInitiator.php:1
45
+ msgid ""
46
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
47
+ "media management. You can use this plugin to organize the thousands of "
48
+ "images, audio, video and PDF files in your media library into folders. "
49
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
50
+ "WordPress."
51
+ msgstr ""
52
+ "Real Media Library ist ein WordPress-Plugin, das dir eine erweiterte "
53
+ "Medienverwaltung ermöglicht. Mit diesem Plugin kannst du die tausende "
54
+ "Bilder, Audio-, Video- und PDF-Dateien in Ihrer Medienbibliothek in Ordnern "
55
+ "organisieren. Im Grunde ist es ein Dateimanager wie Windows Explorer oder "
56
+ "Mac Finder, aber für WordPress."
57
+
58
+ #: inc/AdInitiator.php:1
59
+ msgid "Filter in insert media dialog"
60
+ msgstr "Filter im Dialog “Medien einfügen”"
61
+
62
+ #: inc/AdInitiator.php:1
63
+ msgid ""
64
+ "No matter where you are, the folder structure of Real Media Library is "
65
+ "always where you can select files. For example in the dialog for selecting a "
66
+ "\"Featured Image\"."
67
+ msgstr ""
68
+ "Egal, wo du dich befindest, die Ordnerstruktur von Real Media Library ist "
69
+ "immer dort, wo du Dateien auswählen kannst. Zum Beispiel im Dialog zur "
70
+ "Auswahl eines “Beitragsbild”."
71
+
72
+ #: inc/AdInitiator.php:1
73
+ msgid ""
74
+ "In the Lite version you can only select the folder by a simple dropdown."
75
+ msgstr ""
76
+ "In der Lite Version kannst du den Ordner nur über ein einfaches Dropdown "
77
+ "auswählen."
78
+
79
+ #: inc/AdInitiator.php:1
80
+ msgid "Custom image order"
81
+ msgstr "Benutzerdefinierte Bildreihenfolge"
82
+
83
+ #: inc/AdInitiator.php:1
84
+ msgid ""
85
+ "Organizing your media files is really easy with the Real Media Library "
86
+ "plugin. You can arrange the order of your files yourself by dragging and "
87
+ "dropping. This allows you to move important files to the top for faster "
88
+ "access."
89
+ msgstr ""
90
+ "Die Organisation deiner Mediendateien ist mit dem Real Media Library Plugin "
91
+ "wirklich einfach. Du kannst die Reihenfolge deiner Dateien selbst durch Drag "
92
+ "& Drop festlegen. Dadurch kannst du wichtige Dateien für einen schnelleren "
93
+ "Zugriff an den Anfang verschieben."
94
+
95
+ #: inc/AdInitiator.php:1
96
+ msgid "Get your PRO license now!"
97
+ msgstr "Holen dir jetzt deine PRO-Lizenz!"
98
+
99
+ #: inc/api/attachment.php:1
100
+ msgid "The given folder was not found."
101
+ msgstr "Der angegebene Ordner wurde nicht gefunden."
102
+
103
+ #: inc/Assets.php:1
104
+ msgid "Complementary Plugins"
105
+ msgstr "Erweiterungen"
106
+
107
+ #: inc/Assets.php:1
108
+ msgid ""
109
+ "\n"
110
+ "\n"
111
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
112
+ "deleted.\n"
113
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
114
+ "deleted, too."
115
+ msgstr ""
116
+ "\n"
117
+ "\n"
118
+ "Beachte: Wenn du eine Verknüpfung löscht, wird die Originaldatei nicht "
119
+ "gelöscht.\n"
120
+ "Wenn du eine normale Datei löscht, werden alle dazugehörigen Verknüpfungen "
121
+ "auch gelöscht."
122
+
123
+ #: inc/attachment/CustomField.php:1
124
+ msgid ""
125
+ "If you move this shortcut, the location of the source/main file is not "
126
+ "changed."
127
+ msgstr ""
128
+ "Wenn du diese Verknüpfung verschiebst, wird der Ordner der Originaldatei "
129
+ "nicht verändert."
130
+
131
+ #: inc/attachment/CustomField.php:1
132
+ msgid ""
133
+ "If you move this attachment, the folder location of the associated shortcuts "
134
+ "are not changed."
135
+ msgstr ""
136
+ "Wenn du diese Datei verschiebst, werden die Ordner der dazugehörigen "
137
+ "Verknüpfungen nicht verändert."
138
+
139
+ #: inc/attachment/CustomField.php:1
140
+ msgid "Move to another folder"
141
+ msgstr "Verschiebe Datei in anderen Ordner"
142
+
143
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
144
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
145
+ msgid "Folder"
146
+ msgstr "Ordner"
147
+
148
+ #: inc/attachment/CustomField.php:1
149
+ msgid "Shortcut infos"
150
+ msgstr "Verknüpfung"
151
+
152
+ #: inc/attachment/CustomField.php:1
153
+ msgid ""
154
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
155
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
156
+ "itself, you must do this in the original file (for example replace media "
157
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
158
+ "be different to the original file, for example \"Title\", \"Description\" or "
159
+ "\"Caption\"."
160
+ msgstr ""
161
+ "Dies ist eine Verknüpfung. Verknüpfungen brauchen keinen physikalischen "
162
+ "Speicherplatz <strong>(0 kB)</strong>. Wenn du die Datei selbst ändern "
163
+ "möchten, verändere die Originaldatei (bspw. Ersetzen der Datei durch ein "
164
+ "Plugin).<br/>Beachten auch, dass die Felder in der Verknüpfung "
165
+ "unterschiedlich zur Originaldatei sein können, zum Beispiel “Titel”, "
166
+ "“Beschreibung”."
167
+
168
+ #. translators:
169
+ #: inc/attachment/CustomField.php:1
170
+ msgid "For this file is %d shortcut available in the following folder:"
171
+ msgid_plural ""
172
+ "For this file are %d shortcuts available in the following folders:"
173
+ msgstr[0] "Für diese Datei gibt es eine Verknüpfung im folgenden Ordner:"
174
+ msgstr[1] ""
175
+ "Für diese Datei sind %s Verknüpfungen verfügbar in folgenden Ordnern:"
176
+
177
+ #: inc/attachment/CustomField.php:1
178
+ msgid ""
179
+ "This file has no associated shortcuts. You can create shortcuts by moving "
180
+ "files per mouse and hold any key."
181
+ msgstr ""
182
+ "Die Datei hat keine zugehörige Verknüpfung. Du kannst Verknüpfung erstellen, "
183
+ "indem du per Drag&Drop die Datei bewegst und eine beliebige Taste hältst."
184
+
185
+ #: inc/attachment/Permissions.php:1
186
+ msgid "You are not allowed to insert files here."
187
+ msgstr "Du hast keine Berechtigung, hier neue Dateien hinzuzufügen."
188
+
189
+ #: inc/attachment/Permissions.php:1
190
+ msgid "You are not allowed to move the file."
191
+ msgstr "Du hast keine Berechtigung, die Datei zu verschieben."
192
+
193
+ #: inc/attachment/Permissions.php:1
194
+ msgid "You are not allowed to create a subfolder here."
195
+ msgstr "Du hast keine Berechtigung hier Unterordner zu erstellen."
196
+
197
+ #: inc/attachment/Permissions.php:1
198
+ msgid "You are not allowed to delete this folder."
199
+ msgstr "Du hast keine Berechtigung den Ordner zu löschen."
200
+
201
+ #: inc/attachment/Permissions.php:1
202
+ msgid "You are not allowed to rename this folder."
203
+ msgstr "Du hast keine Berechtigung den Ordner umzubenennen."
204
+
205
+ #: inc/attachment/Upload.php:1
206
+ msgid "Select destination folder"
207
+ msgstr "Zielordner auswählen"
208
+
209
+ #: inc/attachment/Upload.php:1
210
+ msgid ""
211
+ "You can simply upload files directly to a folder. Select a folder and upload "
212
+ "files."
213
+ msgstr "Du kannst Dateien direkt in einen Ordner hochladen."
214
+
215
+ #: inc/attachment/Upload.php:1
216
+ msgid "upload to folder"
217
+ msgstr "in den Ordner hochladen"
218
+
219
+ #: inc/comp/ExImport.php:1
220
+ msgid "RealMediaLibrary:Import / Export"
221
+ msgstr "RealMediaLibrary:Import / Export"
222
+
223
+ #: inc/comp/ExImport.php:1
224
+ msgid "Import from other plugins"
225
+ msgstr "Von anderen Plugins importieren"
226
+
227
+ #: inc/comp/ExImport.php:1
228
+ msgid "Export / Import Real Media Library folders"
229
+ msgstr "Export / Image Real Media Library Ordner"
230
+
231
+ #: inc/comp/ExImport.php:1
232
+ msgid "Export"
233
+ msgstr "Exportieren"
234
+
235
+ #: inc/comp/ExImport.php:1
236
+ msgid "Import"
237
+ msgstr "Importieren"
238
+
239
+ #: inc/comp/ExImport.php:1
240
+ msgid ""
241
+ "All available folders will be exported. The current structure is not lost "
242
+ "during import - but check that there are no duplicate names in the import "
243
+ "data, as these are not checked."
244
+ msgstr ""
245
+ "Exportiert werden alle verfügbaren Ordner. Beim Import geht die aktuelle "
246
+ "Struktur nicht verloren - prüfe aber, dass bei den Import-Daten keine "
247
+ "doppelten Namen vorkommen, da diese nicht geprüft werden."
248
+
249
+ #: inc/comp/ExImport.php:1
250
+ msgid "Exported data:"
251
+ msgstr "Exportieren:"
252
+
253
+ #: inc/comp/ExImport.php:1
254
+ msgid "Import data:"
255
+ msgstr "Importieren:"
256
+
257
+ #: inc/comp/ExImport.php:1
258
+ msgid "Importing data is only available in PRO version."
259
+ msgstr "Das Importieren von Daten ist nur in der PRO-Version verfügbar."
260
+
261
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
262
+ #: inc/view/Lang.php:1
263
+ msgid "Learn more about PRO"
264
+ msgstr "Erfahre mehr über PRO"
265
+
266
+ #: inc/comp/ExImport.php:1
267
+ msgid "Imports categories and post relations."
268
+ msgstr "Importiert Kategorien und Beziehungen."
269
+
270
+ #: inc/comp/ExImport.php:1
271
+ msgid "Nothing to import."
272
+ msgstr "Nichts zu importieren."
273
+
274
+ #: inc/comp/ExImport.php:1
275
+ msgid ""
276
+ "Importing categories from another plugin is only available in PRO version."
277
+ msgstr ""
278
+ "Der Import von Kategorien aus einem anderen Plugin ist nur in der PRO-"
279
+ "Version verfügbar."
280
+
281
+ #: inc/comp/ExportMediaLibrary.php:1
282
+ msgid "No valid folder."
283
+ msgstr "Kein gültiger Ordner."
284
+
285
+ #: inc/comp/ExportMediaLibrary.php:1
286
+ msgid "No valid type."
287
+ msgstr "Kein gültiger Typ."
288
+
289
+ #: inc/comp/PolyLang.php:1
290
+ msgid "PolyLang: Automatically move translations"
291
+ msgstr "PolyLang: Automatisch Übersetzungen verschieben"
292
+
293
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
294
+ msgid ""
295
+ "If you move a file, the corresponding translated file will also be moved."
296
+ msgstr ""
297
+ "Wenn du eine Datei verschiebst, wird auch die dazugehörigen übersetzte Datei "
298
+ "verschoben."
299
+
300
+ #: inc/comp/WPML.php:1
301
+ msgid "WPML: Automatically move translations"
302
+ msgstr "WPML: Automatisch übersetzte Bilder in Ordner verschieben"
303
+
304
+ #. translators:
305
+ #: inc/exception/FolderAlreadyExistsException.php:1
306
+ msgid "'%s' already exists in this folder."
307
+ msgstr "'%s' existiert bereits in diesem Ordner."
308
+
309
+ #. translators:
310
+ #: inc/exception/OnlyInProVersionException.php:1
311
+ msgid "This functionality is not available in the free version (%s)."
312
+ msgstr ""
313
+ "Diese Funktionalität ist in der kostenlosen Version (%s) nicht verfügbar."
314
+
315
+ #: inc/folder/Creatable.php:1
316
+ msgid "You need to provide a set of files."
317
+ msgstr "Du musst mehrere Dateien bereitstellen."
318
+
319
+ #: inc/folder/Creatable.php:1
320
+ msgid "The folder could not be created in the database."
321
+ msgstr "Der Ordner konnte nicht in die Datenbank geschrieben werden."
322
+
323
+ #: inc/folder/Creatable.php:1
324
+ msgid "The folder could not be created because it already exists."
325
+ msgstr "Der Ordner konnte nicht erstellt werden, da er bereits existiert."
326
+
327
+ #: inc/folder/Creatable.php:1
328
+ msgid ""
329
+ "A folder can contain every type of file or a collection, but not gallery."
330
+ msgstr ""
331
+ "Ein Ordner kann alle Typen von Dateien enthalten oder eine Kollektion, aber "
332
+ "keine Galerie."
333
+
334
+ #. translators:
335
+ #: inc/folder/Creatable.php:1
336
+ msgid "'%s' is not a valid folder name."
337
+ msgstr "'%s' ist kein gültiger Ordnername."
338
+
339
+ #: inc/folder/Creatable.php:1
340
+ msgid "Order by name ascending"
341
+ msgstr "Sortiere nach Name aufsteigend"
342
+
343
+ #: inc/folder/Creatable.php:1
344
+ msgid "Order by name descending"
345
+ msgstr "Sortiere nach Name absteigend"
346
+
347
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
348
+ msgid "Order by ID ascending"
349
+ msgstr "Sortiere nach ID aufsteigend"
350
+
351
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
352
+ msgid "Order by ID descending"
353
+ msgstr "Sortiere nach ID absteigend"
354
+
355
+ #: inc/folder/CRUD.php:1
356
+ msgid "The given folder does not exist or you cannot rename this folder."
357
+ msgstr ""
358
+ "Der Ordner kann nicht gefunden werden oder du kannst diesen Ordner nicht "
359
+ "umbenennen."
360
+
361
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
362
+ msgid "The folder you try to delete has subfolders."
363
+ msgstr "Den Ordner, den du löschen möchtest, enthält Unterordner."
364
+
365
+ #: inc/folder/CRUD.php:1
366
+ msgid "The given folder does not exist."
367
+ msgstr "Der angegebene Ordner existiert nicht."
368
+
369
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
370
+ msgid "Unorganized"
371
+ msgstr "Unorganisiert"
372
+
373
+ #: inc/folder/Root.php:1
374
+ msgid ""
375
+ "Unorganized is the same as a root folder. Here you can find all files which "
376
+ "are not assigned to a folder."
377
+ msgstr ""
378
+ "Unorganisiert ist der Stamm-Ordner. Alle nicht zugewiesenen Dateien können "
379
+ "hier aufgefunden werden."
380
+
381
+ #: inc/metadata/CoverImage.php:1
382
+ msgid ""
383
+ "This option is disabled on this page. Please navigate to the media library."
384
+ msgstr ""
385
+ "Diese Option ist auf dieser Seite deaktiviert. Navigiere bitte zur "
386
+ "Medienbibliothek."
387
+
388
+ #: inc/metadata/CoverImage.php:1
389
+ msgid "Cover image"
390
+ msgstr "Vorschaubild"
391
+
392
+ #: inc/metadata/Description.php:1
393
+ msgid "Description"
394
+ msgstr "Beschreibung"
395
+
396
+ #: inc/metadata/Meta.php:1
397
+ msgid "Path"
398
+ msgstr "Pfad"
399
+
400
+ #: inc/metadata/Meta.php:1
401
+ msgid "Folder type"
402
+ msgstr "Ordnertyp"
403
+
404
+ #: inc/metadata/Meta.php:1
405
+ msgid "General"
406
+ msgstr "Allgemein"
407
+
408
+ #: inc/order/Sortable.php:1
409
+ msgid "Order by date ascending"
410
+ msgstr "Sortiere nach Datum aufsteigend"
411
+
412
+ #: inc/order/Sortable.php:1
413
+ msgid "Order by date descending"
414
+ msgstr "Sortiere nach Datum absteigend"
415
+
416
+ #: inc/order/Sortable.php:1
417
+ msgid "Order by title ascending"
418
+ msgstr "Sortiere nach Titel aufsteigend"
419
+
420
+ #: inc/order/Sortable.php:1
421
+ msgid "Order by title descending"
422
+ msgstr "Sortiere nach Titel absteigend"
423
+
424
+ #: inc/order/Sortable.php:1
425
+ msgid "Order by filename ascending"
426
+ msgstr "Sortiere nach Dateiname aufsteigend"
427
+
428
+ #: inc/order/Sortable.php:1
429
+ msgid "Order by filename descending"
430
+ msgstr "Sortiere nach Dateiname absteigend"
431
+
432
+ #: inc/order/Sortable.php:1
433
+ msgid "Natural order by filename ascending"
434
+ msgstr "Natürliche Ordnung nach Dateinamen aufsteigend"
435
+
436
+ #: inc/order/Sortable.php:1
437
+ msgid "Natural order by filename descending"
438
+ msgstr "Natürliche Ordnung nach Dateinamen absteigend"
439
+
440
+ #: inc/overrides/lite/folder/Creatable.php:1
441
+ #: inc/overrides/pro/folder/Creatable.php:1
442
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
443
+ msgid "Something went wrong."
444
+ msgstr "Etwas ist schiefgelaufen."
445
+
446
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
447
+ msgid "Folder not found."
448
+ msgstr "Ordner nicht gefunden."
449
+
450
+ #: inc/overrides/pro/Core.php:1
451
+ msgid ""
452
+ "<strong>You have not yet entered the license key</strong>. To receive "
453
+ "automatic updates, please enter the key in \"Enter license\"."
454
+ msgstr ""
455
+ "<strong>Der Lizenzschlüssel wurde noch nicht eingegeben</strong>. Um "
456
+ "automatische Updates zu erhalten klicke auf \"Enter license\"."
457
+
458
+ #: inc/overrides/pro/folder/Collection.php:1
459
+ msgid "A collection cannot contain files."
460
+ msgstr "Eine Kollektion kann keine Dateien enthalten."
461
+
462
+ #: inc/overrides/pro/folder/Collection.php:1
463
+ msgid "Collection"
464
+ msgstr "Kollektion"
465
+
466
+ #: inc/overrides/pro/folder/Collection.php:1
467
+ msgid ""
468
+ "A collection cannot contain files. But you can create other collections and "
469
+ "<strong> galleries</strong> there."
470
+ msgstr ""
471
+ "Eine Kollektion kann keine Dateien enthalten. Aber es können dort neue "
472
+ "Kollektionen und <strong>Galerien</strong> angelegt werden."
473
+
474
+ #. translators:
475
+ #: inc/overrides/pro/folder/Creatable.php:1
476
+ msgid "The parent %d does not exist."
477
+ msgstr "Das übergeordnete Ordner %d existiert nicht."
478
+
479
+ #: inc/overrides/pro/folder/Creatable.php:1
480
+ msgid "The given parent does not exist to set the parent for this folder."
481
+ msgstr "Der übergeordnete Ordner existiert nicht."
482
+
483
+ #: inc/overrides/pro/folder/Creatable.php:1
484
+ msgid "You are not allowed to change the parent for this folder."
485
+ msgstr ""
486
+ "Du hast keine Berechtigung den übergeordneten Ordner für diesen Ordner zu "
487
+ "ändern."
488
+
489
+ #: inc/overrides/pro/folder/Creatable.php:1
490
+ msgid "The given parent does not allow the folder type."
491
+ msgstr "Der übergeordnete Ordner erlaubt diesen Ordner-Typ nicht."
492
+
493
+ #: inc/overrides/pro/folder/Gallery.php:1
494
+ msgid "You can only move images to a gallery."
495
+ msgstr "Du kannst nur Bilder zu einer Galerie hinzufügen."
496
+
497
+ #: inc/overrides/pro/folder/Gallery.php:1
498
+ msgid "Gallery"
499
+ msgstr "Galerie"
500
+
501
+ #: inc/overrides/pro/folder/Gallery.php:1
502
+ msgid ""
503
+ "A gallery can only contain images. To view a gallery, go to a post and look "
504
+ "at the buttons of the visual editor.."
505
+ msgstr ""
506
+ "Eine Galerie kann nur Bilder enthalten. Um eine Galerie in einem Beitrag "
507
+ "anzuzeigen, werfe einen Blick auf den visuellen Editor."
508
+
509
+ #: inc/overrides/pro/order/Sortable.php:1
510
+ msgid "The given folder does not allow to reorder the files."
511
+ msgstr ""
512
+ "Der angegebene Ordner erlaubt es nicht Dateien benutzerdefiniert zu "
513
+ "sortieren."
514
+
515
+ #: inc/overrides/pro/order/Sortable.php:1
516
+ msgid "This folder has an automatic order. Please deactivate that first."
517
+ msgstr ""
518
+ "Dieser Ordner hat eine automatische Sortierung. Bitte deaktiviere diese erst."
519
+
520
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
521
+ msgid "Please select a folder to show items."
522
+ msgstr "Bitte wähle einen Ordner aus, um die Artikel anzuzeigen."
523
+
524
+ #: inc/rest/Attachment.php:1
525
+ msgid "Fetch only media in a folder by folder id."
526
+ msgstr "Lade nur Medien in einem Ordner nach Ordnerkennung."
527
+
528
+ #: inc/rest/Service.php:1
529
+ msgid "Forbidden"
530
+ msgstr "Verboten"
531
+
532
+ #: inc/rest/Service.php:1
533
+ msgid "Real Media Library is not active for the current user."
534
+ msgstr "Real Media Library ist für den aktuellen Benutzer nicht aktiviert."
535
+
536
+ #: inc/usersettings/AllFilesShortcuts.php:1
537
+ msgid "Hide shortcuts in \"All files\""
538
+ msgstr "Verknüpfungen in \"Alle Dateien\" ausblenden"
539
+
540
+ #: inc/usersettings/AllFilesShortcuts.php:1
541
+ msgid "The count always includes shortcuts"
542
+ msgstr "Die Anzahl ist immer inklusive Verknüpfungen"
543
+
544
+ #: inc/usersettings/DefaultFolder.php:1
545
+ msgid "Default startup folder"
546
+ msgstr "Standard Ordner beim Start"
547
+
548
+ #: inc/usersettings/DefaultFolder.php:1
549
+ msgid "No folder at startup"
550
+ msgstr "Keinen Ordner öffnen"
551
+
552
+ #: inc/usersettings/DefaultFolder.php:1
553
+ msgid "Last opened folder"
554
+ msgstr "Zuletzt geöffneter Ordner"
555
+
556
+ #: inc/usersettings/DefaultFolder.php:1
557
+ msgid ""
558
+ "Your media library can always open in the last opened folder or a folder you "
559
+ "choose. This saves you time every time you open the media library!"
560
+ msgstr ""
561
+ "Deine Mediathek kann sich immer im zuletzt geöffneten Ordner oder einem von "
562
+ "dir gewählten Ordner öffnen. So sparst du jedes Mal Zeit, wenn du die "
563
+ "Mediathek öffnest!"
564
+
565
+ #: inc/usersettings/InfiniteScrolling.php:1
566
+ msgid "Enable infinite scrolling in grid view"
567
+ msgstr "Automatisches Nachladen beim Scrollen in der Kachel-Ansicht aktivieren"
568
+
569
+ #: inc/usersettings/InfiniteScrolling.php:1
570
+ msgid ""
571
+ "Instead of displaying a \"Load More\" button, all files are loaded "
572
+ "automatically as you scroll down. This is not supported in list view."
573
+ msgstr ""
574
+ "Anstatt eine Schaltfläche \"Mehr laden\" anzuzeigen, werden alle Dateien "
575
+ "automatisch nachgeladen, wenn du nach unten scrollst. Dies wird in der "
576
+ "Listenansicht nicht unterstützt."
577
+
578
+ #: inc/view/FolderShortcode.php:1
579
+ msgid "Gallery from Media Folder"
580
+ msgstr "Galerie aus Medienordner"
581
+
582
+ #: inc/view/FolderShortcode.php:1
583
+ msgid ""
584
+ "Note: You can only select galleries. Folders and collections are grayed."
585
+ msgstr ""
586
+ "Beachte: Du kannst nur Galerien auswählen. Ordner und Kollektionen sind "
587
+ "ausgegraut."
588
+
589
+ #: inc/view/FolderShortcode.php:1
590
+ msgid "Link to"
591
+ msgstr "Link auf"
592
+
593
+ #: inc/view/FolderShortcode.php:1
594
+ msgid "Columns"
595
+ msgstr "Spalten"
596
+
597
+ #: inc/view/FolderShortcode.php:1
598
+ msgid "Random Order"
599
+ msgstr "Zufällige Anordnung"
600
+
601
+ #: inc/view/FolderShortcode.php:1
602
+ msgid "Size"
603
+ msgstr "Größe"
604
+
605
+ #: inc/view/FolderShortcode.php:1
606
+ msgid "Attachment File"
607
+ msgstr "Mediendatei"
608
+
609
+ #: inc/view/FolderShortcode.php:1
610
+ msgid "Media File"
611
+ msgstr "Mediendatei"
612
+
613
+ #: inc/view/FolderShortcode.php:1
614
+ msgid "None"
615
+ msgstr "Keine"
616
+
617
+ #: inc/view/FolderShortcode.php:1
618
+ msgid "Thumbnail"
619
+ msgstr "Thumbnail"
620
+
621
+ #: inc/view/FolderShortcode.php:1
622
+ msgid "Medium"
623
+ msgstr "Medium"
624
+
625
+ #: inc/view/FolderShortcode.php:1
626
+ msgid "Large"
627
+ msgstr "Groß"
628
+
629
+ #: inc/view/FolderShortcode.php:1
630
+ msgid "Full Size"
631
+ msgstr "Volle Größe"
632
+
633
+ #: inc/view/Lang.php:1
634
+ msgid ""
635
+ "Subfolders are only available in the PRO version. But you can now create an "
636
+ "unlimited number of folders on the main level (instead of the previous max. "
637
+ "10 folders)."
638
+ msgstr ""
639
+ "Unterordner sind nur in der PRO Version verfügbar. Aber du kannst jetzt eine "
640
+ "unbegrenzte Anzahl von Ordnern auf der Hauptebene erstellen (statt der "
641
+ "bisherigen max. 10 Ordner)."
642
+
643
+ #: inc/view/Lang.php:1
644
+ msgid "No folder selected"
645
+ msgstr "Kein Ordner ausgewählt"
646
+
647
+ #: inc/view/Lang.php:1
648
+ msgid "Select folder"
649
+ msgstr "Zielordner auswählen"
650
+
651
+ #: inc/view/Lang.php:1
652
+ msgid "Reload content"
653
+ msgstr "Inhalt neuladen"
654
+
655
+ #: inc/view/Lang.php:1
656
+ msgid "Subfolders"
657
+ msgstr "Unterordner"
658
+
659
+ #: inc/view/Lang.php:1
660
+ msgid "Please select a folder (media library) in the block settings."
661
+ msgstr "Bitte wähle einen Ordner in den Block-Einstellungen aus."
662
+
663
+ #: inc/view/Lang.php:1
664
+ msgid "New folders inherit this restriction"
665
+ msgstr "Neue Unterordner erben diese Einschränkung"
666
+
667
+ #: inc/view/Lang.php:1
668
+ msgid "The current selected folder has some restrictions:"
669
+ msgstr "Der aktuell ausgewählte Ordner besitzt Einschränkungen:"
670
+
671
+ #: inc/view/Lang.php:1
672
+ msgid "You cannot change *parent* folder"
673
+ msgstr "Der *übergeordnete* Ordner darf nicht geändert werden"
674
+
675
+ #: inc/view/Lang.php:1
676
+ msgid "You cannot *rearrange* subfolders"
677
+ msgstr "Unterordner dürfen nicht neu *angeordnet* werden"
678
+
679
+ #: inc/view/Lang.php:1
680
+ msgid "You cannot *create* subfolders"
681
+ msgstr "Keine *Unterordner* erlaubt"
682
+
683
+ #: inc/view/Lang.php:1
684
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
685
+ msgstr ""
686
+ "Du kannst keine neuen Dateien *einfügen*. Neue Dateien werden nach "
687
+ "Unorganisiert verschoben…"
688
+
689
+ #: inc/view/Lang.php:1
690
+ msgid "You cannot *rename* the folder"
691
+ msgstr "Der Ordner darf nicht *umbenannt* werden"
692
+
693
+ #: inc/view/Lang.php:1
694
+ msgid "You cannot *delete* the folder"
695
+ msgstr "Der Ordner darf nicht *gelöscht* werden"
696
+
697
+ #: inc/view/Lang.php:1
698
+ msgid "You cannot *move* files outside the folder"
699
+ msgstr "Enthaltene Dateien dürfen nicht *verschoben* werden"
700
+
701
+ #: inc/view/Lang.php:1
702
+ msgid "Parent"
703
+ msgstr "Übergeordnet"
704
+
705
+ #: inc/view/Lang.php:1
706
+ msgid "Before this node"
707
+ msgstr "Vor diesem Eintrag"
708
+
709
+ #: inc/view/Lang.php:1
710
+ msgid "If no next node is given, the element is placed at the end."
711
+ msgstr "Wenn kein Eintrag ausgewählt, wird es an das Ende angehängt."
712
+
713
+ #: inc/view/Lang.php:1
714
+ msgid "The file is uploaded to the folder where you are currently in."
715
+ msgstr ""
716
+ "Die Datei wird in den Ordner hochgeladen, in dem du dich gerade befindest."
717
+
718
+ #: inc/view/Lang.php:1
719
+ msgid "Are you sure?"
720
+ msgstr "Bist du sicher?"
721
+
722
+ #: inc/view/Lang.php:1
723
+ msgid "Success"
724
+ msgstr "Erfolgreich"
725
+
726
+ #: inc/view/Lang.php:1
727
+ msgid "Failed"
728
+ msgstr "Fehlgeschlagen"
729
+
730
+ #: inc/view/Lang.php:1
731
+ msgid "No entries found"
732
+ msgstr "Keine Einträge gefunden"
733
+
734
+ #: inc/view/Lang.php:1
735
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
736
+ msgstr ""
737
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
738
+ "verschoben."
739
+
740
+ #: inc/view/Lang.php:1
741
+ msgid ""
742
+ "Are you sure to delete *{count} folders*? All files gets moved to "
743
+ "Unorganized."
744
+ msgstr ""
745
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
746
+ "verschoben."
747
+
748
+ #: inc/view/Lang.php:1
749
+ msgid "Ok"
750
+ msgstr "Ok"
751
+
752
+ #: inc/view/Lang.php:1
753
+ msgid "Cancel"
754
+ msgstr "Abbrechen"
755
+
756
+ #: inc/view/Lang.php:1
757
+ msgid "Save"
758
+ msgstr "Speichern"
759
+
760
+ #: inc/view/Lang.php:1
761
+ msgid "Back"
762
+ msgstr "Zurück"
763
+
764
+ #: inc/view/Lang.php:1
765
+ msgid "No folders found"
766
+ msgstr "Keine Ordner gefunden"
767
+
768
+ #: inc/view/Lang.php:1
769
+ msgid ""
770
+ "No folders have been created yet. Just click on the button above to create "
771
+ "your first folder."
772
+ msgstr ""
773
+ "Bisher wurden keine Ordner angelegt. Klicke auf den obigen Button, um deinen "
774
+ "ersten Ordner zu erstellen."
775
+
776
+ #: inc/view/Lang.php:1
777
+ msgid "Folders"
778
+ msgstr "Ordner"
779
+
780
+ #: inc/view/Lang.php:1
781
+ msgid "No search results."
782
+ msgstr "Keine Suchergebnisse."
783
+
784
+ #: inc/view/Lang.php:1
785
+ msgid "Renaming to *{name}*…"
786
+ msgstr "Umbenennen in *{name}*…"
787
+
788
+ #: inc/view/Lang.php:1
789
+ msgid "Successfully renamed folder to *{name}*"
790
+ msgstr "Ordner erfolgreich in *{name}* umbenannt"
791
+
792
+ #: inc/view/Lang.php:1
793
+ msgid "Creating *{name}*…"
794
+ msgstr "Erstelle *{name}*…"
795
+
796
+ #: inc/view/Lang.php:1
797
+ msgid "Successfully created *{name}*"
798
+ msgstr "Erfolgreich *{name}* erstellt"
799
+
800
+ #: inc/view/Lang.php:1
801
+ msgid "Deleting *{name}*…"
802
+ msgstr "Löschen von *{name}*…"
803
+
804
+ #: inc/view/Lang.php:1
805
+ msgid "Successfully deleted *{name}*"
806
+ msgstr "Erfolgreich *{name}* gelöscht"
807
+
808
+ #: inc/view/Lang.php:1
809
+ msgid "Successfully deleted *{count} folders*"
810
+ msgstr "*{count} Order* erfolgreich geschlöscht"
811
+
812
+ #: inc/view/Lang.php:1
813
+ msgid "Rearrange *{name}* placement manually"
814
+ msgstr "Ordne *{name}* manuell an"
815
+
816
+ #: inc/view/Lang.php:1
817
+ msgid "Reordering the tree hierarchy…"
818
+ msgstr "Der Baum wird neu angeordnet…"
819
+
820
+ #: inc/view/Lang.php:1
821
+ msgid "Successfully sorted the tree hierarchy"
822
+ msgstr "Der Baum wurde erfolgreich neu angeordnet"
823
+
824
+ #: inc/view/Lang.php:1
825
+ msgid "Reorder subfolders of *{name}*…"
826
+ msgstr "Unterordner von *{name}* werden neu angeordnet…"
827
+
828
+ #: inc/view/Lang.php:1
829
+ msgid "{count} files remaining…"
830
+ msgstr "{count} Dateien verbleibend…"
831
+
832
+ #: inc/view/Lang.php:1
833
+ msgid "Receiving data…"
834
+ msgstr "Empfange Daten…"
835
+
836
+ #: inc/view/Lang.php:1
837
+ msgid "Shortcut"
838
+ msgstr "Verknüpfung"
839
+
840
+ #: inc/view/Lang.php:1
841
+ msgid ""
842
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
843
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
844
+ "do this in the original file (for example replace media file through a "
845
+ "plugin).\n"
846
+ "Note also that the fields in the shortcuts can be different to the original "
847
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
848
+ msgstr ""
849
+ "Dies ist eine Datei-Verknüpfung. Verknüpfungen brauchen keinen physischen "
850
+ "Speicherplatz *(0 kB)*. Wenn du die Datei selbst bearbeiten möchtest, musst "
851
+ "du das für die Original-Datei tun (Beispiel: Ersetzen der Datei durch ein "
852
+ "Plugin).\n"
853
+ "Beachte auch, dass Felder wie der Titel und Beschreibung unterschiedlich zur "
854
+ "Original-Datei sein können."
855
+
856
+ #: inc/view/Lang.php:1
857
+ msgid ""
858
+ "In the current view of uploads, filters are active. Please reset them and "
859
+ "refresh the view."
860
+ msgstr ""
861
+ "Im Moment sind Filter aktiv. Bitte setze diese zurück und aktualisiere die "
862
+ "Ansicht."
863
+
864
+ #: inc/view/Lang.php:1
865
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
866
+ msgstr ""
867
+ "Eine Kollektion darf keine Dateien enthalten. Datei wird nach Unorganisiert "
868
+ "verschoben…"
869
+
870
+ #: inc/view/Lang.php:1
871
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
872
+ msgstr ""
873
+ "Eine Galerie darf nur Bilder enthalten. Datei wird nach Unorganisiert "
874
+ "verschoben…"
875
+
876
+ #: inc/view/Lang.php:1
877
+ msgid "Order content by *{name}*…"
878
+ msgstr "Ordne Inhalt nach *{name}*…"
879
+
880
+ #: inc/view/Lang.php:1
881
+ msgid "Order content by drag & drop"
882
+ msgstr "Ordne Inhalte per Drag&Drop"
883
+
884
+ #: inc/view/Lang.php:1
885
+ msgid "Reset order"
886
+ msgstr "Reihenfolge zurücksetzen"
887
+
888
+ #: inc/view/Lang.php:1
889
+ msgid "Apply order once…"
890
+ msgstr "Einmalige Sortierung anwenden…"
891
+
892
+ #: inc/view/Lang.php:1
893
+ msgid "Last"
894
+ msgstr "zuletzt"
895
+
896
+ #: inc/view/Lang.php:1
897
+ msgid "Deactivate automatic ordering"
898
+ msgstr "Deaktiviere automatische Sortierung"
899
+
900
+ #: inc/view/Lang.php:1
901
+ msgid "Apply automatic order…"
902
+ msgstr "Automatische Sortierung anwenden…"
903
+
904
+ #: inc/view/Lang.php:1
905
+ msgid "Latest"
906
+ msgstr "Aktuell"
907
+
908
+ #: inc/view/Lang.php:1
909
+ msgid "Reindex order"
910
+ msgstr "Reihenfolge reparieren"
911
+
912
+ #: inc/view/Lang.php:1
913
+ msgid "Reset to last order"
914
+ msgstr "Letzte Reihenfolge wiederherstellen"
915
+
916
+ #: inc/view/Lang.php:1
917
+ msgid "All files"
918
+ msgstr "Alle Dateien"
919
+
920
+ #: inc/view/Lang.php:1
921
+ msgid "Move {count} files"
922
+ msgstr "Verschiebe {count} Dateien"
923
+
924
+ #: inc/view/Lang.php:1
925
+ msgid "Move one file"
926
+ msgstr "Verschiebe Datei"
927
+
928
+ #: inc/view/Lang.php:1
929
+ msgid "Copy {count} files"
930
+ msgstr "Kopiere {count} Dateien"
931
+
932
+ #: inc/view/Lang.php:1
933
+ msgid "Copy one file"
934
+ msgstr "Kopiere Datei"
935
+
936
+ #: inc/view/Lang.php:1
937
+ msgid "Moving {count} files…"
938
+ msgstr "{count} Dateien verschieben…"
939
+
940
+ #: inc/view/Lang.php:1
941
+ msgid "Moving one file…"
942
+ msgstr "Datei verschieben…"
943
+
944
+ #: inc/view/Lang.php:1
945
+ msgid "Copying {count} files…"
946
+ msgstr "{count} Dateien kopieren…"
947
+
948
+ #: inc/view/Lang.php:1
949
+ msgid "Copying one file…"
950
+ msgstr "Datei kopieren…"
951
+
952
+ #: inc/view/Lang.php:1
953
+ msgid "Successfully moved {count} files"
954
+ msgstr "{count} Dateien erfolgreich verschoben"
955
+
956
+ #: inc/view/Lang.php:1
957
+ msgid "Successfully moved one file"
958
+ msgstr "Datei erfolgreich verschoben"
959
+
960
+ #: inc/view/Lang.php:1
961
+ msgid "Successfully copied {count} files"
962
+ msgstr "{count} Dateien erfolgreich kopiert"
963
+
964
+ #: inc/view/Lang.php:1
965
+ msgid "Successfully copied one file"
966
+ msgstr "Datei erfolgreich kopiert"
967
+
968
+ #: inc/view/Lang.php:1
969
+ msgid "Hold any key to create a shortcut"
970
+ msgstr "Eine Taste festhalten, um Datei zu kopieren"
971
+
972
+ #: inc/view/Lang.php:1
973
+ msgid "Release key to move file"
974
+ msgstr "Taste loslassen, um Datei zu verschieben"
975
+
976
+ #: inc/view/Lang.php:1
977
+ msgid "Click this to create a new folder"
978
+ msgstr "Klicke hier, um einen neuen Ordner anzulegen"
979
+
980
+ #: inc/view/Lang.php:1
981
+ msgid ""
982
+ "A folder can contain any file type and collection, but not galleries. If you "
983
+ "want to create a subfolder, select a folder and click this button."
984
+ msgstr ""
985
+ "Ein Ordner kann jeden Dateitypen und Kollektionen enthalten, jedoch keine "
986
+ "Galerien. Wenn du einen Unterordner erstellen möchtest, selektiere einen "
987
+ "Ordner und klicke diesen Button."
988
+
989
+ #: inc/view/Lang.php:1
990
+ msgid "Click this to create a new collection"
991
+ msgstr "Klicke hier, um eine neue Kollektion anzulegen"
992
+
993
+ #: inc/view/Lang.php:1
994
+ msgid ""
995
+ "A collection cannot contain files. However, you can create additional "
996
+ "collections and *galleries* there. This gallery is only a *gallery data "
997
+ "folder*, i.e. they are not automatically visible on the website.\n"
998
+ "\n"
999
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
1000
+ "on your pages/postings."
1001
+ msgstr ""
1002
+ "Eine Kollektion kann keine Dateien enthalten. Dort können jedoch weitere "
1003
+ "Kollektionen und *Galerien* angelegt werden. Diese Galerie ist nur ein "
1004
+ "*Galerie-Daten-Ordner*, d. h. diese sind nicht automatisch auf der Webseite "
1005
+ "zu sehen.\n"
1006
+ "\n"
1007
+ "Eine *visuelle Galerie* kann durch einen Shortcode im Visual Editor auf "
1008
+ "deinen Seiten/Beiträgen erstellt werden."
1009
+
1010
+ #: inc/view/Lang.php:1
1011
+ msgid "Click this to create a *new gallery data folder*"
1012
+ msgstr "Klicke hier, um einen neuen *Galerie-Daten-Ordner* anzulegen"
1013
+
1014
+ #: inc/view/Lang.php:1
1015
+ msgid ""
1016
+ "A *gallery data folder* can only contain images. It is easier for you to "
1017
+ "distinguish where your visual galleries are located.\n"
1018
+ "\n"
1019
+ "You can also order the images into *a custom image order* per drag&drop."
1020
+ msgstr ""
1021
+ "Ein *Galerie-Daten-Ordner* kann nur Bilder enthalten - für dich ist es dann "
1022
+ "einfach zu entscheiden, wo deine visuellen Galerien liegen.\n"
1023
+ "\n"
1024
+ "Sie können per Drag & Drop eine *benutzerdefinierte Reihenfolge* erstellen."
1025
+
1026
+ #: inc/view/Lang.php:1
1027
+ msgid "Settings"
1028
+ msgstr "Einstellungen"
1029
+
1030
+ #: inc/view/Lang.php:1
1031
+ msgid "General settings for the current logged in user."
1032
+ msgstr "Allgemeine Einstellungen für den eingeloggten Benutzer."
1033
+
1034
+ #: inc/view/Lang.php:1
1035
+ msgid "Permissions"
1036
+ msgstr "Berechtigungen"
1037
+
1038
+ #: inc/view/Lang.php:1
1039
+ msgid "Reorder files in this folder"
1040
+ msgstr "Dateien sortieren"
1041
+
1042
+ #: inc/view/Lang.php:1
1043
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1044
+ msgstr "Ordne die Dateien / Bilder nach *Titel, Dateiname, ID, …*"
1045
+
1046
+ #: inc/view/Lang.php:1
1047
+ msgid "Refresh"
1048
+ msgstr "Neuladen"
1049
+
1050
+ #: inc/view/Lang.php:1
1051
+ msgid "Refreshes the current folder view."
1052
+ msgstr "Aktualisiert die aktuelle Ordneransicht."
1053
+
1054
+ #: inc/view/Lang.php:1
1055
+ msgid "Rename"
1056
+ msgstr "Umbenennen"
1057
+
1058
+ #: inc/view/Lang.php:1
1059
+ msgid "Rename the current selected folder."
1060
+ msgstr "Den aktuell ausgewählten Ordner umbenennen."
1061
+
1062
+ #: inc/view/Lang.php:1
1063
+ msgid "Delete"
1064
+ msgstr "Löschen"
1065
+
1066
+ #: inc/view/Lang.php:1
1067
+ msgid "Delete the current selected folder."
1068
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1069
+
1070
+ #: inc/view/Lang.php:1
1071
+ msgid "Delete the current selected folders."
1072
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1073
+
1074
+ #: inc/view/Lang.php:1
1075
+ msgid "Rearrange"
1076
+ msgstr "Neu anordnen"
1077
+
1078
+ #: inc/view/Lang.php:1
1079
+ msgid "Change the hierarchical order of the folders."
1080
+ msgstr "Ändern der hierarchischen Anordnung der Ordner."
1081
+
1082
+ #: inc/view/Lang.php:1
1083
+ msgid "Folder details"
1084
+ msgstr "Ordner Details"
1085
+
1086
+ #: inc/view/Lang.php:1
1087
+ msgid "Select a folder and view more details about it."
1088
+ msgstr "Selektiere einen Ordner, um mehr Details anzuzeigen."
1089
+
1090
+ #: inc/view/Lang.php:1
1091
+ msgid "Product license not yet activated."
1092
+ msgstr "Produkt-Lizenz noch nicht aktiviert."
1093
+
1094
+ #: inc/view/Lang.php:1
1095
+ msgid "Enter license"
1096
+ msgstr "Lizenzschlüssel eingeben"
1097
+
1098
+ #: inc/view/Lang.php:1
1099
+ msgid "Dismiss notice"
1100
+ msgstr "Meldung ausblenden"
1101
+
1102
+ #: inc/view/Lang.php:1
1103
+ msgid ""
1104
+ "It looks like you have already used another plugin for folders in the media "
1105
+ "library."
1106
+ msgstr ""
1107
+ "Es scheint, als hättest Du zuvor ein anderes Plugin zur "
1108
+ "Medienkategorisierung verwendet."
1109
+
1110
+ #: inc/view/Lang.php:1
1111
+ msgid "Start importing"
1112
+ msgstr "Import starten"
1113
+
1114
+ #: inc/view/Lang.php:1
1115
+ msgid "Dismiss"
1116
+ msgstr "Ausblenden"
1117
+
1118
+ #: inc/view/Lang.php:1
1119
+ msgid ""
1120
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1121
+ "do not change when you move the file. Learn more about <a href=\"https://"
1122
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1123
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1124
+ "files to physical folders.</a>"
1125
+ msgstr ""
1126
+ "Real Media Library erstellt eine virtuelle Ordnerstruktur. Die URLs der "
1127
+ "Uploads ändern sich nicht, wenn du die Datei verschiebst. Erfahre mehr "
1128
+ "darüber, wie du <a href=\"https://devowl.io/knowledge-base/how-can-i-"
1129
+ "physically-reflect-the-virtual-folder-structure-to-my-file-system/\" target="
1130
+ "\"_blank\">Dateien automatisch in physische Ordner verschieben kannst.</a>"
1131
+
1132
+ #: inc/view/Lang.php:1
1133
+ msgid ""
1134
+ "You will be redirected to the external website of PRO version. Please "
1135
+ "confirm to continue!"
1136
+ msgstr ""
1137
+ "Sie werden auf die externe Website der PRO-Version weitergeleitet. Bitte "
1138
+ "bestätige die Fortsetzung!"
1139
+
1140
+ #: inc/view/Lang.php:1
1141
+ msgid "PRO Feature"
1142
+ msgstr "PRO Feature"
1143
+
1144
+ #: inc/view/Lang.php:1
1145
+ msgid "Hide for 20 days"
1146
+ msgstr "20 Tage verstecken"
1147
+
1148
+ #: inc/view/Lang.php:1
1149
+ msgid "Thanks for using the free version of Real Media Library."
1150
+ msgstr ""
1151
+ "Vielen Dank für die Nutzung der kostenlosen Version von Real Media Library."
1152
+
1153
+ #: inc/view/Lang.php:1
1154
+ msgid "Get PRO!"
1155
+ msgstr "Hole dir PRO!"
1156
+
1157
+ #: inc/view/Lang.php:1
1158
+ msgid "I want to learn more!"
1159
+ msgstr "Ich will mehr erfahren!"
1160
+
1161
+ #: inc/view/Lang.php:1
1162
+ msgid "No, not interested…"
1163
+ msgstr "Nein, kein Interesse…"
1164
+
1165
+ #: inc/view/Lang.php:1
1166
+ msgid "You like collections?"
1167
+ msgstr "Magst Du Kollektionen?"
1168
+
1169
+ #: inc/view/Lang.php:1
1170
+ msgid ""
1171
+ "Get more organized with different types of folders: Collections and "
1172
+ "galleries help you to easily recognize where your image galleries are "
1173
+ "located."
1174
+ msgstr ""
1175
+ "Sorgen für mehr Ordnung mit verschiedenen Arten von Ordnern: Sammlungen und "
1176
+ "Galerien helfen dir leicht zu erkennen, wo sich deine Bildergalerien "
1177
+ "befinden."
1178
+
1179
+ #: inc/view/Lang.php:1
1180
+ msgid "Custom content order?"
1181
+ msgstr "Dateien sortieren?"
1182
+
1183
+ #: inc/view/Lang.php:1
1184
+ msgid ""
1185
+ "Get your folder contents in order and arrange your files according to a "
1186
+ "criterion (e.g. name descending) or by drag & drop."
1187
+ msgstr ""
1188
+ "Bringen Ordnung in deinen Ordnerinhalt und ordne deine Dateien nach einem "
1189
+ "Kriterium (z.B. Name absteigend) oder per Drag & Drop an."
1190
+
1191
+ #: inc/view/Lang.php:1
1192
+ msgid "Full order control?"
1193
+ msgstr "Volle Kontrolle über die Sortierung?"
1194
+
1195
+ #: inc/view/Lang.php:1
1196
+ msgid ""
1197
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1198
+ "name descending) or by drag & drop."
1199
+ msgstr ""
1200
+ "Organisiere die Knoten innerhalb deines Ordnerbaums nach einem Kriterium (z."
1201
+ "B. Name absteigend) oder per Drag & Drop an."
1202
+
1203
+ #: inc/view/Lang.php:1
1204
+ msgid "Want to create subfolders?"
1205
+ msgstr "Unterordner erstellen?"
1206
+
1207
+ #: inc/view/Lang.php:1
1208
+ msgid ""
1209
+ "Subfolders offer you the possibility to bring more structure into your media "
1210
+ "library. They help you to keep the overview, even if you really have many "
1211
+ "files in your media library."
1212
+ msgstr ""
1213
+ "Unterordner bieten dir die Möglichkeit, mehr Struktur in deine "
1214
+ "Medienbibliothek zu bringen. Sie helfen dir, den Überblick zu behalten, auch "
1215
+ "wenn du wirklich viele Dateien in deiner Mediathek hast."
1216
+
1217
+ #: inc/view/Lang.php:1
1218
+ msgid "Want to switch between folders more comfortably?"
1219
+ msgstr "Komfortabler zwischen den Ordnern wechseln?"
1220
+
1221
+ #: inc/view/Lang.php:1
1222
+ msgid ""
1223
+ "Let the complete folder tree as in your media library also be displayed in "
1224
+ "this dialog instead of searching each time in the dropdown. It is simply "
1225
+ "more comfortable!"
1226
+ msgstr ""
1227
+ "Lass dir den kompletten Ordnerbaum wie in deiner Medienbibliothek auch in "
1228
+ "diesem Dialog anzeigen, anstatt jedes Mal im Dropdown zu suchen. Das ist "
1229
+ "einfach komfortabler!"
1230
+
1231
+ #: inc/view/Lang.php:1
1232
+ msgid "Want to upload entire folders?"
1233
+ msgstr "Möchtest du ganze Ordner hochladen?"
1234
+
1235
+ #: inc/view/Lang.php:1
1236
+ msgid ""
1237
+ "With Real Media Library you can upload entire folders using drag and drop. "
1238
+ "All folders, subfolders and files will be uploaded and displayed in your "
1239
+ "media library in the same structure. Get PRO to upload folders!"
1240
+ msgstr ""
1241
+ "Mit Real Media Library kannst du ganze Ordner per Drag & Drop hochladen. "
1242
+ "Alle Ordner, Unterordner und Dateien werden hochgeladen und in deiner "
1243
+ "Medienbibliothek in der gleichen Struktur angezeigt. Hol dir PRO zum "
1244
+ "Hochladen von Ordnern!"
1245
+
1246
+ #: inc/view/Options.php:1
1247
+ msgid "RealMediaLibrary:General"
1248
+ msgstr "RealMediaLibrary:Allgemein"
1249
+
1250
+ #: inc/view/Options.php:1
1251
+ msgid "Load RML functionality in frontend"
1252
+ msgstr "Lade RML-Funktionalitäten im Frontend"
1253
+
1254
+ #: inc/view/Options.php:1
1255
+ msgid "RealMediaLibrary:Reset"
1256
+ msgstr "RealMediaLibrary:Zurücksetzen"
1257
+
1258
+ #: inc/view/Options.php:1
1259
+ msgid "Reset the order of all galleries"
1260
+ msgstr "Die Reihenfolge aller Galerien zurücksetzen"
1261
+
1262
+ #: inc/view/Options.php:1
1263
+ msgid "Wipe all settings (folders, attachment relations)"
1264
+ msgstr ""
1265
+ "Alle Einstellungen zurücksetzen (Ordner, Medien-Beziehungen zu den Ordnern)"
1266
+
1267
+ #: inc/view/Options.php:1
1268
+ msgid "Reset folder count cache"
1269
+ msgstr "Ordneranzahl-Cache zurücksetzen"
1270
+
1271
+ #: inc/view/Options.php:1
1272
+ msgid "Reset names, slugs and absolute pathes"
1273
+ msgstr "Namen, Slugs und absolute Pfade zurücksetzen"
1274
+
1275
+ #: inc/view/Options.php:1
1276
+ msgid "Wipe attachment relations"
1277
+ msgstr "Setze Medien-Beziehungen zurück"
1278
+
1279
+ #: inc/view/Options.php:1
1280
+ msgid "Wipe all"
1281
+ msgstr "Setze alles zurück"
1282
+
1283
+ #: inc/view/Options.php:1
1284
+ msgid "Reset count"
1285
+ msgstr "Anzahl zurücksetzen"
1286
+
1287
+ #: inc/view/Options.php:1
1288
+ msgid "Reset"
1289
+ msgstr "Zurücksetzen"
1290
+
1291
+ #: inc/view/Options.php:1
1292
+ msgid ""
1293
+ "Activate this option if you are using a page builder like Divi Page Builder, "
1294
+ "WPBakery Page Builder or Elementor."
1295
+ msgstr ""
1296
+ "Aktiviere diese Option, wenn du einen Page Builder wie Divi Page Builder, "
1297
+ "WPBakery Page Builder oder Elementor verwendest."
1298
+
1299
+ #: inc/view/Options.php:1
1300
+ msgid "You can also reset an single folder in its folder details."
1301
+ msgstr "Du kannst auch einen einzelnen Ordner zurücksetzen."
1302
+
1303
+ #: inc/view/View.php:1
1304
+ msgid "All"
1305
+ msgstr "Alles"
1306
+
1307
+ #: inc/view/View.php:1
1308
+ msgid "Unorganized pictures"
1309
+ msgstr "Unorganisierte Bilder"
languages/real-media-library-de_CH_informal.mo ADDED
Binary file
languages/real-media-library-de_CH_informal.po ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
4
+ "POT-Creation-Date: n/a\n"
5
+ "PO-Revision-Date: 2021-10-12 08:40+0000\n"
6
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
7
+ "Language-Team: German <https://translate.devowl.io/projects/wordpress-real-"
8
+ "media-library-backend-php/develop/de/>\n"
9
+ "Language: de_CH_informal\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: Weblate 4.8\n"
15
+
16
+ #. Plugin Name of the plugin
17
+ msgid "Real Media Library"
18
+ msgstr "Real Media Library"
19
+
20
+ #. Plugin URI of the plugin
21
+ msgid "https://devowl.io/wordpress-real-media-library/"
22
+ msgstr "https://devowl.io/de/wordpress-real-media-library/"
23
+
24
+ #. Description of the plugin
25
+ msgid ""
26
+ "Organize uploaded media in folders, collections and galleries: A file "
27
+ "manager for WordPress. Media management made easy!"
28
+ msgstr ""
29
+ "Organisiere hochgeladene Medien in Ordnern, Sammlungen und Galerien: Ein "
30
+ "Dateimanager für WordPress. Medienmanagement leicht gemacht!"
31
+
32
+ #. Author of the plugin
33
+ msgid "devowl.io"
34
+ msgstr "devowl.io"
35
+
36
+ #. Author URI of the plugin
37
+ msgid "https://devowl.io"
38
+ msgstr "https://devowl.io/de/"
39
+
40
+ #: inc/AdInitiator.php:1
41
+ msgid "Complete file and folder manager"
42
+ msgstr "Vollständiger Datei- und Ordnermanager"
43
+
44
+ #: inc/AdInitiator.php:1
45
+ msgid ""
46
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
47
+ "media management. You can use this plugin to organize the thousands of "
48
+ "images, audio, video and PDF files in your media library into folders. "
49
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
50
+ "WordPress."
51
+ msgstr ""
52
+ "Real Media Library ist ein WordPress-Plugin, das dir eine erweiterte "
53
+ "Medienverwaltung ermöglicht. Mit diesem Plugin kannst du die tausende "
54
+ "Bilder, Audio-, Video- und PDF-Dateien in Ihrer Medienbibliothek in Ordnern "
55
+ "organisieren. Im Grunde ist es ein Dateimanager wie Windows Explorer oder "
56
+ "Mac Finder, aber für WordPress."
57
+
58
+ #: inc/AdInitiator.php:1
59
+ msgid "Filter in insert media dialog"
60
+ msgstr "Filter im Dialog “Medien einfügen”"
61
+
62
+ #: inc/AdInitiator.php:1
63
+ msgid ""
64
+ "No matter where you are, the folder structure of Real Media Library is "
65
+ "always where you can select files. For example in the dialog for selecting a "
66
+ "\"Featured Image\"."
67
+ msgstr ""
68
+ "Egal, wo du dich befindest, die Ordnerstruktur von Real Media Library ist "
69
+ "immer dort, wo du Dateien auswählen kannst. Zum Beispiel im Dialog zur "
70
+ "Auswahl eines “Beitragsbild”."
71
+
72
+ #: inc/AdInitiator.php:1
73
+ msgid ""
74
+ "In the Lite version you can only select the folder by a simple dropdown."
75
+ msgstr ""
76
+ "In der Lite Version kannst du den Ordner nur über ein einfaches Dropdown "
77
+ "auswählen."
78
+
79
+ #: inc/AdInitiator.php:1
80
+ msgid "Custom image order"
81
+ msgstr "Benutzerdefinierte Bildreihenfolge"
82
+
83
+ #: inc/AdInitiator.php:1
84
+ msgid ""
85
+ "Organizing your media files is really easy with the Real Media Library "
86
+ "plugin. You can arrange the order of your files yourself by dragging and "
87
+ "dropping. This allows you to move important files to the top for faster "
88
+ "access."
89
+ msgstr ""
90
+ "Die Organisation deiner Mediendateien ist mit dem Real Media Library Plugin "
91
+ "wirklich einfach. Du kannst die Reihenfolge deiner Dateien selbst durch Drag "
92
+ "& Drop festlegen. Dadurch kannst du wichtige Dateien für einen schnelleren "
93
+ "Zugriff an den Anfang verschieben."
94
+
95
+ #: inc/AdInitiator.php:1
96
+ msgid "Get your PRO license now!"
97
+ msgstr "Holen dir jetzt deine PRO-Lizenz!"
98
+
99
+ #: inc/api/attachment.php:1
100
+ msgid "The given folder was not found."
101
+ msgstr "Der angegebene Ordner wurde nicht gefunden."
102
+
103
+ #: inc/Assets.php:1
104
+ msgid "Complementary Plugins"
105
+ msgstr "Erweiterungen"
106
+
107
+ #: inc/Assets.php:1
108
+ msgid ""
109
+ "\n"
110
+ "\n"
111
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
112
+ "deleted.\n"
113
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
114
+ "deleted, too."
115
+ msgstr ""
116
+ "\n"
117
+ "\n"
118
+ "Beachte: Wenn du eine Verknüpfung löscht, wird die Originaldatei nicht "
119
+ "gelöscht.\n"
120
+ "Wenn du eine normale Datei löscht, werden alle dazugehörigen Verknüpfungen "
121
+ "auch gelöscht."
122
+
123
+ #: inc/attachment/CustomField.php:1
124
+ msgid ""
125
+ "If you move this shortcut, the location of the source/main file is not "
126
+ "changed."
127
+ msgstr ""
128
+ "Wenn du diese Verknüpfung verschiebst, wird der Ordner der Originaldatei "
129
+ "nicht verändert."
130
+
131
+ #: inc/attachment/CustomField.php:1
132
+ msgid ""
133
+ "If you move this attachment, the folder location of the associated shortcuts "
134
+ "are not changed."
135
+ msgstr ""
136
+ "Wenn du diese Datei verschiebst, werden die Ordner der dazugehörigen "
137
+ "Verknüpfungen nicht verändert."
138
+
139
+ #: inc/attachment/CustomField.php:1
140
+ msgid "Move to another folder"
141
+ msgstr "Verschiebe Datei in anderen Ordner"
142
+
143
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
144
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
145
+ msgid "Folder"
146
+ msgstr "Ordner"
147
+
148
+ #: inc/attachment/CustomField.php:1
149
+ msgid "Shortcut infos"
150
+ msgstr "Verknüpfung"
151
+
152
+ #: inc/attachment/CustomField.php:1
153
+ msgid ""
154
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
155
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
156
+ "itself, you must do this in the original file (for example replace media "
157
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
158
+ "be different to the original file, for example \"Title\", \"Description\" or "
159
+ "\"Caption\"."
160
+ msgstr ""
161
+ "Dies ist eine Verknüpfung. Verknüpfungen brauchen keinen physikalischen "
162
+ "Speicherplatz <strong>(0 kB)</strong>. Wenn du die Datei selbst ändern "
163
+ "möchten, verändere die Originaldatei (bspw. Ersetzen der Datei durch ein "
164
+ "Plugin).<br/>Beachten auch, dass die Felder in der Verknüpfung "
165
+ "unterschiedlich zur Originaldatei sein können, zum Beispiel “Titel”, "
166
+ "“Beschreibung”."
167
+
168
+ #. translators:
169
+ #: inc/attachment/CustomField.php:1
170
+ msgid "For this file is %d shortcut available in the following folder:"
171
+ msgid_plural ""
172
+ "For this file are %d shortcuts available in the following folders:"
173
+ msgstr[0] "Für diese Datei gibt es eine Verknüpfung im folgenden Ordner:"
174
+ msgstr[1] ""
175
+ "Für diese Datei sind %s Verknüpfungen verfügbar in folgenden Ordnern:"
176
+
177
+ #: inc/attachment/CustomField.php:1
178
+ msgid ""
179
+ "This file has no associated shortcuts. You can create shortcuts by moving "
180
+ "files per mouse and hold any key."
181
+ msgstr ""
182
+ "Die Datei hat keine zugehörige Verknüpfung. Du kannst Verknüpfung erstellen, "
183
+ "indem du per Drag&Drop die Datei bewegst und eine beliebige Taste hältst."
184
+
185
+ #: inc/attachment/Permissions.php:1
186
+ msgid "You are not allowed to insert files here."
187
+ msgstr "Du hast keine Berechtigung, hier neue Dateien hinzuzufügen."
188
+
189
+ #: inc/attachment/Permissions.php:1
190
+ msgid "You are not allowed to move the file."
191
+ msgstr "Du hast keine Berechtigung, die Datei zu verschieben."
192
+
193
+ #: inc/attachment/Permissions.php:1
194
+ msgid "You are not allowed to create a subfolder here."
195
+ msgstr "Du hast keine Berechtigung hier Unterordner zu erstellen."
196
+
197
+ #: inc/attachment/Permissions.php:1
198
+ msgid "You are not allowed to delete this folder."
199
+ msgstr "Du hast keine Berechtigung den Ordner zu löschen."
200
+
201
+ #: inc/attachment/Permissions.php:1
202
+ msgid "You are not allowed to rename this folder."
203
+ msgstr "Du hast keine Berechtigung den Ordner umzubenennen."
204
+
205
+ #: inc/attachment/Upload.php:1
206
+ msgid "Select destination folder"
207
+ msgstr "Zielordner auswählen"
208
+
209
+ #: inc/attachment/Upload.php:1
210
+ msgid ""
211
+ "You can simply upload files directly to a folder. Select a folder and upload "
212
+ "files."
213
+ msgstr "Du kannst Dateien direkt in einen Ordner hochladen."
214
+
215
+ #: inc/attachment/Upload.php:1
216
+ msgid "upload to folder"
217
+ msgstr "in den Ordner hochladen"
218
+
219
+ #: inc/comp/ExImport.php:1
220
+ msgid "RealMediaLibrary:Import / Export"
221
+ msgstr "RealMediaLibrary:Import / Export"
222
+
223
+ #: inc/comp/ExImport.php:1
224
+ msgid "Import from other plugins"
225
+ msgstr "Von anderen Plugins importieren"
226
+
227
+ #: inc/comp/ExImport.php:1
228
+ msgid "Export / Import Real Media Library folders"
229
+ msgstr "Export / Image Real Media Library Ordner"
230
+
231
+ #: inc/comp/ExImport.php:1
232
+ msgid "Export"
233
+ msgstr "Exportieren"
234
+
235
+ #: inc/comp/ExImport.php:1
236
+ msgid "Import"
237
+ msgstr "Importieren"
238
+
239
+ #: inc/comp/ExImport.php:1
240
+ msgid ""
241
+ "All available folders will be exported. The current structure is not lost "
242
+ "during import - but check that there are no duplicate names in the import "
243
+ "data, as these are not checked."
244
+ msgstr ""
245
+ "Exportiert werden alle verfügbaren Ordner. Beim Import geht die aktuelle "
246
+ "Struktur nicht verloren - prüfe aber, dass bei den Import-Daten keine "
247
+ "doppelten Namen vorkommen, da diese nicht geprüft werden."
248
+
249
+ #: inc/comp/ExImport.php:1
250
+ msgid "Exported data:"
251
+ msgstr "Exportieren:"
252
+
253
+ #: inc/comp/ExImport.php:1
254
+ msgid "Import data:"
255
+ msgstr "Importieren:"
256
+
257
+ #: inc/comp/ExImport.php:1
258
+ msgid "Importing data is only available in PRO version."
259
+ msgstr "Das Importieren von Daten ist nur in der PRO-Version verfügbar."
260
+
261
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
262
+ #: inc/view/Lang.php:1
263
+ msgid "Learn more about PRO"
264
+ msgstr "Erfahre mehr über PRO"
265
+
266
+ #: inc/comp/ExImport.php:1
267
+ msgid "Imports categories and post relations."
268
+ msgstr "Importiert Kategorien und Beziehungen."
269
+
270
+ #: inc/comp/ExImport.php:1
271
+ msgid "Nothing to import."
272
+ msgstr "Nichts zu importieren."
273
+
274
+ #: inc/comp/ExImport.php:1
275
+ msgid ""
276
+ "Importing categories from another plugin is only available in PRO version."
277
+ msgstr ""
278
+ "Der Import von Kategorien aus einem anderen Plugin ist nur in der PRO-"
279
+ "Version verfügbar."
280
+
281
+ #: inc/comp/ExportMediaLibrary.php:1
282
+ msgid "No valid folder."
283
+ msgstr "Kein gültiger Ordner."
284
+
285
+ #: inc/comp/ExportMediaLibrary.php:1
286
+ msgid "No valid type."
287
+ msgstr "Kein gültiger Typ."
288
+
289
+ #: inc/comp/PolyLang.php:1
290
+ msgid "PolyLang: Automatically move translations"
291
+ msgstr "PolyLang: Automatisch Übersetzungen verschieben"
292
+
293
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
294
+ msgid ""
295
+ "If you move a file, the corresponding translated file will also be moved."
296
+ msgstr ""
297
+ "Wenn du eine Datei verschiebst, wird auch die dazugehörigen übersetzte Datei "
298
+ "verschoben."
299
+
300
+ #: inc/comp/WPML.php:1
301
+ msgid "WPML: Automatically move translations"
302
+ msgstr "WPML: Automatisch übersetzte Bilder in Ordner verschieben"
303
+
304
+ #. translators:
305
+ #: inc/exception/FolderAlreadyExistsException.php:1
306
+ msgid "'%s' already exists in this folder."
307
+ msgstr "'%s' existiert bereits in diesem Ordner."
308
+
309
+ #. translators:
310
+ #: inc/exception/OnlyInProVersionException.php:1
311
+ msgid "This functionality is not available in the free version (%s)."
312
+ msgstr ""
313
+ "Diese Funktionalität ist in der kostenlosen Version (%s) nicht verfügbar."
314
+
315
+ #: inc/folder/Creatable.php:1
316
+ msgid "You need to provide a set of files."
317
+ msgstr "Du musst mehrere Dateien bereitstellen."
318
+
319
+ #: inc/folder/Creatable.php:1
320
+ msgid "The folder could not be created in the database."
321
+ msgstr "Der Ordner konnte nicht in die Datenbank geschrieben werden."
322
+
323
+ #: inc/folder/Creatable.php:1
324
+ msgid "The folder could not be created because it already exists."
325
+ msgstr "Der Ordner konnte nicht erstellt werden, da er bereits existiert."
326
+
327
+ #: inc/folder/Creatable.php:1
328
+ msgid ""
329
+ "A folder can contain every type of file or a collection, but not gallery."
330
+ msgstr ""
331
+ "Ein Ordner kann alle Typen von Dateien enthalten oder eine Kollektion, aber "
332
+ "keine Galerie."
333
+
334
+ #. translators:
335
+ #: inc/folder/Creatable.php:1
336
+ msgid "'%s' is not a valid folder name."
337
+ msgstr "'%s' ist kein gültiger Ordnername."
338
+
339
+ #: inc/folder/Creatable.php:1
340
+ msgid "Order by name ascending"
341
+ msgstr "Sortiere nach Name aufsteigend"
342
+
343
+ #: inc/folder/Creatable.php:1
344
+ msgid "Order by name descending"
345
+ msgstr "Sortiere nach Name absteigend"
346
+
347
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
348
+ msgid "Order by ID ascending"
349
+ msgstr "Sortiere nach ID aufsteigend"
350
+
351
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
352
+ msgid "Order by ID descending"
353
+ msgstr "Sortiere nach ID absteigend"
354
+
355
+ #: inc/folder/CRUD.php:1
356
+ msgid "The given folder does not exist or you cannot rename this folder."
357
+ msgstr ""
358
+ "Der Ordner kann nicht gefunden werden oder du kannst diesen Ordner nicht "
359
+ "umbenennen."
360
+
361
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
362
+ msgid "The folder you try to delete has subfolders."
363
+ msgstr "Den Ordner, den du löschen möchtest, enthält Unterordner."
364
+
365
+ #: inc/folder/CRUD.php:1
366
+ msgid "The given folder does not exist."
367
+ msgstr "Der angegebene Ordner existiert nicht."
368
+
369
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
370
+ msgid "Unorganized"
371
+ msgstr "Unorganisiert"
372
+
373
+ #: inc/folder/Root.php:1
374
+ msgid ""
375
+ "Unorganized is the same as a root folder. Here you can find all files which "
376
+ "are not assigned to a folder."
377
+ msgstr ""
378
+ "Unorganisiert ist der Stamm-Ordner. Alle nicht zugewiesenen Dateien können "
379
+ "hier aufgefunden werden."
380
+
381
+ #: inc/metadata/CoverImage.php:1
382
+ msgid ""
383
+ "This option is disabled on this page. Please navigate to the media library."
384
+ msgstr ""
385
+ "Diese Option ist auf dieser Seite deaktiviert. Navigiere bitte zur "
386
+ "Medienbibliothek."
387
+
388
+ #: inc/metadata/CoverImage.php:1
389
+ msgid "Cover image"
390
+ msgstr "Vorschaubild"
391
+
392
+ #: inc/metadata/Description.php:1
393
+ msgid "Description"
394
+ msgstr "Beschreibung"
395
+
396
+ #: inc/metadata/Meta.php:1
397
+ msgid "Path"
398
+ msgstr "Pfad"
399
+
400
+ #: inc/metadata/Meta.php:1
401
+ msgid "Folder type"
402
+ msgstr "Ordnertyp"
403
+
404
+ #: inc/metadata/Meta.php:1
405
+ msgid "General"
406
+ msgstr "Allgemein"
407
+
408
+ #: inc/order/Sortable.php:1
409
+ msgid "Order by date ascending"
410
+ msgstr "Sortiere nach Datum aufsteigend"
411
+
412
+ #: inc/order/Sortable.php:1
413
+ msgid "Order by date descending"
414
+ msgstr "Sortiere nach Datum absteigend"
415
+
416
+ #: inc/order/Sortable.php:1
417
+ msgid "Order by title ascending"
418
+ msgstr "Sortiere nach Titel aufsteigend"
419
+
420
+ #: inc/order/Sortable.php:1
421
+ msgid "Order by title descending"
422
+ msgstr "Sortiere nach Titel absteigend"
423
+
424
+ #: inc/order/Sortable.php:1
425
+ msgid "Order by filename ascending"
426
+ msgstr "Sortiere nach Dateiname aufsteigend"
427
+
428
+ #: inc/order/Sortable.php:1
429
+ msgid "Order by filename descending"
430
+ msgstr "Sortiere nach Dateiname absteigend"
431
+
432
+ #: inc/order/Sortable.php:1
433
+ msgid "Natural order by filename ascending"
434
+ msgstr "Natürliche Ordnung nach Dateinamen aufsteigend"
435
+
436
+ #: inc/order/Sortable.php:1
437
+ msgid "Natural order by filename descending"
438
+ msgstr "Natürliche Ordnung nach Dateinamen absteigend"
439
+
440
+ #: inc/overrides/lite/folder/Creatable.php:1
441
+ #: inc/overrides/pro/folder/Creatable.php:1
442
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
443
+ msgid "Something went wrong."
444
+ msgstr "Etwas ist schiefgelaufen."
445
+
446
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
447
+ msgid "Folder not found."
448
+ msgstr "Ordner nicht gefunden."
449
+
450
+ #: inc/overrides/pro/Core.php:1
451
+ msgid ""
452
+ "<strong>You have not yet entered the license key</strong>. To receive "
453
+ "automatic updates, please enter the key in \"Enter license\"."
454
+ msgstr ""
455
+ "<strong>Der Lizenzschlüssel wurde noch nicht eingegeben</strong>. Um "
456
+ "automatische Updates zu erhalten klicke auf \"Enter license\"."
457
+
458
+ #: inc/overrides/pro/folder/Collection.php:1
459
+ msgid "A collection cannot contain files."
460
+ msgstr "Eine Kollektion kann keine Dateien enthalten."
461
+
462
+ #: inc/overrides/pro/folder/Collection.php:1
463
+ msgid "Collection"
464
+ msgstr "Kollektion"
465
+
466
+ #: inc/overrides/pro/folder/Collection.php:1
467
+ msgid ""
468
+ "A collection cannot contain files. But you can create other collections and "
469
+ "<strong> galleries</strong> there."
470
+ msgstr ""
471
+ "Eine Kollektion kann keine Dateien enthalten. Aber es können dort neue "
472
+ "Kollektionen und <strong>Galerien</strong> angelegt werden."
473
+
474
+ #. translators:
475
+ #: inc/overrides/pro/folder/Creatable.php:1
476
+ msgid "The parent %d does not exist."
477
+ msgstr "Das übergeordnete Ordner %d existiert nicht."
478
+
479
+ #: inc/overrides/pro/folder/Creatable.php:1
480
+ msgid "The given parent does not exist to set the parent for this folder."
481
+ msgstr "Der übergeordnete Ordner existiert nicht."
482
+
483
+ #: inc/overrides/pro/folder/Creatable.php:1
484
+ msgid "You are not allowed to change the parent for this folder."
485
+ msgstr ""
486
+ "Du hast keine Berechtigung den übergeordneten Ordner für diesen Ordner zu "
487
+ "ändern."
488
+
489
+ #: inc/overrides/pro/folder/Creatable.php:1
490
+ msgid "The given parent does not allow the folder type."
491
+ msgstr "Der übergeordnete Ordner erlaubt diesen Ordner-Typ nicht."
492
+
493
+ #: inc/overrides/pro/folder/Gallery.php:1
494
+ msgid "You can only move images to a gallery."
495
+ msgstr "Du kannst nur Bilder zu einer Galerie hinzufügen."
496
+
497
+ #: inc/overrides/pro/folder/Gallery.php:1
498
+ msgid "Gallery"
499
+ msgstr "Galerie"
500
+
501
+ #: inc/overrides/pro/folder/Gallery.php:1
502
+ msgid ""
503
+ "A gallery can only contain images. To view a gallery, go to a post and look "
504
+ "at the buttons of the visual editor.."
505
+ msgstr ""
506
+ "Eine Galerie kann nur Bilder enthalten. Um eine Galerie in einem Beitrag "
507
+ "anzuzeigen, werfe einen Blick auf den visuellen Editor."
508
+
509
+ #: inc/overrides/pro/order/Sortable.php:1
510
+ msgid "The given folder does not allow to reorder the files."
511
+ msgstr ""
512
+ "Der angegebene Ordner erlaubt es nicht Dateien benutzerdefiniert zu "
513
+ "sortieren."
514
+
515
+ #: inc/overrides/pro/order/Sortable.php:1
516
+ msgid "This folder has an automatic order. Please deactivate that first."
517
+ msgstr ""
518
+ "Dieser Ordner hat eine automatische Sortierung. Bitte deaktiviere diese erst."
519
+
520
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
521
+ msgid "Please select a folder to show items."
522
+ msgstr "Bitte wähle einen Ordner aus, um die Artikel anzuzeigen."
523
+
524
+ #: inc/rest/Attachment.php:1
525
+ msgid "Fetch only media in a folder by folder id."
526
+ msgstr "Lade nur Medien in einem Ordner nach Ordnerkennung."
527
+
528
+ #: inc/rest/Service.php:1
529
+ msgid "Forbidden"
530
+ msgstr "Verboten"
531
+
532
+ #: inc/rest/Service.php:1
533
+ msgid "Real Media Library is not active for the current user."
534
+ msgstr "Real Media Library ist für den aktuellen Benutzer nicht aktiviert."
535
+
536
+ #: inc/usersettings/AllFilesShortcuts.php:1
537
+ msgid "Hide shortcuts in \"All files\""
538
+ msgstr "Verknüpfungen in \"Alle Dateien\" ausblenden"
539
+
540
+ #: inc/usersettings/AllFilesShortcuts.php:1
541
+ msgid "The count always includes shortcuts"
542
+ msgstr "Die Anzahl ist immer inklusive Verknüpfungen"
543
+
544
+ #: inc/usersettings/DefaultFolder.php:1
545
+ msgid "Default startup folder"
546
+ msgstr "Standard Ordner beim Start"
547
+
548
+ #: inc/usersettings/DefaultFolder.php:1
549
+ msgid "No folder at startup"
550
+ msgstr "Keinen Ordner öffnen"
551
+
552
+ #: inc/usersettings/DefaultFolder.php:1
553
+ msgid "Last opened folder"
554
+ msgstr "Zuletzt geöffneter Ordner"
555
+
556
+ #: inc/usersettings/DefaultFolder.php:1
557
+ msgid ""
558
+ "Your media library can always open in the last opened folder or a folder you "
559
+ "choose. This saves you time every time you open the media library!"
560
+ msgstr ""
561
+ "Deine Mediathek kann sich immer im zuletzt geöffneten Ordner oder einem von "
562
+ "dir gewählten Ordner öffnen. So sparst du jedes Mal Zeit, wenn du die "
563
+ "Mediathek öffnest!"
564
+
565
+ #: inc/usersettings/InfiniteScrolling.php:1
566
+ msgid "Enable infinite scrolling in grid view"
567
+ msgstr "Automatisches Nachladen beim Scrollen in der Kachel-Ansicht aktivieren"
568
+
569
+ #: inc/usersettings/InfiniteScrolling.php:1
570
+ msgid ""
571
+ "Instead of displaying a \"Load More\" button, all files are loaded "
572
+ "automatically as you scroll down. This is not supported in list view."
573
+ msgstr ""
574
+ "Anstatt eine Schaltfläche \"Mehr laden\" anzuzeigen, werden alle Dateien "
575
+ "automatisch nachgeladen, wenn du nach unten scrollst. Dies wird in der "
576
+ "Listenansicht nicht unterstützt."
577
+
578
+ #: inc/view/FolderShortcode.php:1
579
+ msgid "Gallery from Media Folder"
580
+ msgstr "Galerie aus Medienordner"
581
+
582
+ #: inc/view/FolderShortcode.php:1
583
+ msgid ""
584
+ "Note: You can only select galleries. Folders and collections are grayed."
585
+ msgstr ""
586
+ "Beachte: Du kannst nur Galerien auswählen. Ordner und Kollektionen sind "
587
+ "ausgegraut."
588
+
589
+ #: inc/view/FolderShortcode.php:1
590
+ msgid "Link to"
591
+ msgstr "Link auf"
592
+
593
+ #: inc/view/FolderShortcode.php:1
594
+ msgid "Columns"
595
+ msgstr "Spalten"
596
+
597
+ #: inc/view/FolderShortcode.php:1
598
+ msgid "Random Order"
599
+ msgstr "Zufällige Anordnung"
600
+
601
+ #: inc/view/FolderShortcode.php:1
602
+ msgid "Size"
603
+ msgstr "Größe"
604
+
605
+ #: inc/view/FolderShortcode.php:1
606
+ msgid "Attachment File"
607
+ msgstr "Mediendatei"
608
+
609
+ #: inc/view/FolderShortcode.php:1
610
+ msgid "Media File"
611
+ msgstr "Mediendatei"
612
+
613
+ #: inc/view/FolderShortcode.php:1
614
+ msgid "None"
615
+ msgstr "Keine"
616
+
617
+ #: inc/view/FolderShortcode.php:1
618
+ msgid "Thumbnail"
619
+ msgstr "Thumbnail"
620
+
621
+ #: inc/view/FolderShortcode.php:1
622
+ msgid "Medium"
623
+ msgstr "Medium"
624
+
625
+ #: inc/view/FolderShortcode.php:1
626
+ msgid "Large"
627
+ msgstr "Groß"
628
+
629
+ #: inc/view/FolderShortcode.php:1
630
+ msgid "Full Size"
631
+ msgstr "Volle Größe"
632
+
633
+ #: inc/view/Lang.php:1
634
+ msgid ""
635
+ "Subfolders are only available in the PRO version. But you can now create an "
636
+ "unlimited number of folders on the main level (instead of the previous max. "
637
+ "10 folders)."
638
+ msgstr ""
639
+ "Unterordner sind nur in der PRO Version verfügbar. Aber du kannst jetzt eine "
640
+ "unbegrenzte Anzahl von Ordnern auf der Hauptebene erstellen (statt der "
641
+ "bisherigen max. 10 Ordner)."
642
+
643
+ #: inc/view/Lang.php:1
644
+ msgid "No folder selected"
645
+ msgstr "Kein Ordner ausgewählt"
646
+
647
+ #: inc/view/Lang.php:1
648
+ msgid "Select folder"
649
+ msgstr "Zielordner auswählen"
650
+
651
+ #: inc/view/Lang.php:1
652
+ msgid "Reload content"
653
+ msgstr "Inhalt neuladen"
654
+
655
+ #: inc/view/Lang.php:1
656
+ msgid "Subfolders"
657
+ msgstr "Unterordner"
658
+
659
+ #: inc/view/Lang.php:1
660
+ msgid "Please select a folder (media library) in the block settings."
661
+ msgstr "Bitte wähle einen Ordner in den Block-Einstellungen aus."
662
+
663
+ #: inc/view/Lang.php:1
664
+ msgid "New folders inherit this restriction"
665
+ msgstr "Neue Unterordner erben diese Einschränkung"
666
+
667
+ #: inc/view/Lang.php:1
668
+ msgid "The current selected folder has some restrictions:"
669
+ msgstr "Der aktuell ausgewählte Ordner besitzt Einschränkungen:"
670
+
671
+ #: inc/view/Lang.php:1
672
+ msgid "You cannot change *parent* folder"
673
+ msgstr "Der *übergeordnete* Ordner darf nicht geändert werden"
674
+
675
+ #: inc/view/Lang.php:1
676
+ msgid "You cannot *rearrange* subfolders"
677
+ msgstr "Unterordner dürfen nicht neu *angeordnet* werden"
678
+
679
+ #: inc/view/Lang.php:1
680
+ msgid "You cannot *create* subfolders"
681
+ msgstr "Keine *Unterordner* erlaubt"
682
+
683
+ #: inc/view/Lang.php:1
684
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
685
+ msgstr ""
686
+ "Du kannst keine neuen Dateien *einfügen*. Neue Dateien werden nach "
687
+ "Unorganisiert verschoben…"
688
+
689
+ #: inc/view/Lang.php:1
690
+ msgid "You cannot *rename* the folder"
691
+ msgstr "Der Ordner darf nicht *umbenannt* werden"
692
+
693
+ #: inc/view/Lang.php:1
694
+ msgid "You cannot *delete* the folder"
695
+ msgstr "Der Ordner darf nicht *gelöscht* werden"
696
+
697
+ #: inc/view/Lang.php:1
698
+ msgid "You cannot *move* files outside the folder"
699
+ msgstr "Enthaltene Dateien dürfen nicht *verschoben* werden"
700
+
701
+ #: inc/view/Lang.php:1
702
+ msgid "Parent"
703
+ msgstr "Übergeordnet"
704
+
705
+ #: inc/view/Lang.php:1
706
+ msgid "Before this node"
707
+ msgstr "Vor diesem Eintrag"
708
+
709
+ #: inc/view/Lang.php:1
710
+ msgid "If no next node is given, the element is placed at the end."
711
+ msgstr "Wenn kein Eintrag ausgewählt, wird es an das Ende angehängt."
712
+
713
+ #: inc/view/Lang.php:1
714
+ msgid "The file is uploaded to the folder where you are currently in."
715
+ msgstr ""
716
+ "Die Datei wird in den Ordner hochgeladen, in dem du dich gerade befindest."
717
+
718
+ #: inc/view/Lang.php:1
719
+ msgid "Are you sure?"
720
+ msgstr "Bist du sicher?"
721
+
722
+ #: inc/view/Lang.php:1
723
+ msgid "Success"
724
+ msgstr "Erfolgreich"
725
+
726
+ #: inc/view/Lang.php:1
727
+ msgid "Failed"
728
+ msgstr "Fehlgeschlagen"
729
+
730
+ #: inc/view/Lang.php:1
731
+ msgid "No entries found"
732
+ msgstr "Keine Einträge gefunden"
733
+
734
+ #: inc/view/Lang.php:1
735
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
736
+ msgstr ""
737
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
738
+ "verschoben."
739
+
740
+ #: inc/view/Lang.php:1
741
+ msgid ""
742
+ "Are you sure to delete *{count} folders*? All files gets moved to "
743
+ "Unorganized."
744
+ msgstr ""
745
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
746
+ "verschoben."
747
+
748
+ #: inc/view/Lang.php:1
749
+ msgid "Ok"
750
+ msgstr "Ok"
751
+
752
+ #: inc/view/Lang.php:1
753
+ msgid "Cancel"
754
+ msgstr "Abbrechen"
755
+
756
+ #: inc/view/Lang.php:1
757
+ msgid "Save"
758
+ msgstr "Speichern"
759
+
760
+ #: inc/view/Lang.php:1
761
+ msgid "Back"
762
+ msgstr "Zurück"
763
+
764
+ #: inc/view/Lang.php:1
765
+ msgid "No folders found"
766
+ msgstr "Keine Ordner gefunden"
767
+
768
+ #: inc/view/Lang.php:1
769
+ msgid ""
770
+ "No folders have been created yet. Just click on the button above to create "
771
+ "your first folder."
772
+ msgstr ""
773
+ "Bisher wurden keine Ordner angelegt. Klicke auf den obigen Button, um deinen "
774
+ "ersten Ordner zu erstellen."
775
+
776
+ #: inc/view/Lang.php:1
777
+ msgid "Folders"
778
+ msgstr "Ordner"
779
+
780
+ #: inc/view/Lang.php:1
781
+ msgid "No search results."
782
+ msgstr "Keine Suchergebnisse."
783
+
784
+ #: inc/view/Lang.php:1
785
+ msgid "Renaming to *{name}*…"
786
+ msgstr "Umbenennen in *{name}*…"
787
+
788
+ #: inc/view/Lang.php:1
789
+ msgid "Successfully renamed folder to *{name}*"
790
+ msgstr "Ordner erfolgreich in *{name}* umbenannt"
791
+
792
+ #: inc/view/Lang.php:1
793
+ msgid "Creating *{name}*…"
794
+ msgstr "Erstelle *{name}*…"
795
+
796
+ #: inc/view/Lang.php:1
797
+ msgid "Successfully created *{name}*"
798
+ msgstr "Erfolgreich *{name}* erstellt"
799
+
800
+ #: inc/view/Lang.php:1
801
+ msgid "Deleting *{name}*…"
802
+ msgstr "Löschen von *{name}*…"
803
+
804
+ #: inc/view/Lang.php:1
805
+ msgid "Successfully deleted *{name}*"
806
+ msgstr "Erfolgreich *{name}* gelöscht"
807
+
808
+ #: inc/view/Lang.php:1
809
+ msgid "Successfully deleted *{count} folders*"
810
+ msgstr "*{count} Order* erfolgreich geschlöscht"
811
+
812
+ #: inc/view/Lang.php:1
813
+ msgid "Rearrange *{name}* placement manually"
814
+ msgstr "Ordne *{name}* manuell an"
815
+
816
+ #: inc/view/Lang.php:1
817
+ msgid "Reordering the tree hierarchy…"
818
+ msgstr "Der Baum wird neu angeordnet…"
819
+
820
+ #: inc/view/Lang.php:1
821
+ msgid "Successfully sorted the tree hierarchy"
822
+ msgstr "Der Baum wurde erfolgreich neu angeordnet"
823
+
824
+ #: inc/view/Lang.php:1
825
+ msgid "Reorder subfolders of *{name}*…"
826
+ msgstr "Unterordner von *{name}* werden neu angeordnet…"
827
+
828
+ #: inc/view/Lang.php:1
829
+ msgid "{count} files remaining…"
830
+ msgstr "{count} Dateien verbleibend…"
831
+
832
+ #: inc/view/Lang.php:1
833
+ msgid "Receiving data…"
834
+ msgstr "Empfange Daten…"
835
+
836
+ #: inc/view/Lang.php:1
837
+ msgid "Shortcut"
838
+ msgstr "Verknüpfung"
839
+
840
+ #: inc/view/Lang.php:1
841
+ msgid ""
842
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
843
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
844
+ "do this in the original file (for example replace media file through a "
845
+ "plugin).\n"
846
+ "Note also that the fields in the shortcuts can be different to the original "
847
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
848
+ msgstr ""
849
+ "Dies ist eine Datei-Verknüpfung. Verknüpfungen brauchen keinen physischen "
850
+ "Speicherplatz *(0 kB)*. Wenn du die Datei selbst bearbeiten möchtest, musst "
851
+ "du das für die Original-Datei tun (Beispiel: Ersetzen der Datei durch ein "
852
+ "Plugin).\n"
853
+ "Beachte auch, dass Felder wie der Titel und Beschreibung unterschiedlich zur "
854
+ "Original-Datei sein können."
855
+
856
+ #: inc/view/Lang.php:1
857
+ msgid ""
858
+ "In the current view of uploads, filters are active. Please reset them and "
859
+ "refresh the view."
860
+ msgstr ""
861
+ "Im Moment sind Filter aktiv. Bitte setze diese zurück und aktualisiere die "
862
+ "Ansicht."
863
+
864
+ #: inc/view/Lang.php:1
865
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
866
+ msgstr ""
867
+ "Eine Kollektion darf keine Dateien enthalten. Datei wird nach Unorganisiert "
868
+ "verschoben…"
869
+
870
+ #: inc/view/Lang.php:1
871
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
872
+ msgstr ""
873
+ "Eine Galerie darf nur Bilder enthalten. Datei wird nach Unorganisiert "
874
+ "verschoben…"
875
+
876
+ #: inc/view/Lang.php:1
877
+ msgid "Order content by *{name}*…"
878
+ msgstr "Ordne Inhalt nach *{name}*…"
879
+
880
+ #: inc/view/Lang.php:1
881
+ msgid "Order content by drag & drop"
882
+ msgstr "Ordne Inhalte per Drag&Drop"
883
+
884
+ #: inc/view/Lang.php:1
885
+ msgid "Reset order"
886
+ msgstr "Reihenfolge zurücksetzen"
887
+
888
+ #: inc/view/Lang.php:1
889
+ msgid "Apply order once…"
890
+ msgstr "Einmalige Sortierung anwenden…"
891
+
892
+ #: inc/view/Lang.php:1
893
+ msgid "Last"
894
+ msgstr "zuletzt"
895
+
896
+ #: inc/view/Lang.php:1
897
+ msgid "Deactivate automatic ordering"
898
+ msgstr "Deaktiviere automatische Sortierung"
899
+
900
+ #: inc/view/Lang.php:1
901
+ msgid "Apply automatic order…"
902
+ msgstr "Automatische Sortierung anwenden…"
903
+
904
+ #: inc/view/Lang.php:1
905
+ msgid "Latest"
906
+ msgstr "Aktuell"
907
+
908
+ #: inc/view/Lang.php:1
909
+ msgid "Reindex order"
910
+ msgstr "Reihenfolge reparieren"
911
+
912
+ #: inc/view/Lang.php:1
913
+ msgid "Reset to last order"
914
+ msgstr "Letzte Reihenfolge wiederherstellen"
915
+
916
+ #: inc/view/Lang.php:1
917
+ msgid "All files"
918
+ msgstr "Alle Dateien"
919
+
920
+ #: inc/view/Lang.php:1
921
+ msgid "Move {count} files"
922
+ msgstr "Verschiebe {count} Dateien"
923
+
924
+ #: inc/view/Lang.php:1
925
+ msgid "Move one file"
926
+ msgstr "Verschiebe Datei"
927
+
928
+ #: inc/view/Lang.php:1
929
+ msgid "Copy {count} files"
930
+ msgstr "Kopiere {count} Dateien"
931
+
932
+ #: inc/view/Lang.php:1
933
+ msgid "Copy one file"
934
+ msgstr "Kopiere Datei"
935
+
936
+ #: inc/view/Lang.php:1
937
+ msgid "Moving {count} files…"
938
+ msgstr "{count} Dateien verschieben…"
939
+
940
+ #: inc/view/Lang.php:1
941
+ msgid "Moving one file…"
942
+ msgstr "Datei verschieben…"
943
+
944
+ #: inc/view/Lang.php:1
945
+ msgid "Copying {count} files…"
946
+ msgstr "{count} Dateien kopieren…"
947
+
948
+ #: inc/view/Lang.php:1
949
+ msgid "Copying one file…"
950
+ msgstr "Datei kopieren…"
951
+
952
+ #: inc/view/Lang.php:1
953
+ msgid "Successfully moved {count} files"
954
+ msgstr "{count} Dateien erfolgreich verschoben"
955
+
956
+ #: inc/view/Lang.php:1
957
+ msgid "Successfully moved one file"
958
+ msgstr "Datei erfolgreich verschoben"
959
+
960
+ #: inc/view/Lang.php:1
961
+ msgid "Successfully copied {count} files"
962
+ msgstr "{count} Dateien erfolgreich kopiert"
963
+
964
+ #: inc/view/Lang.php:1
965
+ msgid "Successfully copied one file"
966
+ msgstr "Datei erfolgreich kopiert"
967
+
968
+ #: inc/view/Lang.php:1
969
+ msgid "Hold any key to create a shortcut"
970
+ msgstr "Eine Taste festhalten, um Datei zu kopieren"
971
+
972
+ #: inc/view/Lang.php:1
973
+ msgid "Release key to move file"
974
+ msgstr "Taste loslassen, um Datei zu verschieben"
975
+
976
+ #: inc/view/Lang.php:1
977
+ msgid "Click this to create a new folder"
978
+ msgstr "Klicke hier, um einen neuen Ordner anzulegen"
979
+
980
+ #: inc/view/Lang.php:1
981
+ msgid ""
982
+ "A folder can contain any file type and collection, but not galleries. If you "
983
+ "want to create a subfolder, select a folder and click this button."
984
+ msgstr ""
985
+ "Ein Ordner kann jeden Dateitypen und Kollektionen enthalten, jedoch keine "
986
+ "Galerien. Wenn du einen Unterordner erstellen möchtest, selektiere einen "
987
+ "Ordner und klicke diesen Button."
988
+
989
+ #: inc/view/Lang.php:1
990
+ msgid "Click this to create a new collection"
991
+ msgstr "Klicke hier, um eine neue Kollektion anzulegen"
992
+
993
+ #: inc/view/Lang.php:1
994
+ msgid ""
995
+ "A collection cannot contain files. However, you can create additional "
996
+ "collections and *galleries* there. This gallery is only a *gallery data "
997
+ "folder*, i.e. they are not automatically visible on the website.\n"
998
+ "\n"
999
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
1000
+ "on your pages/postings."
1001
+ msgstr ""
1002
+ "Eine Kollektion kann keine Dateien enthalten. Dort können jedoch weitere "
1003
+ "Kollektionen und *Galerien* angelegt werden. Diese Galerie ist nur ein "
1004
+ "*Galerie-Daten-Ordner*, d. h. diese sind nicht automatisch auf der Webseite "
1005
+ "zu sehen.\n"
1006
+ "\n"
1007
+ "Eine *visuelle Galerie* kann durch einen Shortcode im Visual Editor auf "
1008
+ "deinen Seiten/Beiträgen erstellt werden."
1009
+
1010
+ #: inc/view/Lang.php:1
1011
+ msgid "Click this to create a *new gallery data folder*"
1012
+ msgstr "Klicke hier, um einen neuen *Galerie-Daten-Ordner* anzulegen"
1013
+
1014
+ #: inc/view/Lang.php:1
1015
+ msgid ""
1016
+ "A *gallery data folder* can only contain images. It is easier for you to "
1017
+ "distinguish where your visual galleries are located.\n"
1018
+ "\n"
1019
+ "You can also order the images into *a custom image order* per drag&drop."
1020
+ msgstr ""
1021
+ "Ein *Galerie-Daten-Ordner* kann nur Bilder enthalten - für dich ist es dann "
1022
+ "einfach zu entscheiden, wo deine visuellen Galerien liegen.\n"
1023
+ "\n"
1024
+ "Sie können per Drag & Drop eine *benutzerdefinierte Reihenfolge* erstellen."
1025
+
1026
+ #: inc/view/Lang.php:1
1027
+ msgid "Settings"
1028
+ msgstr "Einstellungen"
1029
+
1030
+ #: inc/view/Lang.php:1
1031
+ msgid "General settings for the current logged in user."
1032
+ msgstr "Allgemeine Einstellungen für den eingeloggten Benutzer."
1033
+
1034
+ #: inc/view/Lang.php:1
1035
+ msgid "Permissions"
1036
+ msgstr "Berechtigungen"
1037
+
1038
+ #: inc/view/Lang.php:1
1039
+ msgid "Reorder files in this folder"
1040
+ msgstr "Dateien sortieren"
1041
+
1042
+ #: inc/view/Lang.php:1
1043
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1044
+ msgstr "Ordne die Dateien / Bilder nach *Titel, Dateiname, ID, …*"
1045
+
1046
+ #: inc/view/Lang.php:1
1047
+ msgid "Refresh"
1048
+ msgstr "Neuladen"
1049
+
1050
+ #: inc/view/Lang.php:1
1051
+ msgid "Refreshes the current folder view."
1052
+ msgstr "Aktualisiert die aktuelle Ordneransicht."
1053
+
1054
+ #: inc/view/Lang.php:1
1055
+ msgid "Rename"
1056
+ msgstr "Umbenennen"
1057
+
1058
+ #: inc/view/Lang.php:1
1059
+ msgid "Rename the current selected folder."
1060
+ msgstr "Den aktuell ausgewählten Ordner umbenennen."
1061
+
1062
+ #: inc/view/Lang.php:1
1063
+ msgid "Delete"
1064
+ msgstr "Löschen"
1065
+
1066
+ #: inc/view/Lang.php:1
1067
+ msgid "Delete the current selected folder."
1068
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1069
+
1070
+ #: inc/view/Lang.php:1
1071
+ msgid "Delete the current selected folders."
1072
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1073
+
1074
+ #: inc/view/Lang.php:1
1075
+ msgid "Rearrange"
1076
+ msgstr "Neu anordnen"
1077
+
1078
+ #: inc/view/Lang.php:1
1079
+ msgid "Change the hierarchical order of the folders."
1080
+ msgstr "Ändern der hierarchischen Anordnung der Ordner."
1081
+
1082
+ #: inc/view/Lang.php:1
1083
+ msgid "Folder details"
1084
+ msgstr "Ordner Details"
1085
+
1086
+ #: inc/view/Lang.php:1
1087
+ msgid "Select a folder and view more details about it."
1088
+ msgstr "Selektiere einen Ordner, um mehr Details anzuzeigen."
1089
+
1090
+ #: inc/view/Lang.php:1
1091
+ msgid "Product license not yet activated."
1092
+ msgstr "Produkt-Lizenz noch nicht aktiviert."
1093
+
1094
+ #: inc/view/Lang.php:1
1095
+ msgid "Enter license"
1096
+ msgstr "Lizenzschlüssel eingeben"
1097
+
1098
+ #: inc/view/Lang.php:1
1099
+ msgid "Dismiss notice"
1100
+ msgstr "Meldung ausblenden"
1101
+
1102
+ #: inc/view/Lang.php:1
1103
+ msgid ""
1104
+ "It looks like you have already used another plugin for folders in the media "
1105
+ "library."
1106
+ msgstr ""
1107
+ "Es scheint, als hättest Du zuvor ein anderes Plugin zur "
1108
+ "Medienkategorisierung verwendet."
1109
+
1110
+ #: inc/view/Lang.php:1
1111
+ msgid "Start importing"
1112
+ msgstr "Import starten"
1113
+
1114
+ #: inc/view/Lang.php:1
1115
+ msgid "Dismiss"
1116
+ msgstr "Ausblenden"
1117
+
1118
+ #: inc/view/Lang.php:1
1119
+ msgid ""
1120
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1121
+ "do not change when you move the file. Learn more about <a href=\"https://"
1122
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1123
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1124
+ "files to physical folders.</a>"
1125
+ msgstr ""
1126
+ "Real Media Library erstellt eine virtuelle Ordnerstruktur. Die URLs der "
1127
+ "Uploads ändern sich nicht, wenn du die Datei verschiebst. Erfahre mehr "
1128
+ "darüber, wie du <a href=\"https://devowl.io/knowledge-base/how-can-i-"
1129
+ "physically-reflect-the-virtual-folder-structure-to-my-file-system/\" target="
1130
+ "\"_blank\">Dateien automatisch in physische Ordner verschieben kannst.</a>"
1131
+
1132
+ #: inc/view/Lang.php:1
1133
+ msgid ""
1134
+ "You will be redirected to the external website of PRO version. Please "
1135
+ "confirm to continue!"
1136
+ msgstr ""
1137
+ "Sie werden auf die externe Website der PRO-Version weitergeleitet. Bitte "
1138
+ "bestätige die Fortsetzung!"
1139
+
1140
+ #: inc/view/Lang.php:1
1141
+ msgid "PRO Feature"
1142
+ msgstr "PRO Feature"
1143
+
1144
+ #: inc/view/Lang.php:1
1145
+ msgid "Hide for 20 days"
1146
+ msgstr "20 Tage verstecken"
1147
+
1148
+ #: inc/view/Lang.php:1
1149
+ msgid "Thanks for using the free version of Real Media Library."
1150
+ msgstr ""
1151
+ "Vielen Dank für die Nutzung der kostenlosen Version von Real Media Library."
1152
+
1153
+ #: inc/view/Lang.php:1
1154
+ msgid "Get PRO!"
1155
+ msgstr "Hole dir PRO!"
1156
+
1157
+ #: inc/view/Lang.php:1
1158
+ msgid "I want to learn more!"
1159
+ msgstr "Ich will mehr erfahren!"
1160
+
1161
+ #: inc/view/Lang.php:1
1162
+ msgid "No, not interested…"
1163
+ msgstr "Nein, kein Interesse…"
1164
+
1165
+ #: inc/view/Lang.php:1
1166
+ msgid "You like collections?"
1167
+ msgstr "Magst Du Kollektionen?"
1168
+
1169
+ #: inc/view/Lang.php:1
1170
+ msgid ""
1171
+ "Get more organized with different types of folders: Collections and "
1172
+ "galleries help you to easily recognize where your image galleries are "
1173
+ "located."
1174
+ msgstr ""
1175
+ "Sorgen für mehr Ordnung mit verschiedenen Arten von Ordnern: Sammlungen und "
1176
+ "Galerien helfen dir leicht zu erkennen, wo sich deine Bildergalerien "
1177
+ "befinden."
1178
+
1179
+ #: inc/view/Lang.php:1
1180
+ msgid "Custom content order?"
1181
+ msgstr "Dateien sortieren?"
1182
+
1183
+ #: inc/view/Lang.php:1
1184
+ msgid ""
1185
+ "Get your folder contents in order and arrange your files according to a "
1186
+ "criterion (e.g. name descending) or by drag & drop."
1187
+ msgstr ""
1188
+ "Bringen Ordnung in deinen Ordnerinhalt und ordne deine Dateien nach einem "
1189
+ "Kriterium (z.B. Name absteigend) oder per Drag & Drop an."
1190
+
1191
+ #: inc/view/Lang.php:1
1192
+ msgid "Full order control?"
1193
+ msgstr "Volle Kontrolle über die Sortierung?"
1194
+
1195
+ #: inc/view/Lang.php:1
1196
+ msgid ""
1197
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1198
+ "name descending) or by drag & drop."
1199
+ msgstr ""
1200
+ "Organisiere die Knoten innerhalb deines Ordnerbaums nach einem Kriterium (z."
1201
+ "B. Name absteigend) oder per Drag & Drop an."
1202
+
1203
+ #: inc/view/Lang.php:1
1204
+ msgid "Want to create subfolders?"
1205
+ msgstr "Unterordner erstellen?"
1206
+
1207
+ #: inc/view/Lang.php:1
1208
+ msgid ""
1209
+ "Subfolders offer you the possibility to bring more structure into your media "
1210
+ "library. They help you to keep the overview, even if you really have many "
1211
+ "files in your media library."
1212
+ msgstr ""
1213
+ "Unterordner bieten dir die Möglichkeit, mehr Struktur in deine "
1214
+ "Medienbibliothek zu bringen. Sie helfen dir, den Überblick zu behalten, auch "
1215
+ "wenn du wirklich viele Dateien in deiner Mediathek hast."
1216
+
1217
+ #: inc/view/Lang.php:1
1218
+ msgid "Want to switch between folders more comfortably?"
1219
+ msgstr "Komfortabler zwischen den Ordnern wechseln?"
1220
+
1221
+ #: inc/view/Lang.php:1
1222
+ msgid ""
1223
+ "Let the complete folder tree as in your media library also be displayed in "
1224
+ "this dialog instead of searching each time in the dropdown. It is simply "
1225
+ "more comfortable!"
1226
+ msgstr ""
1227
+ "Lass dir den kompletten Ordnerbaum wie in deiner Medienbibliothek auch in "
1228
+ "diesem Dialog anzeigen, anstatt jedes Mal im Dropdown zu suchen. Das ist "
1229
+ "einfach komfortabler!"
1230
+
1231
+ #: inc/view/Lang.php:1
1232
+ msgid "Want to upload entire folders?"
1233
+ msgstr "Möchtest du ganze Ordner hochladen?"
1234
+
1235
+ #: inc/view/Lang.php:1
1236
+ msgid ""
1237
+ "With Real Media Library you can upload entire folders using drag and drop. "
1238
+ "All folders, subfolders and files will be uploaded and displayed in your "
1239
+ "media library in the same structure. Get PRO to upload folders!"
1240
+ msgstr ""
1241
+ "Mit Real Media Library kannst du ganze Ordner per Drag & Drop hochladen. "
1242
+ "Alle Ordner, Unterordner und Dateien werden hochgeladen und in deiner "
1243
+ "Medienbibliothek in der gleichen Struktur angezeigt. Hol dir PRO zum "
1244
+ "Hochladen von Ordnern!"
1245
+
1246
+ #: inc/view/Options.php:1
1247
+ msgid "RealMediaLibrary:General"
1248
+ msgstr "RealMediaLibrary:Allgemein"
1249
+
1250
+ #: inc/view/Options.php:1
1251
+ msgid "Load RML functionality in frontend"
1252
+ msgstr "Lade RML-Funktionalitäten im Frontend"
1253
+
1254
+ #: inc/view/Options.php:1
1255
+ msgid "RealMediaLibrary:Reset"
1256
+ msgstr "RealMediaLibrary:Zurücksetzen"
1257
+
1258
+ #: inc/view/Options.php:1
1259
+ msgid "Reset the order of all galleries"
1260
+ msgstr "Die Reihenfolge aller Galerien zurücksetzen"
1261
+
1262
+ #: inc/view/Options.php:1
1263
+ msgid "Wipe all settings (folders, attachment relations)"
1264
+ msgstr ""
1265
+ "Alle Einstellungen zurücksetzen (Ordner, Medien-Beziehungen zu den Ordnern)"
1266
+
1267
+ #: inc/view/Options.php:1
1268
+ msgid "Reset folder count cache"
1269
+ msgstr "Ordneranzahl-Cache zurücksetzen"
1270
+
1271
+ #: inc/view/Options.php:1
1272
+ msgid "Reset names, slugs and absolute pathes"
1273
+ msgstr "Namen, Slugs und absolute Pfade zurücksetzen"
1274
+
1275
+ #: inc/view/Options.php:1
1276
+ msgid "Wipe attachment relations"
1277
+ msgstr "Setze Medien-Beziehungen zurück"
1278
+
1279
+ #: inc/view/Options.php:1
1280
+ msgid "Wipe all"
1281
+ msgstr "Setze alles zurück"
1282
+
1283
+ #: inc/view/Options.php:1
1284
+ msgid "Reset count"
1285
+ msgstr "Anzahl zurücksetzen"
1286
+
1287
+ #: inc/view/Options.php:1
1288
+ msgid "Reset"
1289
+ msgstr "Zurücksetzen"
1290
+
1291
+ #: inc/view/Options.php:1
1292
+ msgid ""
1293
+ "Activate this option if you are using a page builder like Divi Page Builder, "
1294
+ "WPBakery Page Builder or Elementor."
1295
+ msgstr ""
1296
+ "Aktiviere diese Option, wenn du einen Page Builder wie Divi Page Builder, "
1297
+ "WPBakery Page Builder oder Elementor verwendest."
1298
+
1299
+ #: inc/view/Options.php:1
1300
+ msgid "You can also reset an single folder in its folder details."
1301
+ msgstr "Du kannst auch einen einzelnen Ordner zurücksetzen."
1302
+
1303
+ #: inc/view/View.php:1
1304
+ msgid "All"
1305
+ msgstr "Alles"
1306
+
1307
+ #: inc/view/View.php:1
1308
+ msgid "Unorganized pictures"
1309
+ msgstr "Unorganisierte Bilder"
languages/real-media-library-de_DE.mo ADDED
Binary file
languages/real-media-library-de_DE.po ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
4
+ "POT-Creation-Date: n/a\n"
5
+ "PO-Revision-Date: 2021-10-12 08:40+0000\n"
6
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
7
+ "Language-Team: German <https://translate.devowl.io/projects/wordpress-real-"
8
+ "media-library-backend-php/develop/de/>\n"
9
+ "Language: de_DE\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: Weblate 4.8\n"
15
+
16
+ #. Plugin Name of the plugin
17
+ msgid "Real Media Library"
18
+ msgstr "Real Media Library"
19
+
20
+ #. Plugin URI of the plugin
21
+ msgid "https://devowl.io/wordpress-real-media-library/"
22
+ msgstr "https://devowl.io/de/wordpress-real-media-library/"
23
+
24
+ #. Description of the plugin
25
+ msgid ""
26
+ "Organize uploaded media in folders, collections and galleries: A file "
27
+ "manager for WordPress. Media management made easy!"
28
+ msgstr ""
29
+ "Organisiere hochgeladene Medien in Ordnern, Sammlungen und Galerien: Ein "
30
+ "Dateimanager für WordPress. Medienmanagement leicht gemacht!"
31
+
32
+ #. Author of the plugin
33
+ msgid "devowl.io"
34
+ msgstr "devowl.io"
35
+
36
+ #. Author URI of the plugin
37
+ msgid "https://devowl.io"
38
+ msgstr "https://devowl.io/de/"
39
+
40
+ #: inc/AdInitiator.php:1
41
+ msgid "Complete file and folder manager"
42
+ msgstr "Vollständiger Datei- und Ordnermanager"
43
+
44
+ #: inc/AdInitiator.php:1
45
+ msgid ""
46
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
47
+ "media management. You can use this plugin to organize the thousands of "
48
+ "images, audio, video and PDF files in your media library into folders. "
49
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
50
+ "WordPress."
51
+ msgstr ""
52
+ "Real Media Library ist ein WordPress-Plugin, das dir eine erweiterte "
53
+ "Medienverwaltung ermöglicht. Mit diesem Plugin kannst du die tausende "
54
+ "Bilder, Audio-, Video- und PDF-Dateien in Ihrer Medienbibliothek in Ordnern "
55
+ "organisieren. Im Grunde ist es ein Dateimanager wie Windows Explorer oder "
56
+ "Mac Finder, aber für WordPress."
57
+
58
+ #: inc/AdInitiator.php:1
59
+ msgid "Filter in insert media dialog"
60
+ msgstr "Filter im Dialog “Medien einfügen”"
61
+
62
+ #: inc/AdInitiator.php:1
63
+ msgid ""
64
+ "No matter where you are, the folder structure of Real Media Library is "
65
+ "always where you can select files. For example in the dialog for selecting a "
66
+ "\"Featured Image\"."
67
+ msgstr ""
68
+ "Egal, wo du dich befindest, die Ordnerstruktur von Real Media Library ist "
69
+ "immer dort, wo du Dateien auswählen kannst. Zum Beispiel im Dialog zur "
70
+ "Auswahl eines “Beitragsbild”."
71
+
72
+ #: inc/AdInitiator.php:1
73
+ msgid ""
74
+ "In the Lite version you can only select the folder by a simple dropdown."
75
+ msgstr ""
76
+ "In der Lite Version kannst du den Ordner nur über ein einfaches Dropdown "
77
+ "auswählen."
78
+
79
+ #: inc/AdInitiator.php:1
80
+ msgid "Custom image order"
81
+ msgstr "Benutzerdefinierte Bildreihenfolge"
82
+
83
+ #: inc/AdInitiator.php:1
84
+ msgid ""
85
+ "Organizing your media files is really easy with the Real Media Library "
86
+ "plugin. You can arrange the order of your files yourself by dragging and "
87
+ "dropping. This allows you to move important files to the top for faster "
88
+ "access."
89
+ msgstr ""
90
+ "Die Organisation deiner Mediendateien ist mit dem Real Media Library Plugin "
91
+ "wirklich einfach. Du kannst die Reihenfolge deiner Dateien selbst durch Drag "
92
+ "& Drop festlegen. Dadurch kannst du wichtige Dateien für einen schnelleren "
93
+ "Zugriff an den Anfang verschieben."
94
+
95
+ #: inc/AdInitiator.php:1
96
+ msgid "Get your PRO license now!"
97
+ msgstr "Holen dir jetzt deine PRO-Lizenz!"
98
+
99
+ #: inc/api/attachment.php:1
100
+ msgid "The given folder was not found."
101
+ msgstr "Der angegebene Ordner wurde nicht gefunden."
102
+
103
+ #: inc/Assets.php:1
104
+ msgid "Complementary Plugins"
105
+ msgstr "Erweiterungen"
106
+
107
+ #: inc/Assets.php:1
108
+ msgid ""
109
+ "\n"
110
+ "\n"
111
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
112
+ "deleted.\n"
113
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
114
+ "deleted, too."
115
+ msgstr ""
116
+ "\n"
117
+ "\n"
118
+ "Beachte: Wenn du eine Verknüpfung löscht, wird die Originaldatei nicht "
119
+ "gelöscht.\n"
120
+ "Wenn du eine normale Datei löscht, werden alle dazugehörigen Verknüpfungen "
121
+ "auch gelöscht."
122
+
123
+ #: inc/attachment/CustomField.php:1
124
+ msgid ""
125
+ "If you move this shortcut, the location of the source/main file is not "
126
+ "changed."
127
+ msgstr ""
128
+ "Wenn du diese Verknüpfung verschiebst, wird der Ordner der Originaldatei "
129
+ "nicht verändert."
130
+
131
+ #: inc/attachment/CustomField.php:1
132
+ msgid ""
133
+ "If you move this attachment, the folder location of the associated shortcuts "
134
+ "are not changed."
135
+ msgstr ""
136
+ "Wenn du diese Datei verschiebst, werden die Ordner der dazugehörigen "
137
+ "Verknüpfungen nicht verändert."
138
+
139
+ #: inc/attachment/CustomField.php:1
140
+ msgid "Move to another folder"
141
+ msgstr "Verschiebe Datei in anderen Ordner"
142
+
143
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
144
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
145
+ msgid "Folder"
146
+ msgstr "Ordner"
147
+
148
+ #: inc/attachment/CustomField.php:1
149
+ msgid "Shortcut infos"
150
+ msgstr "Verknüpfung"
151
+
152
+ #: inc/attachment/CustomField.php:1
153
+ msgid ""
154
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
155
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
156
+ "itself, you must do this in the original file (for example replace media "
157
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
158
+ "be different to the original file, for example \"Title\", \"Description\" or "
159
+ "\"Caption\"."
160
+ msgstr ""
161
+ "Dies ist eine Verknüpfung. Verknüpfungen brauchen keinen physikalischen "
162
+ "Speicherplatz <strong>(0 kB)</strong>. Wenn du die Datei selbst ändern "
163
+ "möchten, verändere die Originaldatei (bspw. Ersetzen der Datei durch ein "
164
+ "Plugin).<br/>Beachten auch, dass die Felder in der Verknüpfung "
165
+ "unterschiedlich zur Originaldatei sein können, zum Beispiel “Titel”, "
166
+ "“Beschreibung”."
167
+
168
+ #. translators:
169
+ #: inc/attachment/CustomField.php:1
170
+ msgid "For this file is %d shortcut available in the following folder:"
171
+ msgid_plural ""
172
+ "For this file are %d shortcuts available in the following folders:"
173
+ msgstr[0] "Für diese Datei gibt es eine Verknüpfung im folgenden Ordner:"
174
+ msgstr[1] ""
175
+ "Für diese Datei sind %s Verknüpfungen verfügbar in folgenden Ordnern:"
176
+
177
+ #: inc/attachment/CustomField.php:1
178
+ msgid ""
179
+ "This file has no associated shortcuts. You can create shortcuts by moving "
180
+ "files per mouse and hold any key."
181
+ msgstr ""
182
+ "Die Datei hat keine zugehörige Verknüpfung. Du kannst Verknüpfung erstellen, "
183
+ "indem du per Drag&Drop die Datei bewegst und eine beliebige Taste hältst."
184
+
185
+ #: inc/attachment/Permissions.php:1
186
+ msgid "You are not allowed to insert files here."
187
+ msgstr "Du hast keine Berechtigung, hier neue Dateien hinzuzufügen."
188
+
189
+ #: inc/attachment/Permissions.php:1
190
+ msgid "You are not allowed to move the file."
191
+ msgstr "Du hast keine Berechtigung, die Datei zu verschieben."
192
+
193
+ #: inc/attachment/Permissions.php:1
194
+ msgid "You are not allowed to create a subfolder here."
195
+ msgstr "Du hast keine Berechtigung hier Unterordner zu erstellen."
196
+
197
+ #: inc/attachment/Permissions.php:1
198
+ msgid "You are not allowed to delete this folder."
199
+ msgstr "Du hast keine Berechtigung den Ordner zu löschen."
200
+
201
+ #: inc/attachment/Permissions.php:1
202
+ msgid "You are not allowed to rename this folder."
203
+ msgstr "Du hast keine Berechtigung den Ordner umzubenennen."
204
+
205
+ #: inc/attachment/Upload.php:1
206
+ msgid "Select destination folder"
207
+ msgstr "Zielordner auswählen"
208
+
209
+ #: inc/attachment/Upload.php:1
210
+ msgid ""
211
+ "You can simply upload files directly to a folder. Select a folder and upload "
212
+ "files."
213
+ msgstr "Du kannst Dateien direkt in einen Ordner hochladen."
214
+
215
+ #: inc/attachment/Upload.php:1
216
+ msgid "upload to folder"
217
+ msgstr "in den Ordner hochladen"
218
+
219
+ #: inc/comp/ExImport.php:1
220
+ msgid "RealMediaLibrary:Import / Export"
221
+ msgstr "RealMediaLibrary:Import / Export"
222
+
223
+ #: inc/comp/ExImport.php:1
224
+ msgid "Import from other plugins"
225
+ msgstr "Von anderen Plugins importieren"
226
+
227
+ #: inc/comp/ExImport.php:1
228
+ msgid "Export / Import Real Media Library folders"
229
+ msgstr "Export / Image Real Media Library Ordner"
230
+
231
+ #: inc/comp/ExImport.php:1
232
+ msgid "Export"
233
+ msgstr "Exportieren"
234
+
235
+ #: inc/comp/ExImport.php:1
236
+ msgid "Import"
237
+ msgstr "Importieren"
238
+
239
+ #: inc/comp/ExImport.php:1
240
+ msgid ""
241
+ "All available folders will be exported. The current structure is not lost "
242
+ "during import - but check that there are no duplicate names in the import "
243
+ "data, as these are not checked."
244
+ msgstr ""
245
+ "Exportiert werden alle verfügbaren Ordner. Beim Import geht die aktuelle "
246
+ "Struktur nicht verloren - prüfe aber, dass bei den Import-Daten keine "
247
+ "doppelten Namen vorkommen, da diese nicht geprüft werden."
248
+
249
+ #: inc/comp/ExImport.php:1
250
+ msgid "Exported data:"
251
+ msgstr "Exportieren:"
252
+
253
+ #: inc/comp/ExImport.php:1
254
+ msgid "Import data:"
255
+ msgstr "Importieren:"
256
+
257
+ #: inc/comp/ExImport.php:1
258
+ msgid "Importing data is only available in PRO version."
259
+ msgstr "Das Importieren von Daten ist nur in der PRO-Version verfügbar."
260
+
261
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
262
+ #: inc/view/Lang.php:1
263
+ msgid "Learn more about PRO"
264
+ msgstr "Erfahre mehr über PRO"
265
+
266
+ #: inc/comp/ExImport.php:1
267
+ msgid "Imports categories and post relations."
268
+ msgstr "Importiert Kategorien und Beziehungen."
269
+
270
+ #: inc/comp/ExImport.php:1
271
+ msgid "Nothing to import."
272
+ msgstr "Nichts zu importieren."
273
+
274
+ #: inc/comp/ExImport.php:1
275
+ msgid ""
276
+ "Importing categories from another plugin is only available in PRO version."
277
+ msgstr ""
278
+ "Der Import von Kategorien aus einem anderen Plugin ist nur in der PRO-"
279
+ "Version verfügbar."
280
+
281
+ #: inc/comp/ExportMediaLibrary.php:1
282
+ msgid "No valid folder."
283
+ msgstr "Kein gültiger Ordner."
284
+
285
+ #: inc/comp/ExportMediaLibrary.php:1
286
+ msgid "No valid type."
287
+ msgstr "Kein gültiger Typ."
288
+
289
+ #: inc/comp/PolyLang.php:1
290
+ msgid "PolyLang: Automatically move translations"
291
+ msgstr "PolyLang: Automatisch Übersetzungen verschieben"
292
+
293
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
294
+ msgid ""
295
+ "If you move a file, the corresponding translated file will also be moved."
296
+ msgstr ""
297
+ "Wenn du eine Datei verschiebst, wird auch die dazugehörigen übersetzte Datei "
298
+ "verschoben."
299
+
300
+ #: inc/comp/WPML.php:1
301
+ msgid "WPML: Automatically move translations"
302
+ msgstr "WPML: Automatisch übersetzte Bilder in Ordner verschieben"
303
+
304
+ #. translators:
305
+ #: inc/exception/FolderAlreadyExistsException.php:1
306
+ msgid "'%s' already exists in this folder."
307
+ msgstr "'%s' existiert bereits in diesem Ordner."
308
+
309
+ #. translators:
310
+ #: inc/exception/OnlyInProVersionException.php:1
311
+ msgid "This functionality is not available in the free version (%s)."
312
+ msgstr ""
313
+ "Diese Funktionalität ist in der kostenlosen Version (%s) nicht verfügbar."
314
+
315
+ #: inc/folder/Creatable.php:1
316
+ msgid "You need to provide a set of files."
317
+ msgstr "Du musst mehrere Dateien bereitstellen."
318
+
319
+ #: inc/folder/Creatable.php:1
320
+ msgid "The folder could not be created in the database."
321
+ msgstr "Der Ordner konnte nicht in die Datenbank geschrieben werden."
322
+
323
+ #: inc/folder/Creatable.php:1
324
+ msgid "The folder could not be created because it already exists."
325
+ msgstr "Der Ordner konnte nicht erstellt werden, da er bereits existiert."
326
+
327
+ #: inc/folder/Creatable.php:1
328
+ msgid ""
329
+ "A folder can contain every type of file or a collection, but not gallery."
330
+ msgstr ""
331
+ "Ein Ordner kann alle Typen von Dateien enthalten oder eine Kollektion, aber "
332
+ "keine Galerie."
333
+
334
+ #. translators:
335
+ #: inc/folder/Creatable.php:1
336
+ msgid "'%s' is not a valid folder name."
337
+ msgstr "'%s' ist kein gültiger Ordnername."
338
+
339
+ #: inc/folder/Creatable.php:1
340
+ msgid "Order by name ascending"
341
+ msgstr "Sortiere nach Name aufsteigend"
342
+
343
+ #: inc/folder/Creatable.php:1
344
+ msgid "Order by name descending"
345
+ msgstr "Sortiere nach Name absteigend"
346
+
347
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
348
+ msgid "Order by ID ascending"
349
+ msgstr "Sortiere nach ID aufsteigend"
350
+
351
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
352
+ msgid "Order by ID descending"
353
+ msgstr "Sortiere nach ID absteigend"
354
+
355
+ #: inc/folder/CRUD.php:1
356
+ msgid "The given folder does not exist or you cannot rename this folder."
357
+ msgstr ""
358
+ "Der Ordner kann nicht gefunden werden oder du kannst diesen Ordner nicht "
359
+ "umbenennen."
360
+
361
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
362
+ msgid "The folder you try to delete has subfolders."
363
+ msgstr "Den Ordner, den du löschen möchtest, enthält Unterordner."
364
+
365
+ #: inc/folder/CRUD.php:1
366
+ msgid "The given folder does not exist."
367
+ msgstr "Der angegebene Ordner existiert nicht."
368
+
369
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
370
+ msgid "Unorganized"
371
+ msgstr "Unorganisiert"
372
+
373
+ #: inc/folder/Root.php:1
374
+ msgid ""
375
+ "Unorganized is the same as a root folder. Here you can find all files which "
376
+ "are not assigned to a folder."
377
+ msgstr ""
378
+ "Unorganisiert ist der Stamm-Ordner. Alle nicht zugewiesenen Dateien können "
379
+ "hier aufgefunden werden."
380
+
381
+ #: inc/metadata/CoverImage.php:1
382
+ msgid ""
383
+ "This option is disabled on this page. Please navigate to the media library."
384
+ msgstr ""
385
+ "Diese Option ist auf dieser Seite deaktiviert. Navigiere bitte zur "
386
+ "Medienbibliothek."
387
+
388
+ #: inc/metadata/CoverImage.php:1
389
+ msgid "Cover image"
390
+ msgstr "Vorschaubild"
391
+
392
+ #: inc/metadata/Description.php:1
393
+ msgid "Description"
394
+ msgstr "Beschreibung"
395
+
396
+ #: inc/metadata/Meta.php:1
397
+ msgid "Path"
398
+ msgstr "Pfad"
399
+
400
+ #: inc/metadata/Meta.php:1
401
+ msgid "Folder type"
402
+ msgstr "Ordnertyp"
403
+
404
+ #: inc/metadata/Meta.php:1
405
+ msgid "General"
406
+ msgstr "Allgemein"
407
+
408
+ #: inc/order/Sortable.php:1
409
+ msgid "Order by date ascending"
410
+ msgstr "Sortiere nach Datum aufsteigend"
411
+
412
+ #: inc/order/Sortable.php:1
413
+ msgid "Order by date descending"
414
+ msgstr "Sortiere nach Datum absteigend"
415
+
416
+ #: inc/order/Sortable.php:1
417
+ msgid "Order by title ascending"
418
+ msgstr "Sortiere nach Titel aufsteigend"
419
+
420
+ #: inc/order/Sortable.php:1
421
+ msgid "Order by title descending"
422
+ msgstr "Sortiere nach Titel absteigend"
423
+
424
+ #: inc/order/Sortable.php:1
425
+ msgid "Order by filename ascending"
426
+ msgstr "Sortiere nach Dateiname aufsteigend"
427
+
428
+ #: inc/order/Sortable.php:1
429
+ msgid "Order by filename descending"
430
+ msgstr "Sortiere nach Dateiname absteigend"
431
+
432
+ #: inc/order/Sortable.php:1
433
+ msgid "Natural order by filename ascending"
434
+ msgstr "Natürliche Ordnung nach Dateinamen aufsteigend"
435
+
436
+ #: inc/order/Sortable.php:1
437
+ msgid "Natural order by filename descending"
438
+ msgstr "Natürliche Ordnung nach Dateinamen absteigend"
439
+
440
+ #: inc/overrides/lite/folder/Creatable.php:1
441
+ #: inc/overrides/pro/folder/Creatable.php:1
442
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
443
+ msgid "Something went wrong."
444
+ msgstr "Etwas ist schiefgelaufen."
445
+
446
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
447
+ msgid "Folder not found."
448
+ msgstr "Ordner nicht gefunden."
449
+
450
+ #: inc/overrides/pro/Core.php:1
451
+ msgid ""
452
+ "<strong>You have not yet entered the license key</strong>. To receive "
453
+ "automatic updates, please enter the key in \"Enter license\"."
454
+ msgstr ""
455
+ "<strong>Der Lizenzschlüssel wurde noch nicht eingegeben</strong>. Um "
456
+ "automatische Updates zu erhalten klicke auf \"Enter license\"."
457
+
458
+ #: inc/overrides/pro/folder/Collection.php:1
459
+ msgid "A collection cannot contain files."
460
+ msgstr "Eine Kollektion kann keine Dateien enthalten."
461
+
462
+ #: inc/overrides/pro/folder/Collection.php:1
463
+ msgid "Collection"
464
+ msgstr "Kollektion"
465
+
466
+ #: inc/overrides/pro/folder/Collection.php:1
467
+ msgid ""
468
+ "A collection cannot contain files. But you can create other collections and "
469
+ "<strong> galleries</strong> there."
470
+ msgstr ""
471
+ "Eine Kollektion kann keine Dateien enthalten. Aber es können dort neue "
472
+ "Kollektionen und <strong>Galerien</strong> angelegt werden."
473
+
474
+ #. translators:
475
+ #: inc/overrides/pro/folder/Creatable.php:1
476
+ msgid "The parent %d does not exist."
477
+ msgstr "Das übergeordnete Ordner %d existiert nicht."
478
+
479
+ #: inc/overrides/pro/folder/Creatable.php:1
480
+ msgid "The given parent does not exist to set the parent for this folder."
481
+ msgstr "Der übergeordnete Ordner existiert nicht."
482
+
483
+ #: inc/overrides/pro/folder/Creatable.php:1
484
+ msgid "You are not allowed to change the parent for this folder."
485
+ msgstr ""
486
+ "Du hast keine Berechtigung den übergeordneten Ordner für diesen Ordner zu "
487
+ "ändern."
488
+
489
+ #: inc/overrides/pro/folder/Creatable.php:1
490
+ msgid "The given parent does not allow the folder type."
491
+ msgstr "Der übergeordnete Ordner erlaubt diesen Ordner-Typ nicht."
492
+
493
+ #: inc/overrides/pro/folder/Gallery.php:1
494
+ msgid "You can only move images to a gallery."
495
+ msgstr "Du kannst nur Bilder zu einer Galerie hinzufügen."
496
+
497
+ #: inc/overrides/pro/folder/Gallery.php:1
498
+ msgid "Gallery"
499
+ msgstr "Galerie"
500
+
501
+ #: inc/overrides/pro/folder/Gallery.php:1
502
+ msgid ""
503
+ "A gallery can only contain images. To view a gallery, go to a post and look "
504
+ "at the buttons of the visual editor.."
505
+ msgstr ""
506
+ "Eine Galerie kann nur Bilder enthalten. Um eine Galerie in einem Beitrag "
507
+ "anzuzeigen, werfe einen Blick auf den visuellen Editor."
508
+
509
+ #: inc/overrides/pro/order/Sortable.php:1
510
+ msgid "The given folder does not allow to reorder the files."
511
+ msgstr ""
512
+ "Der angegebene Ordner erlaubt es nicht Dateien benutzerdefiniert zu "
513
+ "sortieren."
514
+
515
+ #: inc/overrides/pro/order/Sortable.php:1
516
+ msgid "This folder has an automatic order. Please deactivate that first."
517
+ msgstr ""
518
+ "Dieser Ordner hat eine automatische Sortierung. Bitte deaktiviere diese erst."
519
+
520
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
521
+ msgid "Please select a folder to show items."
522
+ msgstr "Bitte wähle einen Ordner aus, um die Artikel anzuzeigen."
523
+
524
+ #: inc/rest/Attachment.php:1
525
+ msgid "Fetch only media in a folder by folder id."
526
+ msgstr "Lade nur Medien in einem Ordner nach Ordnerkennung."
527
+
528
+ #: inc/rest/Service.php:1
529
+ msgid "Forbidden"
530
+ msgstr "Verboten"
531
+
532
+ #: inc/rest/Service.php:1
533
+ msgid "Real Media Library is not active for the current user."
534
+ msgstr "Real Media Library ist für den aktuellen Benutzer nicht aktiviert."
535
+
536
+ #: inc/usersettings/AllFilesShortcuts.php:1
537
+ msgid "Hide shortcuts in \"All files\""
538
+ msgstr "Verknüpfungen in \"Alle Dateien\" ausblenden"
539
+
540
+ #: inc/usersettings/AllFilesShortcuts.php:1
541
+ msgid "The count always includes shortcuts"
542
+ msgstr "Die Anzahl ist immer inklusive Verknüpfungen"
543
+
544
+ #: inc/usersettings/DefaultFolder.php:1
545
+ msgid "Default startup folder"
546
+ msgstr "Standard Ordner beim Start"
547
+
548
+ #: inc/usersettings/DefaultFolder.php:1
549
+ msgid "No folder at startup"
550
+ msgstr "Keinen Ordner öffnen"
551
+
552
+ #: inc/usersettings/DefaultFolder.php:1
553
+ msgid "Last opened folder"
554
+ msgstr "Zuletzt geöffneter Ordner"
555
+
556
+ #: inc/usersettings/DefaultFolder.php:1
557
+ msgid ""
558
+ "Your media library can always open in the last opened folder or a folder you "
559
+ "choose. This saves you time every time you open the media library!"
560
+ msgstr ""
561
+ "Deine Mediathek kann sich immer im zuletzt geöffneten Ordner oder einem von "
562
+ "dir gewählten Ordner öffnen. So sparst du jedes Mal Zeit, wenn du die "
563
+ "Mediathek öffnest!"
564
+
565
+ #: inc/usersettings/InfiniteScrolling.php:1
566
+ msgid "Enable infinite scrolling in grid view"
567
+ msgstr "Automatisches Nachladen beim Scrollen in der Kachel-Ansicht aktivieren"
568
+
569
+ #: inc/usersettings/InfiniteScrolling.php:1
570
+ msgid ""
571
+ "Instead of displaying a \"Load More\" button, all files are loaded "
572
+ "automatically as you scroll down. This is not supported in list view."
573
+ msgstr ""
574
+ "Anstatt eine Schaltfläche \"Mehr laden\" anzuzeigen, werden alle Dateien "
575
+ "automatisch nachgeladen, wenn du nach unten scrollst. Dies wird in der "
576
+ "Listenansicht nicht unterstützt."
577
+
578
+ #: inc/view/FolderShortcode.php:1
579
+ msgid "Gallery from Media Folder"
580
+ msgstr "Galerie aus Medienordner"
581
+
582
+ #: inc/view/FolderShortcode.php:1
583
+ msgid ""
584
+ "Note: You can only select galleries. Folders and collections are grayed."
585
+ msgstr ""
586
+ "Beachte: Du kannst nur Galerien auswählen. Ordner und Kollektionen sind "
587
+ "ausgegraut."
588
+
589
+ #: inc/view/FolderShortcode.php:1
590
+ msgid "Link to"
591
+ msgstr "Link auf"
592
+
593
+ #: inc/view/FolderShortcode.php:1
594
+ msgid "Columns"
595
+ msgstr "Spalten"
596
+
597
+ #: inc/view/FolderShortcode.php:1
598
+ msgid "Random Order"
599
+ msgstr "Zufällige Anordnung"
600
+
601
+ #: inc/view/FolderShortcode.php:1
602
+ msgid "Size"
603
+ msgstr "Größe"
604
+
605
+ #: inc/view/FolderShortcode.php:1
606
+ msgid "Attachment File"
607
+ msgstr "Mediendatei"
608
+
609
+ #: inc/view/FolderShortcode.php:1
610
+ msgid "Media File"
611
+ msgstr "Mediendatei"
612
+
613
+ #: inc/view/FolderShortcode.php:1
614
+ msgid "None"
615
+ msgstr "Keine"
616
+
617
+ #: inc/view/FolderShortcode.php:1
618
+ msgid "Thumbnail"
619
+ msgstr "Thumbnail"
620
+
621
+ #: inc/view/FolderShortcode.php:1
622
+ msgid "Medium"
623
+ msgstr "Medium"
624
+
625
+ #: inc/view/FolderShortcode.php:1
626
+ msgid "Large"
627
+ msgstr "Groß"
628
+
629
+ #: inc/view/FolderShortcode.php:1
630
+ msgid "Full Size"
631
+ msgstr "Volle Größe"
632
+
633
+ #: inc/view/Lang.php:1
634
+ msgid ""
635
+ "Subfolders are only available in the PRO version. But you can now create an "
636
+ "unlimited number of folders on the main level (instead of the previous max. "
637
+ "10 folders)."
638
+ msgstr ""
639
+ "Unterordner sind nur in der PRO Version verfügbar. Aber du kannst jetzt eine "
640
+ "unbegrenzte Anzahl von Ordnern auf der Hauptebene erstellen (statt der "
641
+ "bisherigen max. 10 Ordner)."
642
+
643
+ #: inc/view/Lang.php:1
644
+ msgid "No folder selected"
645
+ msgstr "Kein Ordner ausgewählt"
646
+
647
+ #: inc/view/Lang.php:1
648
+ msgid "Select folder"
649
+ msgstr "Zielordner auswählen"
650
+
651
+ #: inc/view/Lang.php:1
652
+ msgid "Reload content"
653
+ msgstr "Inhalt neuladen"
654
+
655
+ #: inc/view/Lang.php:1
656
+ msgid "Subfolders"
657
+ msgstr "Unterordner"
658
+
659
+ #: inc/view/Lang.php:1
660
+ msgid "Please select a folder (media library) in the block settings."
661
+ msgstr "Bitte wähle einen Ordner in den Block-Einstellungen aus."
662
+
663
+ #: inc/view/Lang.php:1
664
+ msgid "New folders inherit this restriction"
665
+ msgstr "Neue Unterordner erben diese Einschränkung"
666
+
667
+ #: inc/view/Lang.php:1
668
+ msgid "The current selected folder has some restrictions:"
669
+ msgstr "Der aktuell ausgewählte Ordner besitzt Einschränkungen:"
670
+
671
+ #: inc/view/Lang.php:1
672
+ msgid "You cannot change *parent* folder"
673
+ msgstr "Der *übergeordnete* Ordner darf nicht geändert werden"
674
+
675
+ #: inc/view/Lang.php:1
676
+ msgid "You cannot *rearrange* subfolders"
677
+ msgstr "Unterordner dürfen nicht neu *angeordnet* werden"
678
+
679
+ #: inc/view/Lang.php:1
680
+ msgid "You cannot *create* subfolders"
681
+ msgstr "Keine *Unterordner* erlaubt"
682
+
683
+ #: inc/view/Lang.php:1
684
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
685
+ msgstr ""
686
+ "Du kannst keine neuen Dateien *einfügen*. Neue Dateien werden nach "
687
+ "Unorganisiert verschoben…"
688
+
689
+ #: inc/view/Lang.php:1
690
+ msgid "You cannot *rename* the folder"
691
+ msgstr "Der Ordner darf nicht *umbenannt* werden"
692
+
693
+ #: inc/view/Lang.php:1
694
+ msgid "You cannot *delete* the folder"
695
+ msgstr "Der Ordner darf nicht *gelöscht* werden"
696
+
697
+ #: inc/view/Lang.php:1
698
+ msgid "You cannot *move* files outside the folder"
699
+ msgstr "Enthaltene Dateien dürfen nicht *verschoben* werden"
700
+
701
+ #: inc/view/Lang.php:1
702
+ msgid "Parent"
703
+ msgstr "Übergeordnet"
704
+
705
+ #: inc/view/Lang.php:1
706
+ msgid "Before this node"
707
+ msgstr "Vor diesem Eintrag"
708
+
709
+ #: inc/view/Lang.php:1
710
+ msgid "If no next node is given, the element is placed at the end."
711
+ msgstr "Wenn kein Eintrag ausgewählt, wird es an das Ende angehängt."
712
+
713
+ #: inc/view/Lang.php:1
714
+ msgid "The file is uploaded to the folder where you are currently in."
715
+ msgstr ""
716
+ "Die Datei wird in den Ordner hochgeladen, in dem du dich gerade befindest."
717
+
718
+ #: inc/view/Lang.php:1
719
+ msgid "Are you sure?"
720
+ msgstr "Bist du sicher?"
721
+
722
+ #: inc/view/Lang.php:1
723
+ msgid "Success"
724
+ msgstr "Erfolgreich"
725
+
726
+ #: inc/view/Lang.php:1
727
+ msgid "Failed"
728
+ msgstr "Fehlgeschlagen"
729
+
730
+ #: inc/view/Lang.php:1
731
+ msgid "No entries found"
732
+ msgstr "Keine Einträge gefunden"
733
+
734
+ #: inc/view/Lang.php:1
735
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
736
+ msgstr ""
737
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
738
+ "verschoben."
739
+
740
+ #: inc/view/Lang.php:1
741
+ msgid ""
742
+ "Are you sure to delete *{count} folders*? All files gets moved to "
743
+ "Unorganized."
744
+ msgstr ""
745
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
746
+ "verschoben."
747
+
748
+ #: inc/view/Lang.php:1
749
+ msgid "Ok"
750
+ msgstr "Ok"
751
+
752
+ #: inc/view/Lang.php:1
753
+ msgid "Cancel"
754
+ msgstr "Abbrechen"
755
+
756
+ #: inc/view/Lang.php:1
757
+ msgid "Save"
758
+ msgstr "Speichern"
759
+
760
+ #: inc/view/Lang.php:1
761
+ msgid "Back"
762
+ msgstr "Zurück"
763
+
764
+ #: inc/view/Lang.php:1
765
+ msgid "No folders found"
766
+ msgstr "Keine Ordner gefunden"
767
+
768
+ #: inc/view/Lang.php:1
769
+ msgid ""
770
+ "No folders have been created yet. Just click on the button above to create "
771
+ "your first folder."
772
+ msgstr ""
773
+ "Bisher wurden keine Ordner angelegt. Klicke auf den obigen Button, um deinen "
774
+ "ersten Ordner zu erstellen."
775
+
776
+ #: inc/view/Lang.php:1
777
+ msgid "Folders"
778
+ msgstr "Ordner"
779
+
780
+ #: inc/view/Lang.php:1
781
+ msgid "No search results."
782
+ msgstr "Keine Suchergebnisse."
783
+
784
+ #: inc/view/Lang.php:1
785
+ msgid "Renaming to *{name}*…"
786
+ msgstr "Umbenennen in *{name}*…"
787
+
788
+ #: inc/view/Lang.php:1
789
+ msgid "Successfully renamed folder to *{name}*"
790
+ msgstr "Ordner erfolgreich in *{name}* umbenannt"
791
+
792
+ #: inc/view/Lang.php:1
793
+ msgid "Creating *{name}*…"
794
+ msgstr "Erstelle *{name}*…"
795
+
796
+ #: inc/view/Lang.php:1
797
+ msgid "Successfully created *{name}*"
798
+ msgstr "Erfolgreich *{name}* erstellt"
799
+
800
+ #: inc/view/Lang.php:1
801
+ msgid "Deleting *{name}*…"
802
+ msgstr "Löschen von *{name}*…"
803
+
804
+ #: inc/view/Lang.php:1
805
+ msgid "Successfully deleted *{name}*"
806
+ msgstr "Erfolgreich *{name}* gelöscht"
807
+
808
+ #: inc/view/Lang.php:1
809
+ msgid "Successfully deleted *{count} folders*"
810
+ msgstr "*{count} Order* erfolgreich geschlöscht"
811
+
812
+ #: inc/view/Lang.php:1
813
+ msgid "Rearrange *{name}* placement manually"
814
+ msgstr "Ordne *{name}* manuell an"
815
+
816
+ #: inc/view/Lang.php:1
817
+ msgid "Reordering the tree hierarchy…"
818
+ msgstr "Der Baum wird neu angeordnet…"
819
+
820
+ #: inc/view/Lang.php:1
821
+ msgid "Successfully sorted the tree hierarchy"
822
+ msgstr "Der Baum wurde erfolgreich neu angeordnet"
823
+
824
+ #: inc/view/Lang.php:1
825
+ msgid "Reorder subfolders of *{name}*…"
826
+ msgstr "Unterordner von *{name}* werden neu angeordnet…"
827
+
828
+ #: inc/view/Lang.php:1
829
+ msgid "{count} files remaining…"
830
+ msgstr "{count} Dateien verbleibend…"
831
+
832
+ #: inc/view/Lang.php:1
833
+ msgid "Receiving data…"
834
+ msgstr "Empfange Daten…"
835
+
836
+ #: inc/view/Lang.php:1
837
+ msgid "Shortcut"
838
+ msgstr "Verknüpfung"
839
+
840
+ #: inc/view/Lang.php:1
841
+ msgid ""
842
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
843
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
844
+ "do this in the original file (for example replace media file through a "
845
+ "plugin).\n"
846
+ "Note also that the fields in the shortcuts can be different to the original "
847
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
848
+ msgstr ""
849
+ "Dies ist eine Datei-Verknüpfung. Verknüpfungen brauchen keinen physischen "
850
+ "Speicherplatz *(0 kB)*. Wenn du die Datei selbst bearbeiten möchtest, musst "
851
+ "du das für die Original-Datei tun (Beispiel: Ersetzen der Datei durch ein "
852
+ "Plugin).\n"
853
+ "Beachte auch, dass Felder wie der Titel und Beschreibung unterschiedlich zur "
854
+ "Original-Datei sein können."
855
+
856
+ #: inc/view/Lang.php:1
857
+ msgid ""
858
+ "In the current view of uploads, filters are active. Please reset them and "
859
+ "refresh the view."
860
+ msgstr ""
861
+ "Im Moment sind Filter aktiv. Bitte setze diese zurück und aktualisiere die "
862
+ "Ansicht."
863
+
864
+ #: inc/view/Lang.php:1
865
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
866
+ msgstr ""
867
+ "Eine Kollektion darf keine Dateien enthalten. Datei wird nach Unorganisiert "
868
+ "verschoben…"
869
+
870
+ #: inc/view/Lang.php:1
871
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
872
+ msgstr ""
873
+ "Eine Galerie darf nur Bilder enthalten. Datei wird nach Unorganisiert "
874
+ "verschoben…"
875
+
876
+ #: inc/view/Lang.php:1
877
+ msgid "Order content by *{name}*…"
878
+ msgstr "Ordne Inhalt nach *{name}*…"
879
+
880
+ #: inc/view/Lang.php:1
881
+ msgid "Order content by drag & drop"
882
+ msgstr "Ordne Inhalte per Drag&Drop"
883
+
884
+ #: inc/view/Lang.php:1
885
+ msgid "Reset order"
886
+ msgstr "Reihenfolge zurücksetzen"
887
+
888
+ #: inc/view/Lang.php:1
889
+ msgid "Apply order once…"
890
+ msgstr "Einmalige Sortierung anwenden…"
891
+
892
+ #: inc/view/Lang.php:1
893
+ msgid "Last"
894
+ msgstr "zuletzt"
895
+
896
+ #: inc/view/Lang.php:1
897
+ msgid "Deactivate automatic ordering"
898
+ msgstr "Deaktiviere automatische Sortierung"
899
+
900
+ #: inc/view/Lang.php:1
901
+ msgid "Apply automatic order…"
902
+ msgstr "Automatische Sortierung anwenden…"
903
+
904
+ #: inc/view/Lang.php:1
905
+ msgid "Latest"
906
+ msgstr "Aktuell"
907
+
908
+ #: inc/view/Lang.php:1
909
+ msgid "Reindex order"
910
+ msgstr "Reihenfolge reparieren"
911
+
912
+ #: inc/view/Lang.php:1
913
+ msgid "Reset to last order"
914
+ msgstr "Letzte Reihenfolge wiederherstellen"
915
+
916
+ #: inc/view/Lang.php:1
917
+ msgid "All files"
918
+ msgstr "Alle Dateien"
919
+
920
+ #: inc/view/Lang.php:1
921
+ msgid "Move {count} files"
922
+ msgstr "Verschiebe {count} Dateien"
923
+
924
+ #: inc/view/Lang.php:1
925
+ msgid "Move one file"
926
+ msgstr "Verschiebe Datei"
927
+
928
+ #: inc/view/Lang.php:1
929
+ msgid "Copy {count} files"
930
+ msgstr "Kopiere {count} Dateien"
931
+
932
+ #: inc/view/Lang.php:1
933
+ msgid "Copy one file"
934
+ msgstr "Kopiere Datei"
935
+
936
+ #: inc/view/Lang.php:1
937
+ msgid "Moving {count} files…"
938
+ msgstr "{count} Dateien verschieben…"
939
+
940
+ #: inc/view/Lang.php:1
941
+ msgid "Moving one file…"
942
+ msgstr "Datei verschieben…"
943
+
944
+ #: inc/view/Lang.php:1
945
+ msgid "Copying {count} files…"
946
+ msgstr "{count} Dateien kopieren…"
947
+
948
+ #: inc/view/Lang.php:1
949
+ msgid "Copying one file…"
950
+ msgstr "Datei kopieren…"
951
+
952
+ #: inc/view/Lang.php:1
953
+ msgid "Successfully moved {count} files"
954
+ msgstr "{count} Dateien erfolgreich verschoben"
955
+
956
+ #: inc/view/Lang.php:1
957
+ msgid "Successfully moved one file"
958
+ msgstr "Datei erfolgreich verschoben"
959
+
960
+ #: inc/view/Lang.php:1
961
+ msgid "Successfully copied {count} files"
962
+ msgstr "{count} Dateien erfolgreich kopiert"
963
+
964
+ #: inc/view/Lang.php:1
965
+ msgid "Successfully copied one file"
966
+ msgstr "Datei erfolgreich kopiert"
967
+
968
+ #: inc/view/Lang.php:1
969
+ msgid "Hold any key to create a shortcut"
970
+ msgstr "Eine Taste festhalten, um Datei zu kopieren"
971
+
972
+ #: inc/view/Lang.php:1
973
+ msgid "Release key to move file"
974
+ msgstr "Taste loslassen, um Datei zu verschieben"
975
+
976
+ #: inc/view/Lang.php:1
977
+ msgid "Click this to create a new folder"
978
+ msgstr "Klicke hier, um einen neuen Ordner anzulegen"
979
+
980
+ #: inc/view/Lang.php:1
981
+ msgid ""
982
+ "A folder can contain any file type and collection, but not galleries. If you "
983
+ "want to create a subfolder, select a folder and click this button."
984
+ msgstr ""
985
+ "Ein Ordner kann jeden Dateitypen und Kollektionen enthalten, jedoch keine "
986
+ "Galerien. Wenn du einen Unterordner erstellen möchtest, selektiere einen "
987
+ "Ordner und klicke diesen Button."
988
+
989
+ #: inc/view/Lang.php:1
990
+ msgid "Click this to create a new collection"
991
+ msgstr "Klicke hier, um eine neue Kollektion anzulegen"
992
+
993
+ #: inc/view/Lang.php:1
994
+ msgid ""
995
+ "A collection cannot contain files. However, you can create additional "
996
+ "collections and *galleries* there. This gallery is only a *gallery data "
997
+ "folder*, i.e. they are not automatically visible on the website.\n"
998
+ "\n"
999
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
1000
+ "on your pages/postings."
1001
+ msgstr ""
1002
+ "Eine Kollektion kann keine Dateien enthalten. Dort können jedoch weitere "
1003
+ "Kollektionen und *Galerien* angelegt werden. Diese Galerie ist nur ein "
1004
+ "*Galerie-Daten-Ordner*, d. h. diese sind nicht automatisch auf der Webseite "
1005
+ "zu sehen.\n"
1006
+ "\n"
1007
+ "Eine *visuelle Galerie* kann durch einen Shortcode im Visual Editor auf "
1008
+ "deinen Seiten/Beiträgen erstellt werden."
1009
+
1010
+ #: inc/view/Lang.php:1
1011
+ msgid "Click this to create a *new gallery data folder*"
1012
+ msgstr "Klicke hier, um einen neuen *Galerie-Daten-Ordner* anzulegen"
1013
+
1014
+ #: inc/view/Lang.php:1
1015
+ msgid ""
1016
+ "A *gallery data folder* can only contain images. It is easier for you to "
1017
+ "distinguish where your visual galleries are located.\n"
1018
+ "\n"
1019
+ "You can also order the images into *a custom image order* per drag&drop."
1020
+ msgstr ""
1021
+ "Ein *Galerie-Daten-Ordner* kann nur Bilder enthalten - für dich ist es dann "
1022
+ "einfach zu entscheiden, wo deine visuellen Galerien liegen.\n"
1023
+ "\n"
1024
+ "Sie können per Drag & Drop eine *benutzerdefinierte Reihenfolge* erstellen."
1025
+
1026
+ #: inc/view/Lang.php:1
1027
+ msgid "Settings"
1028
+ msgstr "Einstellungen"
1029
+
1030
+ #: inc/view/Lang.php:1
1031
+ msgid "General settings for the current logged in user."
1032
+ msgstr "Allgemeine Einstellungen für den eingeloggten Benutzer."
1033
+
1034
+ #: inc/view/Lang.php:1
1035
+ msgid "Permissions"
1036
+ msgstr "Berechtigungen"
1037
+
1038
+ #: inc/view/Lang.php:1
1039
+ msgid "Reorder files in this folder"
1040
+ msgstr "Dateien sortieren"
1041
+
1042
+ #: inc/view/Lang.php:1
1043
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1044
+ msgstr "Ordne die Dateien / Bilder nach *Titel, Dateiname, ID, …*"
1045
+
1046
+ #: inc/view/Lang.php:1
1047
+ msgid "Refresh"
1048
+ msgstr "Neuladen"
1049
+
1050
+ #: inc/view/Lang.php:1
1051
+ msgid "Refreshes the current folder view."
1052
+ msgstr "Aktualisiert die aktuelle Ordneransicht."
1053
+
1054
+ #: inc/view/Lang.php:1
1055
+ msgid "Rename"
1056
+ msgstr "Umbenennen"
1057
+
1058
+ #: inc/view/Lang.php:1
1059
+ msgid "Rename the current selected folder."
1060
+ msgstr "Den aktuell ausgewählten Ordner umbenennen."
1061
+
1062
+ #: inc/view/Lang.php:1
1063
+ msgid "Delete"
1064
+ msgstr "Löschen"
1065
+
1066
+ #: inc/view/Lang.php:1
1067
+ msgid "Delete the current selected folder."
1068
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1069
+
1070
+ #: inc/view/Lang.php:1
1071
+ msgid "Delete the current selected folders."
1072
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1073
+
1074
+ #: inc/view/Lang.php:1
1075
+ msgid "Rearrange"
1076
+ msgstr "Neu anordnen"
1077
+
1078
+ #: inc/view/Lang.php:1
1079
+ msgid "Change the hierarchical order of the folders."
1080
+ msgstr "Ändern der hierarchischen Anordnung der Ordner."
1081
+
1082
+ #: inc/view/Lang.php:1
1083
+ msgid "Folder details"
1084
+ msgstr "Ordner Details"
1085
+
1086
+ #: inc/view/Lang.php:1
1087
+ msgid "Select a folder and view more details about it."
1088
+ msgstr "Selektiere einen Ordner, um mehr Details anzuzeigen."
1089
+
1090
+ #: inc/view/Lang.php:1
1091
+ msgid "Product license not yet activated."
1092
+ msgstr "Produkt-Lizenz noch nicht aktiviert."
1093
+
1094
+ #: inc/view/Lang.php:1
1095
+ msgid "Enter license"
1096
+ msgstr "Lizenzschlüssel eingeben"
1097
+
1098
+ #: inc/view/Lang.php:1
1099
+ msgid "Dismiss notice"
1100
+ msgstr "Meldung ausblenden"
1101
+
1102
+ #: inc/view/Lang.php:1
1103
+ msgid ""
1104
+ "It looks like you have already used another plugin for folders in the media "
1105
+ "library."
1106
+ msgstr ""
1107
+ "Es scheint, als hättest Du zuvor ein anderes Plugin zur "
1108
+ "Medienkategorisierung verwendet."
1109
+
1110
+ #: inc/view/Lang.php:1
1111
+ msgid "Start importing"
1112
+ msgstr "Import starten"
1113
+
1114
+ #: inc/view/Lang.php:1
1115
+ msgid "Dismiss"
1116
+ msgstr "Ausblenden"
1117
+
1118
+ #: inc/view/Lang.php:1
1119
+ msgid ""
1120
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1121
+ "do not change when you move the file. Learn more about <a href=\"https://"
1122
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1123
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1124
+ "files to physical folders.</a>"
1125
+ msgstr ""
1126
+ "Real Media Library erstellt eine virtuelle Ordnerstruktur. Die URLs der "
1127
+ "Uploads ändern sich nicht, wenn du die Datei verschiebst. Erfahre mehr "
1128
+ "darüber, wie du <a href=\"https://devowl.io/knowledge-base/how-can-i-"
1129
+ "physically-reflect-the-virtual-folder-structure-to-my-file-system/\" target="
1130
+ "\"_blank\">Dateien automatisch in physische Ordner verschieben kannst.</a>"
1131
+
1132
+ #: inc/view/Lang.php:1
1133
+ msgid ""
1134
+ "You will be redirected to the external website of PRO version. Please "
1135
+ "confirm to continue!"
1136
+ msgstr ""
1137
+ "Sie werden auf die externe Website der PRO-Version weitergeleitet. Bitte "
1138
+ "bestätige die Fortsetzung!"
1139
+
1140
+ #: inc/view/Lang.php:1
1141
+ msgid "PRO Feature"
1142
+ msgstr "PRO Feature"
1143
+
1144
+ #: inc/view/Lang.php:1
1145
+ msgid "Hide for 20 days"
1146
+ msgstr "20 Tage verstecken"
1147
+
1148
+ #: inc/view/Lang.php:1
1149
+ msgid "Thanks for using the free version of Real Media Library."
1150
+ msgstr ""
1151
+ "Vielen Dank für die Nutzung der kostenlosen Version von Real Media Library."
1152
+
1153
+ #: inc/view/Lang.php:1
1154
+ msgid "Get PRO!"
1155
+ msgstr "Hole dir PRO!"
1156
+
1157
+ #: inc/view/Lang.php:1
1158
+ msgid "I want to learn more!"
1159
+ msgstr "Ich will mehr erfahren!"
1160
+
1161
+ #: inc/view/Lang.php:1
1162
+ msgid "No, not interested…"
1163
+ msgstr "Nein, kein Interesse…"
1164
+
1165
+ #: inc/view/Lang.php:1
1166
+ msgid "You like collections?"
1167
+ msgstr "Magst Du Kollektionen?"
1168
+
1169
+ #: inc/view/Lang.php:1
1170
+ msgid ""
1171
+ "Get more organized with different types of folders: Collections and "
1172
+ "galleries help you to easily recognize where your image galleries are "
1173
+ "located."
1174
+ msgstr ""
1175
+ "Sorgen für mehr Ordnung mit verschiedenen Arten von Ordnern: Sammlungen und "
1176
+ "Galerien helfen dir leicht zu erkennen, wo sich deine Bildergalerien "
1177
+ "befinden."
1178
+
1179
+ #: inc/view/Lang.php:1
1180
+ msgid "Custom content order?"
1181
+ msgstr "Dateien sortieren?"
1182
+
1183
+ #: inc/view/Lang.php:1
1184
+ msgid ""
1185
+ "Get your folder contents in order and arrange your files according to a "
1186
+ "criterion (e.g. name descending) or by drag & drop."
1187
+ msgstr ""
1188
+ "Bringen Ordnung in deinen Ordnerinhalt und ordne deine Dateien nach einem "
1189
+ "Kriterium (z.B. Name absteigend) oder per Drag & Drop an."
1190
+
1191
+ #: inc/view/Lang.php:1
1192
+ msgid "Full order control?"
1193
+ msgstr "Volle Kontrolle über die Sortierung?"
1194
+
1195
+ #: inc/view/Lang.php:1
1196
+ msgid ""
1197
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1198
+ "name descending) or by drag & drop."
1199
+ msgstr ""
1200
+ "Organisiere die Knoten innerhalb deines Ordnerbaums nach einem Kriterium (z."
1201
+ "B. Name absteigend) oder per Drag & Drop an."
1202
+
1203
+ #: inc/view/Lang.php:1
1204
+ msgid "Want to create subfolders?"
1205
+ msgstr "Unterordner erstellen?"
1206
+
1207
+ #: inc/view/Lang.php:1
1208
+ msgid ""
1209
+ "Subfolders offer you the possibility to bring more structure into your media "
1210
+ "library. They help you to keep the overview, even if you really have many "
1211
+ "files in your media library."
1212
+ msgstr ""
1213
+ "Unterordner bieten dir die Möglichkeit, mehr Struktur in deine "
1214
+ "Medienbibliothek zu bringen. Sie helfen dir, den Überblick zu behalten, auch "
1215
+ "wenn du wirklich viele Dateien in deiner Mediathek hast."
1216
+
1217
+ #: inc/view/Lang.php:1
1218
+ msgid "Want to switch between folders more comfortably?"
1219
+ msgstr "Komfortabler zwischen den Ordnern wechseln?"
1220
+
1221
+ #: inc/view/Lang.php:1
1222
+ msgid ""
1223
+ "Let the complete folder tree as in your media library also be displayed in "
1224
+ "this dialog instead of searching each time in the dropdown. It is simply "
1225
+ "more comfortable!"
1226
+ msgstr ""
1227
+ "Lass dir den kompletten Ordnerbaum wie in deiner Medienbibliothek auch in "
1228
+ "diesem Dialog anzeigen, anstatt jedes Mal im Dropdown zu suchen. Das ist "
1229
+ "einfach komfortabler!"
1230
+
1231
+ #: inc/view/Lang.php:1
1232
+ msgid "Want to upload entire folders?"
1233
+ msgstr "Möchtest du ganze Ordner hochladen?"
1234
+
1235
+ #: inc/view/Lang.php:1
1236
+ msgid ""
1237
+ "With Real Media Library you can upload entire folders using drag and drop. "
1238
+ "All folders, subfolders and files will be uploaded and displayed in your "
1239
+ "media library in the same structure. Get PRO to upload folders!"
1240
+ msgstr ""
1241
+ "Mit Real Media Library kannst du ganze Ordner per Drag & Drop hochladen. "
1242
+ "Alle Ordner, Unterordner und Dateien werden hochgeladen und in deiner "
1243
+ "Medienbibliothek in der gleichen Struktur angezeigt. Hol dir PRO zum "
1244
+ "Hochladen von Ordnern!"
1245
+
1246
+ #: inc/view/Options.php:1
1247
+ msgid "RealMediaLibrary:General"
1248
+ msgstr "RealMediaLibrary:Allgemein"
1249
+
1250
+ #: inc/view/Options.php:1
1251
+ msgid "Load RML functionality in frontend"
1252
+ msgstr "Lade RML-Funktionalitäten im Frontend"
1253
+
1254
+ #: inc/view/Options.php:1
1255
+ msgid "RealMediaLibrary:Reset"
1256
+ msgstr "RealMediaLibrary:Zurücksetzen"
1257
+
1258
+ #: inc/view/Options.php:1
1259
+ msgid "Reset the order of all galleries"
1260
+ msgstr "Die Reihenfolge aller Galerien zurücksetzen"
1261
+
1262
+ #: inc/view/Options.php:1
1263
+ msgid "Wipe all settings (folders, attachment relations)"
1264
+ msgstr ""
1265
+ "Alle Einstellungen zurücksetzen (Ordner, Medien-Beziehungen zu den Ordnern)"
1266
+
1267
+ #: inc/view/Options.php:1
1268
+ msgid "Reset folder count cache"
1269
+ msgstr "Ordneranzahl-Cache zurücksetzen"
1270
+
1271
+ #: inc/view/Options.php:1
1272
+ msgid "Reset names, slugs and absolute pathes"
1273
+ msgstr "Namen, Slugs und absolute Pfade zurücksetzen"
1274
+
1275
+ #: inc/view/Options.php:1
1276
+ msgid "Wipe attachment relations"
1277
+ msgstr "Setze Medien-Beziehungen zurück"
1278
+
1279
+ #: inc/view/Options.php:1
1280
+ msgid "Wipe all"
1281
+ msgstr "Setze alles zurück"
1282
+
1283
+ #: inc/view/Options.php:1
1284
+ msgid "Reset count"
1285
+ msgstr "Anzahl zurücksetzen"
1286
+
1287
+ #: inc/view/Options.php:1
1288
+ msgid "Reset"
1289
+ msgstr "Zurücksetzen"
1290
+
1291
+ #: inc/view/Options.php:1
1292
+ msgid ""
1293
+ "Activate this option if you are using a page builder like Divi Page Builder, "
1294
+ "WPBakery Page Builder or Elementor."
1295
+ msgstr ""
1296
+ "Aktiviere diese Option, wenn du einen Page Builder wie Divi Page Builder, "
1297
+ "WPBakery Page Builder oder Elementor verwendest."
1298
+
1299
+ #: inc/view/Options.php:1
1300
+ msgid "You can also reset an single folder in its folder details."
1301
+ msgstr "Du kannst auch einen einzelnen Ordner zurücksetzen."
1302
+
1303
+ #: inc/view/View.php:1
1304
+ msgid "All"
1305
+ msgstr "Alles"
1306
+
1307
+ #: inc/view/View.php:1
1308
+ msgid "Unorganized pictures"
1309
+ msgstr "Unorganisierte Bilder"
languages/real-media-library-de_DE_formal.mo ADDED
Binary file
languages/real-media-library-de_DE_formal.po ADDED
@@ -0,0 +1,1309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
4
+ "POT-Creation-Date: n/a\n"
5
+ "PO-Revision-Date: 2021-10-12 08:40+0000\n"
6
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
7
+ "Language-Team: German <https://translate.devowl.io/projects/wordpress-real-"
8
+ "media-library-backend-php/develop/de/>\n"
9
+ "Language: de_DE_formal\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: Weblate 4.8\n"
15
+
16
+ #. Plugin Name of the plugin
17
+ msgid "Real Media Library"
18
+ msgstr "Real Media Library"
19
+
20
+ #. Plugin URI of the plugin
21
+ msgid "https://devowl.io/wordpress-real-media-library/"
22
+ msgstr "https://devowl.io/de/wordpress-real-media-library/"
23
+
24
+ #. Description of the plugin
25
+ msgid ""
26
+ "Organize uploaded media in folders, collections and galleries: A file "
27
+ "manager for WordPress. Media management made easy!"
28
+ msgstr ""
29
+ "Organisiere hochgeladene Medien in Ordnern, Sammlungen und Galerien: Ein "
30
+ "Dateimanager für WordPress. Medienmanagement leicht gemacht!"
31
+
32
+ #. Author of the plugin
33
+ msgid "devowl.io"
34
+ msgstr "devowl.io"
35
+
36
+ #. Author URI of the plugin
37
+ msgid "https://devowl.io"
38
+ msgstr "https://devowl.io/de/"
39
+
40
+ #: inc/AdInitiator.php:1
41
+ msgid "Complete file and folder manager"
42
+ msgstr "Vollständiger Datei- und Ordnermanager"
43
+
44
+ #: inc/AdInitiator.php:1
45
+ msgid ""
46
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
47
+ "media management. You can use this plugin to organize the thousands of "
48
+ "images, audio, video and PDF files in your media library into folders. "
49
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
50
+ "WordPress."
51
+ msgstr ""
52
+ "Real Media Library ist ein WordPress-Plugin, das dir eine erweiterte "
53
+ "Medienverwaltung ermöglicht. Mit diesem Plugin kannst du die tausende "
54
+ "Bilder, Audio-, Video- und PDF-Dateien in Ihrer Medienbibliothek in Ordnern "
55
+ "organisieren. Im Grunde ist es ein Dateimanager wie Windows Explorer oder "
56
+ "Mac Finder, aber für WordPress."
57
+
58
+ #: inc/AdInitiator.php:1
59
+ msgid "Filter in insert media dialog"
60
+ msgstr "Filter im Dialog “Medien einfügen”"
61
+
62
+ #: inc/AdInitiator.php:1
63
+ msgid ""
64
+ "No matter where you are, the folder structure of Real Media Library is "
65
+ "always where you can select files. For example in the dialog for selecting a "
66
+ "\"Featured Image\"."
67
+ msgstr ""
68
+ "Egal, wo du dich befindest, die Ordnerstruktur von Real Media Library ist "
69
+ "immer dort, wo du Dateien auswählen kannst. Zum Beispiel im Dialog zur "
70
+ "Auswahl eines “Beitragsbild”."
71
+
72
+ #: inc/AdInitiator.php:1
73
+ msgid ""
74
+ "In the Lite version you can only select the folder by a simple dropdown."
75
+ msgstr ""
76
+ "In der Lite Version kannst du den Ordner nur über ein einfaches Dropdown "
77
+ "auswählen."
78
+
79
+ #: inc/AdInitiator.php:1
80
+ msgid "Custom image order"
81
+ msgstr "Benutzerdefinierte Bildreihenfolge"
82
+
83
+ #: inc/AdInitiator.php:1
84
+ msgid ""
85
+ "Organizing your media files is really easy with the Real Media Library "
86
+ "plugin. You can arrange the order of your files yourself by dragging and "
87
+ "dropping. This allows you to move important files to the top for faster "
88
+ "access."
89
+ msgstr ""
90
+ "Die Organisation deiner Mediendateien ist mit dem Real Media Library Plugin "
91
+ "wirklich einfach. Du kannst die Reihenfolge deiner Dateien selbst durch Drag "
92
+ "& Drop festlegen. Dadurch kannst du wichtige Dateien für einen schnelleren "
93
+ "Zugriff an den Anfang verschieben."
94
+
95
+ #: inc/AdInitiator.php:1
96
+ msgid "Get your PRO license now!"
97
+ msgstr "Holen dir jetzt deine PRO-Lizenz!"
98
+
99
+ #: inc/api/attachment.php:1
100
+ msgid "The given folder was not found."
101
+ msgstr "Der angegebene Ordner wurde nicht gefunden."
102
+
103
+ #: inc/Assets.php:1
104
+ msgid "Complementary Plugins"
105
+ msgstr "Erweiterungen"
106
+
107
+ #: inc/Assets.php:1
108
+ msgid ""
109
+ "\n"
110
+ "\n"
111
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
112
+ "deleted.\n"
113
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
114
+ "deleted, too."
115
+ msgstr ""
116
+ "\n"
117
+ "\n"
118
+ "Beachte: Wenn du eine Verknüpfung löscht, wird die Originaldatei nicht "
119
+ "gelöscht.\n"
120
+ "Wenn du eine normale Datei löscht, werden alle dazugehörigen Verknüpfungen "
121
+ "auch gelöscht."
122
+
123
+ #: inc/attachment/CustomField.php:1
124
+ msgid ""
125
+ "If you move this shortcut, the location of the source/main file is not "
126
+ "changed."
127
+ msgstr ""
128
+ "Wenn du diese Verknüpfung verschiebst, wird der Ordner der Originaldatei "
129
+ "nicht verändert."
130
+
131
+ #: inc/attachment/CustomField.php:1
132
+ msgid ""
133
+ "If you move this attachment, the folder location of the associated shortcuts "
134
+ "are not changed."
135
+ msgstr ""
136
+ "Wenn du diese Datei verschiebst, werden die Ordner der dazugehörigen "
137
+ "Verknüpfungen nicht verändert."
138
+
139
+ #: inc/attachment/CustomField.php:1
140
+ msgid "Move to another folder"
141
+ msgstr "Verschiebe Datei in anderen Ordner"
142
+
143
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
144
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
145
+ msgid "Folder"
146
+ msgstr "Ordner"
147
+
148
+ #: inc/attachment/CustomField.php:1
149
+ msgid "Shortcut infos"
150
+ msgstr "Verknüpfung"
151
+
152
+ #: inc/attachment/CustomField.php:1
153
+ msgid ""
154
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
155
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
156
+ "itself, you must do this in the original file (for example replace media "
157
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
158
+ "be different to the original file, for example \"Title\", \"Description\" or "
159
+ "\"Caption\"."
160
+ msgstr ""
161
+ "Dies ist eine Verknüpfung. Verknüpfungen brauchen keinen physikalischen "
162
+ "Speicherplatz <strong>(0 kB)</strong>. Wenn du die Datei selbst ändern "
163
+ "möchten, verändere die Originaldatei (bspw. Ersetzen der Datei durch ein "
164
+ "Plugin).<br/>Beachten auch, dass die Felder in der Verknüpfung "
165
+ "unterschiedlich zur Originaldatei sein können, zum Beispiel “Titel”, "
166
+ "“Beschreibung”."
167
+
168
+ #. translators:
169
+ #: inc/attachment/CustomField.php:1
170
+ msgid "For this file is %d shortcut available in the following folder:"
171
+ msgid_plural ""
172
+ "For this file are %d shortcuts available in the following folders:"
173
+ msgstr[0] "Für diese Datei gibt es eine Verknüpfung im folgenden Ordner:"
174
+ msgstr[1] ""
175
+ "Für diese Datei sind %s Verknüpfungen verfügbar in folgenden Ordnern:"
176
+
177
+ #: inc/attachment/CustomField.php:1
178
+ msgid ""
179
+ "This file has no associated shortcuts. You can create shortcuts by moving "
180
+ "files per mouse and hold any key."
181
+ msgstr ""
182
+ "Die Datei hat keine zugehörige Verknüpfung. Du kannst Verknüpfung erstellen, "
183
+ "indem du per Drag&Drop die Datei bewegst und eine beliebige Taste hältst."
184
+
185
+ #: inc/attachment/Permissions.php:1
186
+ msgid "You are not allowed to insert files here."
187
+ msgstr "Du hast keine Berechtigung, hier neue Dateien hinzuzufügen."
188
+
189
+ #: inc/attachment/Permissions.php:1
190
+ msgid "You are not allowed to move the file."
191
+ msgstr "Du hast keine Berechtigung, die Datei zu verschieben."
192
+
193
+ #: inc/attachment/Permissions.php:1
194
+ msgid "You are not allowed to create a subfolder here."
195
+ msgstr "Du hast keine Berechtigung hier Unterordner zu erstellen."
196
+
197
+ #: inc/attachment/Permissions.php:1
198
+ msgid "You are not allowed to delete this folder."
199
+ msgstr "Du hast keine Berechtigung den Ordner zu löschen."
200
+
201
+ #: inc/attachment/Permissions.php:1
202
+ msgid "You are not allowed to rename this folder."
203
+ msgstr "Du hast keine Berechtigung den Ordner umzubenennen."
204
+
205
+ #: inc/attachment/Upload.php:1
206
+ msgid "Select destination folder"
207
+ msgstr "Zielordner auswählen"
208
+
209
+ #: inc/attachment/Upload.php:1
210
+ msgid ""
211
+ "You can simply upload files directly to a folder. Select a folder and upload "
212
+ "files."
213
+ msgstr "Du kannst Dateien direkt in einen Ordner hochladen."
214
+
215
+ #: inc/attachment/Upload.php:1
216
+ msgid "upload to folder"
217
+ msgstr "in den Ordner hochladen"
218
+
219
+ #: inc/comp/ExImport.php:1
220
+ msgid "RealMediaLibrary:Import / Export"
221
+ msgstr "RealMediaLibrary:Import / Export"
222
+
223
+ #: inc/comp/ExImport.php:1
224
+ msgid "Import from other plugins"
225
+ msgstr "Von anderen Plugins importieren"
226
+
227
+ #: inc/comp/ExImport.php:1
228
+ msgid "Export / Import Real Media Library folders"
229
+ msgstr "Export / Image Real Media Library Ordner"
230
+
231
+ #: inc/comp/ExImport.php:1
232
+ msgid "Export"
233
+ msgstr "Exportieren"
234
+
235
+ #: inc/comp/ExImport.php:1
236
+ msgid "Import"
237
+ msgstr "Importieren"
238
+
239
+ #: inc/comp/ExImport.php:1
240
+ msgid ""
241
+ "All available folders will be exported. The current structure is not lost "
242
+ "during import - but check that there are no duplicate names in the import "
243
+ "data, as these are not checked."
244
+ msgstr ""
245
+ "Exportiert werden alle verfügbaren Ordner. Beim Import geht die aktuelle "
246
+ "Struktur nicht verloren - prüfe aber, dass bei den Import-Daten keine "
247
+ "doppelten Namen vorkommen, da diese nicht geprüft werden."
248
+
249
+ #: inc/comp/ExImport.php:1
250
+ msgid "Exported data:"
251
+ msgstr "Exportieren:"
252
+
253
+ #: inc/comp/ExImport.php:1
254
+ msgid "Import data:"
255
+ msgstr "Importieren:"
256
+
257
+ #: inc/comp/ExImport.php:1
258
+ msgid "Importing data is only available in PRO version."
259
+ msgstr "Das Importieren von Daten ist nur in der PRO-Version verfügbar."
260
+
261
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
262
+ #: inc/view/Lang.php:1
263
+ msgid "Learn more about PRO"
264
+ msgstr "Erfahre mehr über PRO"
265
+
266
+ #: inc/comp/ExImport.php:1
267
+ msgid "Imports categories and post relations."
268
+ msgstr "Importiert Kategorien und Beziehungen."
269
+
270
+ #: inc/comp/ExImport.php:1
271
+ msgid "Nothing to import."
272
+ msgstr "Nichts zu importieren."
273
+
274
+ #: inc/comp/ExImport.php:1
275
+ msgid ""
276
+ "Importing categories from another plugin is only available in PRO version."
277
+ msgstr ""
278
+ "Der Import von Kategorien aus einem anderen Plugin ist nur in der PRO-"
279
+ "Version verfügbar."
280
+
281
+ #: inc/comp/ExportMediaLibrary.php:1
282
+ msgid "No valid folder."
283
+ msgstr "Kein gültiger Ordner."
284
+
285
+ #: inc/comp/ExportMediaLibrary.php:1
286
+ msgid "No valid type."
287
+ msgstr "Kein gültiger Typ."
288
+
289
+ #: inc/comp/PolyLang.php:1
290
+ msgid "PolyLang: Automatically move translations"
291
+ msgstr "PolyLang: Automatisch Übersetzungen verschieben"
292
+
293
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
294
+ msgid ""
295
+ "If you move a file, the corresponding translated file will also be moved."
296
+ msgstr ""
297
+ "Wenn du eine Datei verschiebst, wird auch die dazugehörigen übersetzte Datei "
298
+ "verschoben."
299
+
300
+ #: inc/comp/WPML.php:1
301
+ msgid "WPML: Automatically move translations"
302
+ msgstr "WPML: Automatisch übersetzte Bilder in Ordner verschieben"
303
+
304
+ #. translators:
305
+ #: inc/exception/FolderAlreadyExistsException.php:1
306
+ msgid "'%s' already exists in this folder."
307
+ msgstr "'%s' existiert bereits in diesem Ordner."
308
+
309
+ #. translators:
310
+ #: inc/exception/OnlyInProVersionException.php:1
311
+ msgid "This functionality is not available in the free version (%s)."
312
+ msgstr ""
313
+ "Diese Funktionalität ist in der kostenlosen Version (%s) nicht verfügbar."
314
+
315
+ #: inc/folder/Creatable.php:1
316
+ msgid "You need to provide a set of files."
317
+ msgstr "Du musst mehrere Dateien bereitstellen."
318
+
319
+ #: inc/folder/Creatable.php:1
320
+ msgid "The folder could not be created in the database."
321
+ msgstr "Der Ordner konnte nicht in die Datenbank geschrieben werden."
322
+
323
+ #: inc/folder/Creatable.php:1
324
+ msgid "The folder could not be created because it already exists."
325
+ msgstr "Der Ordner konnte nicht erstellt werden, da er bereits existiert."
326
+
327
+ #: inc/folder/Creatable.php:1
328
+ msgid ""
329
+ "A folder can contain every type of file or a collection, but not gallery."
330
+ msgstr ""
331
+ "Ein Ordner kann alle Typen von Dateien enthalten oder eine Kollektion, aber "
332
+ "keine Galerie."
333
+
334
+ #. translators:
335
+ #: inc/folder/Creatable.php:1
336
+ msgid "'%s' is not a valid folder name."
337
+ msgstr "'%s' ist kein gültiger Ordnername."
338
+
339
+ #: inc/folder/Creatable.php:1
340
+ msgid "Order by name ascending"
341
+ msgstr "Sortiere nach Name aufsteigend"
342
+
343
+ #: inc/folder/Creatable.php:1
344
+ msgid "Order by name descending"
345
+ msgstr "Sortiere nach Name absteigend"
346
+
347
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
348
+ msgid "Order by ID ascending"
349
+ msgstr "Sortiere nach ID aufsteigend"
350
+
351
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
352
+ msgid "Order by ID descending"
353
+ msgstr "Sortiere nach ID absteigend"
354
+
355
+ #: inc/folder/CRUD.php:1
356
+ msgid "The given folder does not exist or you cannot rename this folder."
357
+ msgstr ""
358
+ "Der Ordner kann nicht gefunden werden oder du kannst diesen Ordner nicht "
359
+ "umbenennen."
360
+
361
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
362
+ msgid "The folder you try to delete has subfolders."
363
+ msgstr "Den Ordner, den du löschen möchtest, enthält Unterordner."
364
+
365
+ #: inc/folder/CRUD.php:1
366
+ msgid "The given folder does not exist."
367
+ msgstr "Der angegebene Ordner existiert nicht."
368
+
369
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
370
+ msgid "Unorganized"
371
+ msgstr "Unorganisiert"
372
+
373
+ #: inc/folder/Root.php:1
374
+ msgid ""
375
+ "Unorganized is the same as a root folder. Here you can find all files which "
376
+ "are not assigned to a folder."
377
+ msgstr ""
378
+ "Unorganisiert ist der Stamm-Ordner. Alle nicht zugewiesenen Dateien können "
379
+ "hier aufgefunden werden."
380
+
381
+ #: inc/metadata/CoverImage.php:1
382
+ msgid ""
383
+ "This option is disabled on this page. Please navigate to the media library."
384
+ msgstr ""
385
+ "Diese Option ist auf dieser Seite deaktiviert. Navigiere bitte zur "
386
+ "Medienbibliothek."
387
+
388
+ #: inc/metadata/CoverImage.php:1
389
+ msgid "Cover image"
390
+ msgstr "Vorschaubild"
391
+
392
+ #: inc/metadata/Description.php:1
393
+ msgid "Description"
394
+ msgstr "Beschreibung"
395
+
396
+ #: inc/metadata/Meta.php:1
397
+ msgid "Path"
398
+ msgstr "Pfad"
399
+
400
+ #: inc/metadata/Meta.php:1
401
+ msgid "Folder type"
402
+ msgstr "Ordnertyp"
403
+
404
+ #: inc/metadata/Meta.php:1
405
+ msgid "General"
406
+ msgstr "Allgemein"
407
+
408
+ #: inc/order/Sortable.php:1
409
+ msgid "Order by date ascending"
410
+ msgstr "Sortiere nach Datum aufsteigend"
411
+
412
+ #: inc/order/Sortable.php:1
413
+ msgid "Order by date descending"
414
+ msgstr "Sortiere nach Datum absteigend"
415
+
416
+ #: inc/order/Sortable.php:1
417
+ msgid "Order by title ascending"
418
+ msgstr "Sortiere nach Titel aufsteigend"
419
+
420
+ #: inc/order/Sortable.php:1
421
+ msgid "Order by title descending"
422
+ msgstr "Sortiere nach Titel absteigend"
423
+
424
+ #: inc/order/Sortable.php:1
425
+ msgid "Order by filename ascending"
426
+ msgstr "Sortiere nach Dateiname aufsteigend"
427
+
428
+ #: inc/order/Sortable.php:1
429
+ msgid "Order by filename descending"
430
+ msgstr "Sortiere nach Dateiname absteigend"
431
+
432
+ #: inc/order/Sortable.php:1
433
+ msgid "Natural order by filename ascending"
434
+ msgstr "Natürliche Ordnung nach Dateinamen aufsteigend"
435
+
436
+ #: inc/order/Sortable.php:1
437
+ msgid "Natural order by filename descending"
438
+ msgstr "Natürliche Ordnung nach Dateinamen absteigend"
439
+
440
+ #: inc/overrides/lite/folder/Creatable.php:1
441
+ #: inc/overrides/pro/folder/Creatable.php:1
442
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
443
+ msgid "Something went wrong."
444
+ msgstr "Etwas ist schiefgelaufen."
445
+
446
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
447
+ msgid "Folder not found."
448
+ msgstr "Ordner nicht gefunden."
449
+
450
+ #: inc/overrides/pro/Core.php:1
451
+ msgid ""
452
+ "<strong>You have not yet entered the license key</strong>. To receive "
453
+ "automatic updates, please enter the key in \"Enter license\"."
454
+ msgstr ""
455
+ "<strong>Der Lizenzschlüssel wurde noch nicht eingegeben</strong>. Um "
456
+ "automatische Updates zu erhalten klicke auf \"Enter license\"."
457
+
458
+ #: inc/overrides/pro/folder/Collection.php:1
459
+ msgid "A collection cannot contain files."
460
+ msgstr "Eine Kollektion kann keine Dateien enthalten."
461
+
462
+ #: inc/overrides/pro/folder/Collection.php:1
463
+ msgid "Collection"
464
+ msgstr "Kollektion"
465
+
466
+ #: inc/overrides/pro/folder/Collection.php:1
467
+ msgid ""
468
+ "A collection cannot contain files. But you can create other collections and "
469
+ "<strong> galleries</strong> there."
470
+ msgstr ""
471
+ "Eine Kollektion kann keine Dateien enthalten. Aber es können dort neue "
472
+ "Kollektionen und <strong>Galerien</strong> angelegt werden."
473
+
474
+ #. translators:
475
+ #: inc/overrides/pro/folder/Creatable.php:1
476
+ msgid "The parent %d does not exist."
477
+ msgstr "Das übergeordnete Ordner %d existiert nicht."
478
+
479
+ #: inc/overrides/pro/folder/Creatable.php:1
480
+ msgid "The given parent does not exist to set the parent for this folder."
481
+ msgstr "Der übergeordnete Ordner existiert nicht."
482
+
483
+ #: inc/overrides/pro/folder/Creatable.php:1
484
+ msgid "You are not allowed to change the parent for this folder."
485
+ msgstr ""
486
+ "Du hast keine Berechtigung den übergeordneten Ordner für diesen Ordner zu "
487
+ "ändern."
488
+
489
+ #: inc/overrides/pro/folder/Creatable.php:1
490
+ msgid "The given parent does not allow the folder type."
491
+ msgstr "Der übergeordnete Ordner erlaubt diesen Ordner-Typ nicht."
492
+
493
+ #: inc/overrides/pro/folder/Gallery.php:1
494
+ msgid "You can only move images to a gallery."
495
+ msgstr "Du kannst nur Bilder zu einer Galerie hinzufügen."
496
+
497
+ #: inc/overrides/pro/folder/Gallery.php:1
498
+ msgid "Gallery"
499
+ msgstr "Galerie"
500
+
501
+ #: inc/overrides/pro/folder/Gallery.php:1
502
+ msgid ""
503
+ "A gallery can only contain images. To view a gallery, go to a post and look "
504
+ "at the buttons of the visual editor.."
505
+ msgstr ""
506
+ "Eine Galerie kann nur Bilder enthalten. Um eine Galerie in einem Beitrag "
507
+ "anzuzeigen, werfe einen Blick auf den visuellen Editor."
508
+
509
+ #: inc/overrides/pro/order/Sortable.php:1
510
+ msgid "The given folder does not allow to reorder the files."
511
+ msgstr ""
512
+ "Der angegebene Ordner erlaubt es nicht Dateien benutzerdefiniert zu "
513
+ "sortieren."
514
+
515
+ #: inc/overrides/pro/order/Sortable.php:1
516
+ msgid "This folder has an automatic order. Please deactivate that first."
517
+ msgstr ""
518
+ "Dieser Ordner hat eine automatische Sortierung. Bitte deaktiviere diese erst."
519
+
520
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
521
+ msgid "Please select a folder to show items."
522
+ msgstr "Bitte wähle einen Ordner aus, um die Artikel anzuzeigen."
523
+
524
+ #: inc/rest/Attachment.php:1
525
+ msgid "Fetch only media in a folder by folder id."
526
+ msgstr "Lade nur Medien in einem Ordner nach Ordnerkennung."
527
+
528
+ #: inc/rest/Service.php:1
529
+ msgid "Forbidden"
530
+ msgstr "Verboten"
531
+
532
+ #: inc/rest/Service.php:1
533
+ msgid "Real Media Library is not active for the current user."
534
+ msgstr "Real Media Library ist für den aktuellen Benutzer nicht aktiviert."
535
+
536
+ #: inc/usersettings/AllFilesShortcuts.php:1
537
+ msgid "Hide shortcuts in \"All files\""
538
+ msgstr "Verknüpfungen in \"Alle Dateien\" ausblenden"
539
+
540
+ #: inc/usersettings/AllFilesShortcuts.php:1
541
+ msgid "The count always includes shortcuts"
542
+ msgstr "Die Anzahl ist immer inklusive Verknüpfungen"
543
+
544
+ #: inc/usersettings/DefaultFolder.php:1
545
+ msgid "Default startup folder"
546
+ msgstr "Standard Ordner beim Start"
547
+
548
+ #: inc/usersettings/DefaultFolder.php:1
549
+ msgid "No folder at startup"
550
+ msgstr "Keinen Ordner öffnen"
551
+
552
+ #: inc/usersettings/DefaultFolder.php:1
553
+ msgid "Last opened folder"
554
+ msgstr "Zuletzt geöffneter Ordner"
555
+
556
+ #: inc/usersettings/DefaultFolder.php:1
557
+ msgid ""
558
+ "Your media library can always open in the last opened folder or a folder you "
559
+ "choose. This saves you time every time you open the media library!"
560
+ msgstr ""
561
+ "Deine Mediathek kann sich immer im zuletzt geöffneten Ordner oder einem von "
562
+ "dir gewählten Ordner öffnen. So sparst du jedes Mal Zeit, wenn du die "
563
+ "Mediathek öffnest!"
564
+
565
+ #: inc/usersettings/InfiniteScrolling.php:1
566
+ msgid "Enable infinite scrolling in grid view"
567
+ msgstr "Automatisches Nachladen beim Scrollen in der Kachel-Ansicht aktivieren"
568
+
569
+ #: inc/usersettings/InfiniteScrolling.php:1
570
+ msgid ""
571
+ "Instead of displaying a \"Load More\" button, all files are loaded "
572
+ "automatically as you scroll down. This is not supported in list view."
573
+ msgstr ""
574
+ "Anstatt eine Schaltfläche \"Mehr laden\" anzuzeigen, werden alle Dateien "
575
+ "automatisch nachgeladen, wenn du nach unten scrollst. Dies wird in der "
576
+ "Listenansicht nicht unterstützt."
577
+
578
+ #: inc/view/FolderShortcode.php:1
579
+ msgid "Gallery from Media Folder"
580
+ msgstr "Galerie aus Medienordner"
581
+
582
+ #: inc/view/FolderShortcode.php:1
583
+ msgid ""
584
+ "Note: You can only select galleries. Folders and collections are grayed."
585
+ msgstr ""
586
+ "Beachte: Du kannst nur Galerien auswählen. Ordner und Kollektionen sind "
587
+ "ausgegraut."
588
+
589
+ #: inc/view/FolderShortcode.php:1
590
+ msgid "Link to"
591
+ msgstr "Link auf"
592
+
593
+ #: inc/view/FolderShortcode.php:1
594
+ msgid "Columns"
595
+ msgstr "Spalten"
596
+
597
+ #: inc/view/FolderShortcode.php:1
598
+ msgid "Random Order"
599
+ msgstr "Zufällige Anordnung"
600
+
601
+ #: inc/view/FolderShortcode.php:1
602
+ msgid "Size"
603
+ msgstr "Größe"
604
+
605
+ #: inc/view/FolderShortcode.php:1
606
+ msgid "Attachment File"
607
+ msgstr "Mediendatei"
608
+
609
+ #: inc/view/FolderShortcode.php:1
610
+ msgid "Media File"
611
+ msgstr "Mediendatei"
612
+
613
+ #: inc/view/FolderShortcode.php:1
614
+ msgid "None"
615
+ msgstr "Keine"
616
+
617
+ #: inc/view/FolderShortcode.php:1
618
+ msgid "Thumbnail"
619
+ msgstr "Thumbnail"
620
+
621
+ #: inc/view/FolderShortcode.php:1
622
+ msgid "Medium"
623
+ msgstr "Medium"
624
+
625
+ #: inc/view/FolderShortcode.php:1
626
+ msgid "Large"
627
+ msgstr "Groß"
628
+
629
+ #: inc/view/FolderShortcode.php:1
630
+ msgid "Full Size"
631
+ msgstr "Volle Größe"
632
+
633
+ #: inc/view/Lang.php:1
634
+ msgid ""
635
+ "Subfolders are only available in the PRO version. But you can now create an "
636
+ "unlimited number of folders on the main level (instead of the previous max. "
637
+ "10 folders)."
638
+ msgstr ""
639
+ "Unterordner sind nur in der PRO Version verfügbar. Aber du kannst jetzt eine "
640
+ "unbegrenzte Anzahl von Ordnern auf der Hauptebene erstellen (statt der "
641
+ "bisherigen max. 10 Ordner)."
642
+
643
+ #: inc/view/Lang.php:1
644
+ msgid "No folder selected"
645
+ msgstr "Kein Ordner ausgewählt"
646
+
647
+ #: inc/view/Lang.php:1
648
+ msgid "Select folder"
649
+ msgstr "Zielordner auswählen"
650
+
651
+ #: inc/view/Lang.php:1
652
+ msgid "Reload content"
653
+ msgstr "Inhalt neuladen"
654
+
655
+ #: inc/view/Lang.php:1
656
+ msgid "Subfolders"
657
+ msgstr "Unterordner"
658
+
659
+ #: inc/view/Lang.php:1
660
+ msgid "Please select a folder (media library) in the block settings."
661
+ msgstr "Bitte wähle einen Ordner in den Block-Einstellungen aus."
662
+
663
+ #: inc/view/Lang.php:1
664
+ msgid "New folders inherit this restriction"
665
+ msgstr "Neue Unterordner erben diese Einschränkung"
666
+
667
+ #: inc/view/Lang.php:1
668
+ msgid "The current selected folder has some restrictions:"
669
+ msgstr "Der aktuell ausgewählte Ordner besitzt Einschränkungen:"
670
+
671
+ #: inc/view/Lang.php:1
672
+ msgid "You cannot change *parent* folder"
673
+ msgstr "Der *übergeordnete* Ordner darf nicht geändert werden"
674
+
675
+ #: inc/view/Lang.php:1
676
+ msgid "You cannot *rearrange* subfolders"
677
+ msgstr "Unterordner dürfen nicht neu *angeordnet* werden"
678
+
679
+ #: inc/view/Lang.php:1
680
+ msgid "You cannot *create* subfolders"
681
+ msgstr "Keine *Unterordner* erlaubt"
682
+
683
+ #: inc/view/Lang.php:1
684
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
685
+ msgstr ""
686
+ "Du kannst keine neuen Dateien *einfügen*. Neue Dateien werden nach "
687
+ "Unorganisiert verschoben…"
688
+
689
+ #: inc/view/Lang.php:1
690
+ msgid "You cannot *rename* the folder"
691
+ msgstr "Der Ordner darf nicht *umbenannt* werden"
692
+
693
+ #: inc/view/Lang.php:1
694
+ msgid "You cannot *delete* the folder"
695
+ msgstr "Der Ordner darf nicht *gelöscht* werden"
696
+
697
+ #: inc/view/Lang.php:1
698
+ msgid "You cannot *move* files outside the folder"
699
+ msgstr "Enthaltene Dateien dürfen nicht *verschoben* werden"
700
+
701
+ #: inc/view/Lang.php:1
702
+ msgid "Parent"
703
+ msgstr "Übergeordnet"
704
+
705
+ #: inc/view/Lang.php:1
706
+ msgid "Before this node"
707
+ msgstr "Vor diesem Eintrag"
708
+
709
+ #: inc/view/Lang.php:1
710
+ msgid "If no next node is given, the element is placed at the end."
711
+ msgstr "Wenn kein Eintrag ausgewählt, wird es an das Ende angehängt."
712
+
713
+ #: inc/view/Lang.php:1
714
+ msgid "The file is uploaded to the folder where you are currently in."
715
+ msgstr ""
716
+ "Die Datei wird in den Ordner hochgeladen, in dem du dich gerade befindest."
717
+
718
+ #: inc/view/Lang.php:1
719
+ msgid "Are you sure?"
720
+ msgstr "Bist du sicher?"
721
+
722
+ #: inc/view/Lang.php:1
723
+ msgid "Success"
724
+ msgstr "Erfolgreich"
725
+
726
+ #: inc/view/Lang.php:1
727
+ msgid "Failed"
728
+ msgstr "Fehlgeschlagen"
729
+
730
+ #: inc/view/Lang.php:1
731
+ msgid "No entries found"
732
+ msgstr "Keine Einträge gefunden"
733
+
734
+ #: inc/view/Lang.php:1
735
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
736
+ msgstr ""
737
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
738
+ "verschoben."
739
+
740
+ #: inc/view/Lang.php:1
741
+ msgid ""
742
+ "Are you sure to delete *{count} folders*? All files gets moved to "
743
+ "Unorganized."
744
+ msgstr ""
745
+ "Möchtest du *{name}* löschen? Alle Dateien werden nach Unorganisiert "
746
+ "verschoben."
747
+
748
+ #: inc/view/Lang.php:1
749
+ msgid "Ok"
750
+ msgstr "Ok"
751
+
752
+ #: inc/view/Lang.php:1
753
+ msgid "Cancel"
754
+ msgstr "Abbrechen"
755
+
756
+ #: inc/view/Lang.php:1
757
+ msgid "Save"
758
+ msgstr "Speichern"
759
+
760
+ #: inc/view/Lang.php:1
761
+ msgid "Back"
762
+ msgstr "Zurück"
763
+
764
+ #: inc/view/Lang.php:1
765
+ msgid "No folders found"
766
+ msgstr "Keine Ordner gefunden"
767
+
768
+ #: inc/view/Lang.php:1
769
+ msgid ""
770
+ "No folders have been created yet. Just click on the button above to create "
771
+ "your first folder."
772
+ msgstr ""
773
+ "Bisher wurden keine Ordner angelegt. Klicke auf den obigen Button, um deinen "
774
+ "ersten Ordner zu erstellen."
775
+
776
+ #: inc/view/Lang.php:1
777
+ msgid "Folders"
778
+ msgstr "Ordner"
779
+
780
+ #: inc/view/Lang.php:1
781
+ msgid "No search results."
782
+ msgstr "Keine Suchergebnisse."
783
+
784
+ #: inc/view/Lang.php:1
785
+ msgid "Renaming to *{name}*…"
786
+ msgstr "Umbenennen in *{name}*…"
787
+
788
+ #: inc/view/Lang.php:1
789
+ msgid "Successfully renamed folder to *{name}*"
790
+ msgstr "Ordner erfolgreich in *{name}* umbenannt"
791
+
792
+ #: inc/view/Lang.php:1
793
+ msgid "Creating *{name}*…"
794
+ msgstr "Erstelle *{name}*…"
795
+
796
+ #: inc/view/Lang.php:1
797
+ msgid "Successfully created *{name}*"
798
+ msgstr "Erfolgreich *{name}* erstellt"
799
+
800
+ #: inc/view/Lang.php:1
801
+ msgid "Deleting *{name}*…"
802
+ msgstr "Löschen von *{name}*…"
803
+
804
+ #: inc/view/Lang.php:1
805
+ msgid "Successfully deleted *{name}*"
806
+ msgstr "Erfolgreich *{name}* gelöscht"
807
+
808
+ #: inc/view/Lang.php:1
809
+ msgid "Successfully deleted *{count} folders*"
810
+ msgstr "*{count} Order* erfolgreich geschlöscht"
811
+
812
+ #: inc/view/Lang.php:1
813
+ msgid "Rearrange *{name}* placement manually"
814
+ msgstr "Ordne *{name}* manuell an"
815
+
816
+ #: inc/view/Lang.php:1
817
+ msgid "Reordering the tree hierarchy…"
818
+ msgstr "Der Baum wird neu angeordnet…"
819
+
820
+ #: inc/view/Lang.php:1
821
+ msgid "Successfully sorted the tree hierarchy"
822
+ msgstr "Der Baum wurde erfolgreich neu angeordnet"
823
+
824
+ #: inc/view/Lang.php:1
825
+ msgid "Reorder subfolders of *{name}*…"
826
+ msgstr "Unterordner von *{name}* werden neu angeordnet…"
827
+
828
+ #: inc/view/Lang.php:1
829
+ msgid "{count} files remaining…"
830
+ msgstr "{count} Dateien verbleibend…"
831
+
832
+ #: inc/view/Lang.php:1
833
+ msgid "Receiving data…"
834
+ msgstr "Empfange Daten…"
835
+
836
+ #: inc/view/Lang.php:1
837
+ msgid "Shortcut"
838
+ msgstr "Verknüpfung"
839
+
840
+ #: inc/view/Lang.php:1
841
+ msgid ""
842
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
843
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
844
+ "do this in the original file (for example replace media file through a "
845
+ "plugin).\n"
846
+ "Note also that the fields in the shortcuts can be different to the original "
847
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
848
+ msgstr ""
849
+ "Dies ist eine Datei-Verknüpfung. Verknüpfungen brauchen keinen physischen "
850
+ "Speicherplatz *(0 kB)*. Wenn du die Datei selbst bearbeiten möchtest, musst "
851
+ "du das für die Original-Datei tun (Beispiel: Ersetzen der Datei durch ein "
852
+ "Plugin).\n"
853
+ "Beachte auch, dass Felder wie der Titel und Beschreibung unterschiedlich zur "
854
+ "Original-Datei sein können."
855
+
856
+ #: inc/view/Lang.php:1
857
+ msgid ""
858
+ "In the current view of uploads, filters are active. Please reset them and "
859
+ "refresh the view."
860
+ msgstr ""
861
+ "Im Moment sind Filter aktiv. Bitte setze diese zurück und aktualisiere die "
862
+ "Ansicht."
863
+
864
+ #: inc/view/Lang.php:1
865
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
866
+ msgstr ""
867
+ "Eine Kollektion darf keine Dateien enthalten. Datei wird nach Unorganisiert "
868
+ "verschoben…"
869
+
870
+ #: inc/view/Lang.php:1
871
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
872
+ msgstr ""
873
+ "Eine Galerie darf nur Bilder enthalten. Datei wird nach Unorganisiert "
874
+ "verschoben…"
875
+
876
+ #: inc/view/Lang.php:1
877
+ msgid "Order content by *{name}*…"
878
+ msgstr "Ordne Inhalt nach *{name}*…"
879
+
880
+ #: inc/view/Lang.php:1
881
+ msgid "Order content by drag & drop"
882
+ msgstr "Ordne Inhalte per Drag&Drop"
883
+
884
+ #: inc/view/Lang.php:1
885
+ msgid "Reset order"
886
+ msgstr "Reihenfolge zurücksetzen"
887
+
888
+ #: inc/view/Lang.php:1
889
+ msgid "Apply order once…"
890
+ msgstr "Einmalige Sortierung anwenden…"
891
+
892
+ #: inc/view/Lang.php:1
893
+ msgid "Last"
894
+ msgstr "zuletzt"
895
+
896
+ #: inc/view/Lang.php:1
897
+ msgid "Deactivate automatic ordering"
898
+ msgstr "Deaktiviere automatische Sortierung"
899
+
900
+ #: inc/view/Lang.php:1
901
+ msgid "Apply automatic order…"
902
+ msgstr "Automatische Sortierung anwenden…"
903
+
904
+ #: inc/view/Lang.php:1
905
+ msgid "Latest"
906
+ msgstr "Aktuell"
907
+
908
+ #: inc/view/Lang.php:1
909
+ msgid "Reindex order"
910
+ msgstr "Reihenfolge reparieren"
911
+
912
+ #: inc/view/Lang.php:1
913
+ msgid "Reset to last order"
914
+ msgstr "Letzte Reihenfolge wiederherstellen"
915
+
916
+ #: inc/view/Lang.php:1
917
+ msgid "All files"
918
+ msgstr "Alle Dateien"
919
+
920
+ #: inc/view/Lang.php:1
921
+ msgid "Move {count} files"
922
+ msgstr "Verschiebe {count} Dateien"
923
+
924
+ #: inc/view/Lang.php:1
925
+ msgid "Move one file"
926
+ msgstr "Verschiebe Datei"
927
+
928
+ #: inc/view/Lang.php:1
929
+ msgid "Copy {count} files"
930
+ msgstr "Kopiere {count} Dateien"
931
+
932
+ #: inc/view/Lang.php:1
933
+ msgid "Copy one file"
934
+ msgstr "Kopiere Datei"
935
+
936
+ #: inc/view/Lang.php:1
937
+ msgid "Moving {count} files…"
938
+ msgstr "{count} Dateien verschieben…"
939
+
940
+ #: inc/view/Lang.php:1
941
+ msgid "Moving one file…"
942
+ msgstr "Datei verschieben…"
943
+
944
+ #: inc/view/Lang.php:1
945
+ msgid "Copying {count} files…"
946
+ msgstr "{count} Dateien kopieren…"
947
+
948
+ #: inc/view/Lang.php:1
949
+ msgid "Copying one file…"
950
+ msgstr "Datei kopieren…"
951
+
952
+ #: inc/view/Lang.php:1
953
+ msgid "Successfully moved {count} files"
954
+ msgstr "{count} Dateien erfolgreich verschoben"
955
+
956
+ #: inc/view/Lang.php:1
957
+ msgid "Successfully moved one file"
958
+ msgstr "Datei erfolgreich verschoben"
959
+
960
+ #: inc/view/Lang.php:1
961
+ msgid "Successfully copied {count} files"
962
+ msgstr "{count} Dateien erfolgreich kopiert"
963
+
964
+ #: inc/view/Lang.php:1
965
+ msgid "Successfully copied one file"
966
+ msgstr "Datei erfolgreich kopiert"
967
+
968
+ #: inc/view/Lang.php:1
969
+ msgid "Hold any key to create a shortcut"
970
+ msgstr "Eine Taste festhalten, um Datei zu kopieren"
971
+
972
+ #: inc/view/Lang.php:1
973
+ msgid "Release key to move file"
974
+ msgstr "Taste loslassen, um Datei zu verschieben"
975
+
976
+ #: inc/view/Lang.php:1
977
+ msgid "Click this to create a new folder"
978
+ msgstr "Klicke hier, um einen neuen Ordner anzulegen"
979
+
980
+ #: inc/view/Lang.php:1
981
+ msgid ""
982
+ "A folder can contain any file type and collection, but not galleries. If you "
983
+ "want to create a subfolder, select a folder and click this button."
984
+ msgstr ""
985
+ "Ein Ordner kann jeden Dateitypen und Kollektionen enthalten, jedoch keine "
986
+ "Galerien. Wenn du einen Unterordner erstellen möchtest, selektiere einen "
987
+ "Ordner und klicke diesen Button."
988
+
989
+ #: inc/view/Lang.php:1
990
+ msgid "Click this to create a new collection"
991
+ msgstr "Klicke hier, um eine neue Kollektion anzulegen"
992
+
993
+ #: inc/view/Lang.php:1
994
+ msgid ""
995
+ "A collection cannot contain files. However, you can create additional "
996
+ "collections and *galleries* there. This gallery is only a *gallery data "
997
+ "folder*, i.e. they are not automatically visible on the website.\n"
998
+ "\n"
999
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
1000
+ "on your pages/postings."
1001
+ msgstr ""
1002
+ "Eine Kollektion kann keine Dateien enthalten. Dort können jedoch weitere "
1003
+ "Kollektionen und *Galerien* angelegt werden. Diese Galerie ist nur ein "
1004
+ "*Galerie-Daten-Ordner*, d. h. diese sind nicht automatisch auf der Webseite "
1005
+ "zu sehen.\n"
1006
+ "\n"
1007
+ "Eine *visuelle Galerie* kann durch einen Shortcode im Visual Editor auf "
1008
+ "deinen Seiten/Beiträgen erstellt werden."
1009
+
1010
+ #: inc/view/Lang.php:1
1011
+ msgid "Click this to create a *new gallery data folder*"
1012
+ msgstr "Klicke hier, um einen neuen *Galerie-Daten-Ordner* anzulegen"
1013
+
1014
+ #: inc/view/Lang.php:1
1015
+ msgid ""
1016
+ "A *gallery data folder* can only contain images. It is easier for you to "
1017
+ "distinguish where your visual galleries are located.\n"
1018
+ "\n"
1019
+ "You can also order the images into *a custom image order* per drag&drop."
1020
+ msgstr ""
1021
+ "Ein *Galerie-Daten-Ordner* kann nur Bilder enthalten - für dich ist es dann "
1022
+ "einfach zu entscheiden, wo deine visuellen Galerien liegen.\n"
1023
+ "\n"
1024
+ "Sie können per Drag & Drop eine *benutzerdefinierte Reihenfolge* erstellen."
1025
+
1026
+ #: inc/view/Lang.php:1
1027
+ msgid "Settings"
1028
+ msgstr "Einstellungen"
1029
+
1030
+ #: inc/view/Lang.php:1
1031
+ msgid "General settings for the current logged in user."
1032
+ msgstr "Allgemeine Einstellungen für den eingeloggten Benutzer."
1033
+
1034
+ #: inc/view/Lang.php:1
1035
+ msgid "Permissions"
1036
+ msgstr "Berechtigungen"
1037
+
1038
+ #: inc/view/Lang.php:1
1039
+ msgid "Reorder files in this folder"
1040
+ msgstr "Dateien sortieren"
1041
+
1042
+ #: inc/view/Lang.php:1
1043
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1044
+ msgstr "Ordne die Dateien / Bilder nach *Titel, Dateiname, ID, …*"
1045
+
1046
+ #: inc/view/Lang.php:1
1047
+ msgid "Refresh"
1048
+ msgstr "Neuladen"
1049
+
1050
+ #: inc/view/Lang.php:1
1051
+ msgid "Refreshes the current folder view."
1052
+ msgstr "Aktualisiert die aktuelle Ordneransicht."
1053
+
1054
+ #: inc/view/Lang.php:1
1055
+ msgid "Rename"
1056
+ msgstr "Umbenennen"
1057
+
1058
+ #: inc/view/Lang.php:1
1059
+ msgid "Rename the current selected folder."
1060
+ msgstr "Den aktuell ausgewählten Ordner umbenennen."
1061
+
1062
+ #: inc/view/Lang.php:1
1063
+ msgid "Delete"
1064
+ msgstr "Löschen"
1065
+
1066
+ #: inc/view/Lang.php:1
1067
+ msgid "Delete the current selected folder."
1068
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1069
+
1070
+ #: inc/view/Lang.php:1
1071
+ msgid "Delete the current selected folders."
1072
+ msgstr "Den aktuell ausgewählten Ordner löschen."
1073
+
1074
+ #: inc/view/Lang.php:1
1075
+ msgid "Rearrange"
1076
+ msgstr "Neu anordnen"
1077
+
1078
+ #: inc/view/Lang.php:1
1079
+ msgid "Change the hierarchical order of the folders."
1080
+ msgstr "Ändern der hierarchischen Anordnung der Ordner."
1081
+
1082
+ #: inc/view/Lang.php:1
1083
+ msgid "Folder details"
1084
+ msgstr "Ordner Details"
1085
+
1086
+ #: inc/view/Lang.php:1
1087
+ msgid "Select a folder and view more details about it."
1088
+ msgstr "Selektiere einen Ordner, um mehr Details anzuzeigen."
1089
+
1090
+ #: inc/view/Lang.php:1
1091
+ msgid "Product license not yet activated."
1092
+ msgstr "Produkt-Lizenz noch nicht aktiviert."
1093
+
1094
+ #: inc/view/Lang.php:1
1095
+ msgid "Enter license"
1096
+ msgstr "Lizenzschlüssel eingeben"
1097
+
1098
+ #: inc/view/Lang.php:1
1099
+ msgid "Dismiss notice"
1100
+ msgstr "Meldung ausblenden"
1101
+
1102
+ #: inc/view/Lang.php:1
1103
+ msgid ""
1104
+ "It looks like you have already used another plugin for folders in the media "
1105
+ "library."
1106
+ msgstr ""
1107
+ "Es scheint, als hättest Du zuvor ein anderes Plugin zur "
1108
+ "Medienkategorisierung verwendet."
1109
+
1110
+ #: inc/view/Lang.php:1
1111
+ msgid "Start importing"
1112
+ msgstr "Import starten"
1113
+
1114
+ #: inc/view/Lang.php:1
1115
+ msgid "Dismiss"
1116
+ msgstr "Ausblenden"
1117
+
1118
+ #: inc/view/Lang.php:1
1119
+ msgid ""
1120
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1121
+ "do not change when you move the file. Learn more about <a href=\"https://"
1122
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1123
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1124
+ "files to physical folders.</a>"
1125
+ msgstr ""
1126
+ "Real Media Library erstellt eine virtuelle Ordnerstruktur. Die URLs der "
1127
+ "Uploads ändern sich nicht, wenn du die Datei verschiebst. Erfahre mehr "
1128
+ "darüber, wie du <a href=\"https://devowl.io/knowledge-base/how-can-i-"
1129
+ "physically-reflect-the-virtual-folder-structure-to-my-file-system/\" target="
1130
+ "\"_blank\">Dateien automatisch in physische Ordner verschieben kannst.</a>"
1131
+
1132
+ #: inc/view/Lang.php:1
1133
+ msgid ""
1134
+ "You will be redirected to the external website of PRO version. Please "
1135
+ "confirm to continue!"
1136
+ msgstr ""
1137
+ "Sie werden auf die externe Website der PRO-Version weitergeleitet. Bitte "
1138
+ "bestätige die Fortsetzung!"
1139
+
1140
+ #: inc/view/Lang.php:1
1141
+ msgid "PRO Feature"
1142
+ msgstr "PRO Feature"
1143
+
1144
+ #: inc/view/Lang.php:1
1145
+ msgid "Hide for 20 days"
1146
+ msgstr "20 Tage verstecken"
1147
+
1148
+ #: inc/view/Lang.php:1
1149
+ msgid "Thanks for using the free version of Real Media Library."
1150
+ msgstr ""
1151
+ "Vielen Dank für die Nutzung der kostenlosen Version von Real Media Library."
1152
+
1153
+ #: inc/view/Lang.php:1
1154
+ msgid "Get PRO!"
1155
+ msgstr "Hole dir PRO!"
1156
+
1157
+ #: inc/view/Lang.php:1
1158
+ msgid "I want to learn more!"
1159
+ msgstr "Ich will mehr erfahren!"
1160
+
1161
+ #: inc/view/Lang.php:1
1162
+ msgid "No, not interested…"
1163
+ msgstr "Nein, kein Interesse…"
1164
+
1165
+ #: inc/view/Lang.php:1
1166
+ msgid "You like collections?"
1167
+ msgstr "Magst Du Kollektionen?"
1168
+
1169
+ #: inc/view/Lang.php:1
1170
+ msgid ""
1171
+ "Get more organized with different types of folders: Collections and "
1172
+ "galleries help you to easily recognize where your image galleries are "
1173
+ "located."
1174
+ msgstr ""
1175
+ "Sorgen für mehr Ordnung mit verschiedenen Arten von Ordnern: Sammlungen und "
1176
+ "Galerien helfen dir leicht zu erkennen, wo sich deine Bildergalerien "
1177
+ "befinden."
1178
+
1179
+ #: inc/view/Lang.php:1
1180
+ msgid "Custom content order?"
1181
+ msgstr "Dateien sortieren?"
1182
+
1183
+ #: inc/view/Lang.php:1
1184
+ msgid ""
1185
+ "Get your folder contents in order and arrange your files according to a "
1186
+ "criterion (e.g. name descending) or by drag & drop."
1187
+ msgstr ""
1188
+ "Bringen Ordnung in deinen Ordnerinhalt und ordne deine Dateien nach einem "
1189
+ "Kriterium (z.B. Name absteigend) oder per Drag & Drop an."
1190
+
1191
+ #: inc/view/Lang.php:1
1192
+ msgid "Full order control?"
1193
+ msgstr "Volle Kontrolle über die Sortierung?"
1194
+
1195
+ #: inc/view/Lang.php:1
1196
+ msgid ""
1197
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1198
+ "name descending) or by drag & drop."
1199
+ msgstr ""
1200
+ "Organisiere die Knoten innerhalb deines Ordnerbaums nach einem Kriterium (z."
1201
+ "B. Name absteigend) oder per Drag & Drop an."
1202
+
1203
+ #: inc/view/Lang.php:1
1204
+ msgid "Want to create subfolders?"
1205
+ msgstr "Unterordner erstellen?"
1206
+
1207
+ #: inc/view/Lang.php:1
1208
+ msgid ""
1209
+ "Subfolders offer you the possibility to bring more structure into your media "
1210
+ "library. They help you to keep the overview, even if you really have many "
1211
+ "files in your media library."
1212
+ msgstr ""
1213
+ "Unterordner bieten dir die Möglichkeit, mehr Struktur in deine "
1214
+ "Medienbibliothek zu bringen. Sie helfen dir, den Überblick zu behalten, auch "
1215
+ "wenn du wirklich viele Dateien in deiner Mediathek hast."
1216
+
1217
+ #: inc/view/Lang.php:1
1218
+ msgid "Want to switch between folders more comfortably?"
1219
+ msgstr "Komfortabler zwischen den Ordnern wechseln?"
1220
+
1221
+ #: inc/view/Lang.php:1
1222
+ msgid ""
1223
+ "Let the complete folder tree as in your media library also be displayed in "
1224
+ "this dialog instead of searching each time in the dropdown. It is simply "
1225
+ "more comfortable!"
1226
+ msgstr ""
1227
+ "Lass dir den kompletten Ordnerbaum wie in deiner Medienbibliothek auch in "
1228
+ "diesem Dialog anzeigen, anstatt jedes Mal im Dropdown zu suchen. Das ist "
1229
+ "einfach komfortabler!"
1230
+
1231
+ #: inc/view/Lang.php:1
1232
+ msgid "Want to upload entire folders?"
1233
+ msgstr "Möchtest du ganze Ordner hochladen?"
1234
+
1235
+ #: inc/view/Lang.php:1
1236
+ msgid ""
1237
+ "With Real Media Library you can upload entire folders using drag and drop. "
1238
+ "All folders, subfolders and files will be uploaded and displayed in your "
1239
+ "media library in the same structure. Get PRO to upload folders!"
1240
+ msgstr ""
1241
+ "Mit Real Media Library kannst du ganze Ordner per Drag & Drop hochladen. "
1242
+ "Alle Ordner, Unterordner und Dateien werden hochgeladen und in deiner "
1243
+ "Medienbibliothek in der gleichen Struktur angezeigt. Hol dir PRO zum "
1244
+ "Hochladen von Ordnern!"
1245
+
1246
+ #: inc/view/Options.php:1
1247
+ msgid "RealMediaLibrary:General"
1248
+ msgstr "RealMediaLibrary:Allgemein"
1249
+
1250
+ #: inc/view/Options.php:1
1251
+ msgid "Load RML functionality in frontend"
1252
+ msgstr "Lade RML-Funktionalitäten im Frontend"
1253
+
1254
+ #: inc/view/Options.php:1
1255
+ msgid "RealMediaLibrary:Reset"
1256
+ msgstr "RealMediaLibrary:Zurücksetzen"
1257
+
1258
+ #: inc/view/Options.php:1
1259
+ msgid "Reset the order of all galleries"
1260
+ msgstr "Die Reihenfolge aller Galerien zurücksetzen"
1261
+
1262
+ #: inc/view/Options.php:1
1263
+ msgid "Wipe all settings (folders, attachment relations)"
1264
+ msgstr ""
1265
+ "Alle Einstellungen zurücksetzen (Ordner, Medien-Beziehungen zu den Ordnern)"
1266
+
1267
+ #: inc/view/Options.php:1
1268
+ msgid "Reset folder count cache"
1269
+ msgstr "Ordneranzahl-Cache zurücksetzen"
1270
+
1271
+ #: inc/view/Options.php:1
1272
+ msgid "Reset names, slugs and absolute pathes"
1273
+ msgstr "Namen, Slugs und absolute Pfade zurücksetzen"
1274
+
1275
+ #: inc/view/Options.php:1
1276
+ msgid "Wipe attachment relations"
1277
+ msgstr "Setze Medien-Beziehungen zurück"
1278
+
1279
+ #: inc/view/Options.php:1
1280
+ msgid "Wipe all"
1281
+ msgstr "Setze alles zurück"
1282
+
1283
+ #: inc/view/Options.php:1
1284
+ msgid "Reset count"
1285
+ msgstr "Anzahl zurücksetzen"
1286
+
1287
+ #: inc/view/Options.php:1
1288
+ msgid "Reset"
1289
+ msgstr "Zurücksetzen"
1290
+
1291
+ #: inc/view/Options.php:1
1292
+ msgid ""
1293
+ "Activate this option if you are using a page builder like Divi Page Builder, "
1294
+ "WPBakery Page Builder or Elementor."
1295
+ msgstr ""
1296
+ "Aktiviere diese Option, wenn du einen Page Builder wie Divi Page Builder, "
1297
+ "WPBakery Page Builder oder Elementor verwendest."
1298
+
1299
+ #: inc/view/Options.php:1
1300
+ msgid "You can also reset an single folder in its folder details."
1301
+ msgstr "Du kannst auch einen einzelnen Ordner zurücksetzen."
1302
+
1303
+ #: inc/view/View.php:1
1304
+ msgid "All"
1305
+ msgstr "Alles"
1306
+
1307
+ #: inc/view/View.php:1
1308
+ msgid "Unorganized pictures"
1309
+ msgstr "Unorganisierte Bilder"
languages/real-media-library-es_AR.mo ADDED
Binary file
languages/real-media-library-es_AR.po ADDED
@@ -0,0 +1,1268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: n/a\n"
4
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
5
+ "POT-Creation-Date: n/a\n"
6
+ "PO-Revision-Date: 2021-10-12 08:40+0000\n"
7
+ "Last-Translator: Matthias Günter <matthias.guenter@devowl.io>\n"
8
+ "Language-Team: Spanish <https://translate.devowl.io/projects/wordpress-real-"
9
+ "media-library-backend-php/develop/es/>\n"
10
+ "Language: es_AR\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Weblate 4.8\n"
16
+
17
+ #. Plugin Name of the plugin
18
+ #, fuzzy
19
+ #| msgid "RealMediaLibrary:Reset"
20
+ msgid "Real Media Library"
21
+ msgstr "RealMediaLibrary: Restablecer"
22
+
23
+ #. Plugin URI of the plugin
24
+ msgid "https://devowl.io/wordpress-real-media-library/"
25
+ msgstr ""
26
+
27
+ #. Description of the plugin
28
+ msgid ""
29
+ "Organize uploaded media in folders, collections and galleries: A file "
30
+ "manager for WordPress. Media management made easy!"
31
+ msgstr ""
32
+
33
+ #. Author of the plugin
34
+ msgid "devowl.io"
35
+ msgstr "devowl.io"
36
+
37
+ #. Author URI of the plugin
38
+ msgid "https://devowl.io"
39
+ msgstr "https://devowl.io"
40
+
41
+ #: inc/AdInitiator.php:1
42
+ msgid "Complete file and folder manager"
43
+ msgstr ""
44
+
45
+ #: inc/AdInitiator.php:1
46
+ msgid ""
47
+ "Real Media Library is a WordPress plugin that empowers you with advanced "
48
+ "media management. You can use this plugin to organize the thousands of "
49
+ "images, audio, video and PDF files in your media library into folders. "
50
+ "Basically it is a file manager like Windows Explorer or Mac Finder, but for "
51
+ "WordPress."
52
+ msgstr ""
53
+
54
+ #: inc/AdInitiator.php:1
55
+ msgid "Filter in insert media dialog"
56
+ msgstr ""
57
+
58
+ #: inc/AdInitiator.php:1
59
+ msgid ""
60
+ "No matter where you are, the folder structure of Real Media Library is "
61
+ "always where you can select files. For example in the dialog for selecting a "
62
+ "\"Featured Image\"."
63
+ msgstr ""
64
+
65
+ #: inc/AdInitiator.php:1
66
+ msgid ""
67
+ "In the Lite version you can only select the folder by a simple dropdown."
68
+ msgstr ""
69
+
70
+ #: inc/AdInitiator.php:1
71
+ msgid "Custom image order"
72
+ msgstr ""
73
+
74
+ #: inc/AdInitiator.php:1
75
+ msgid ""
76
+ "Organizing your media files is really easy with the Real Media Library "
77
+ "plugin. You can arrange the order of your files yourself by dragging and "
78
+ "dropping. This allows you to move important files to the top for faster "
79
+ "access."
80
+ msgstr ""
81
+
82
+ #: inc/AdInitiator.php:1
83
+ msgid "Get your PRO license now!"
84
+ msgstr ""
85
+
86
+ #: inc/api/attachment.php:1
87
+ msgid "The given folder was not found."
88
+ msgstr "No se encontró la carpeta dada."
89
+
90
+ #: inc/Assets.php:1
91
+ msgid "Complementary Plugins"
92
+ msgstr "Extensiones"
93
+
94
+ #: inc/Assets.php:1
95
+ msgid ""
96
+ "\n"
97
+ "\n"
98
+ "Note: If you want to delete a shortcut file, the source file will NOT be "
99
+ "deleted.\n"
100
+ "If you want to delete a non-shortcut file, all associated shortcuts are "
101
+ "deleted, too."
102
+ msgstr ""
103
+ "\n"
104
+ "\n"
105
+ "Nota: Si deseas eliminar un archivo de acceso directo, el archivo de origen "
106
+ "NO se eliminará.\n"
107
+ "Si deseas eliminar un archivo que no sea de acceso directo, también se "
108
+ "eliminan todos los accesos directos asociados."
109
+
110
+ #: inc/attachment/CustomField.php:1
111
+ msgid ""
112
+ "If you move this shortcut, the location of the source/main file is not "
113
+ "changed."
114
+ msgstr ""
115
+ "Al mover este acceso directo, no se cambiará la ubicación de la carpeta del "
116
+ "archivo de origen/principal."
117
+
118
+ #: inc/attachment/CustomField.php:1
119
+ msgid ""
120
+ "If you move this attachment, the folder location of the associated shortcuts "
121
+ "are not changed."
122
+ msgstr ""
123
+ "Al mover este archivo adjunto, no se cambiará la ubicación de la carpeta de "
124
+ "los accesos directos asociados a este archivo adjunto."
125
+
126
+ #: inc/attachment/CustomField.php:1
127
+ msgid "Move to another folder"
128
+ msgstr "Mover un archivo"
129
+
130
+ #: inc/attachment/CustomField.php:1 inc/folder/Creatable.php:1
131
+ #: inc/view/FolderShortcode.php:1 inc/view/Lang.php:1
132
+ msgid "Folder"
133
+ msgstr "Carpeta"
134
+
135
+ #: inc/attachment/CustomField.php:1
136
+ msgid "Shortcut infos"
137
+ msgstr "Información sobre los accesos directos"
138
+
139
+ #: inc/attachment/CustomField.php:1
140
+ msgid ""
141
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
142
+ "physical storage <strong>(0 kB)</strong>. If you want to change the file "
143
+ "itself, you must do this in the original file (for example replace media "
144
+ "file through a plugin).<br/>Note also that the fields in the shortcuts can "
145
+ "be different to the original file, for example \"Title\", \"Description\" or "
146
+ "\"Caption\"."
147
+ msgstr ""
148
+ "Este es un acceso directo de un archivo de biblioteca de medios. Los accesos "
149
+ "directos no necesitan ningún almacenamiento físico <strong>(0kb)</strong>. "
150
+ "Si deseas cambiar el archivo en sí, debes hacerlo en el archivo original "
151
+ "(por ejemplo, reemplazar el archivo multimedia a través de un complemento). "
152
+ "<br/>Ten en cuenta también que los campos en los accesos directos pueden ser "
153
+ "diferentes al archivo original, por ejemplo \"Título\", \"Descripción\" o "
154
+ "\"Título\"."
155
+
156
+ #. translators:
157
+ #: inc/attachment/CustomField.php:1
158
+ #, fuzzy
159
+ msgid "For this file is %d shortcut available in the following folder:"
160
+ msgid_plural ""
161
+ "For this file are %d shortcuts available in the following folders:"
162
+ msgstr[0] "Para este archivo hay un atajo disponible en la siguiente carpeta:"
163
+ msgstr[1] ""
164
+ "Plural: Para este archivo hay %s atajos disponibles en las siguientes "
165
+ "carpetas:"
166
+
167
+ #: inc/attachment/CustomField.php:1
168
+ msgid ""
169
+ "This file has no associated shortcuts. You can create shortcuts by moving "
170
+ "files per mouse and hold any key."
171
+ msgstr ""
172
+ "Este archivo no tiene ningún atajo asociado. Puedes crear atajos moviendo "
173
+ "los archivos con el ratón y manteniendo pulsada cualquier tecla."
174
+
175
+ #: inc/attachment/Permissions.php:1
176
+ msgid "You are not allowed to insert files here."
177
+ msgstr "No estás autorizado para insertar archivos aquí."
178
+
179
+ #: inc/attachment/Permissions.php:1
180
+ msgid "You are not allowed to move the file."
181
+ msgstr "No estás autorizado para mover el archivo."
182
+
183
+ #: inc/attachment/Permissions.php:1
184
+ msgid "You are not allowed to create a subfolder here."
185
+ msgstr "No estás autorizado para crear una subcarpeta aquí."
186
+
187
+ #: inc/attachment/Permissions.php:1
188
+ msgid "You are not allowed to delete this folder."
189
+ msgstr "No estás autorizado para borrar esta carpeta."
190
+
191
+ #: inc/attachment/Permissions.php:1
192
+ msgid "You are not allowed to rename this folder."
193
+ msgstr "No estás autorizado para renombrar esta carpeta."
194
+
195
+ #: inc/attachment/Upload.php:1
196
+ msgid "Select destination folder"
197
+ msgstr "Seleccione la carpeta de destino"
198
+
199
+ #: inc/attachment/Upload.php:1
200
+ msgid ""
201
+ "You can simply upload files directly to a folder. Select a folder and upload "
202
+ "files."
203
+ msgstr ""
204
+ "Puedes subir archivos directamente a una carpeta. Selecciona una carpeta y "
205
+ "carga los archivos."
206
+
207
+ #: inc/attachment/Upload.php:1
208
+ msgid "upload to folder"
209
+ msgstr "subir a la carpeta"
210
+
211
+ #: inc/comp/ExImport.php:1
212
+ msgid "RealMediaLibrary:Import / Export"
213
+ msgstr "RealMediaLibrary:Importación / Exportación"
214
+
215
+ #: inc/comp/ExImport.php:1
216
+ msgid "Import from other plugins"
217
+ msgstr "Importación de otros plugins"
218
+
219
+ #: inc/comp/ExImport.php:1
220
+ msgid "Export / Import Real Media Library folders"
221
+ msgstr "Exportar / Importar Real Media Library carpeta"
222
+
223
+ #: inc/comp/ExImport.php:1
224
+ msgid "Export"
225
+ msgstr "Exportar"
226
+
227
+ #: inc/comp/ExImport.php:1
228
+ msgid "Import"
229
+ msgstr "Importar"
230
+
231
+ #: inc/comp/ExImport.php:1
232
+ msgid ""
233
+ "All available folders will be exported. The current structure is not lost "
234
+ "during import - but check that there are no duplicate names in the import "
235
+ "data, as these are not checked."
236
+ msgstr ""
237
+ "El proceso de exportación respetará todas las carpetas disponibles. El "
238
+ "proceso de importación no tocará tu estructura actual. Por favor, asegúrate "
239
+ "de que los datos de importación no tienen nombres duplicados con tu "
240
+ "jerarquía actual."
241
+
242
+ #: inc/comp/ExImport.php:1
243
+ msgid "Exported data:"
244
+ msgstr "Exportar datos:"
245
+
246
+ #: inc/comp/ExImport.php:1
247
+ msgid "Import data:"
248
+ msgstr "Importar datos:"
249
+
250
+ #: inc/comp/ExImport.php:1
251
+ msgid "Importing data is only available in PRO version."
252
+ msgstr "La importación de datos sólo está disponible en la versión PRO."
253
+
254
+ #: inc/comp/ExImport.php:1 inc/usersettings/DefaultFolder.php:1
255
+ #: inc/view/Lang.php:1
256
+ msgid "Learn more about PRO"
257
+ msgstr "Más información sobre PRO"
258
+
259
+ #: inc/comp/ExImport.php:1
260
+ msgid "Imports categories and post relations."
261
+ msgstr "Importar categorías y relaciones de entradas."
262
+
263
+ #: inc/comp/ExImport.php:1
264
+ msgid "Nothing to import."
265
+ msgstr ""
266
+
267
+ #: inc/comp/ExImport.php:1
268
+ msgid ""
269
+ "Importing categories from another plugin is only available in PRO version."
270
+ msgstr ""
271
+ "La importación de categorías de otro plugin sólo está disponible en la "
272
+ "versión PRO."
273
+
274
+ #: inc/comp/ExportMediaLibrary.php:1
275
+ msgid "No valid folder."
276
+ msgstr "No hay una carpeta válida."
277
+
278
+ #: inc/comp/ExportMediaLibrary.php:1
279
+ msgid "No valid type."
280
+ msgstr "No hay ningún tipo válido."
281
+
282
+ #: inc/comp/PolyLang.php:1
283
+ msgid "PolyLang: Automatically move translations"
284
+ msgstr "PolyLang: Mover traducciones automáticamente"
285
+
286
+ #: inc/comp/PolyLang.php:1 inc/comp/WPML.php:1
287
+ msgid ""
288
+ "If you move a file, the corresponding translated file will also be moved."
289
+ msgstr ""
290
+ "Si mueves un archivo, mueve también los archivos de traducción asociados."
291
+
292
+ #: inc/comp/WPML.php:1
293
+ msgid "WPML: Automatically move translations"
294
+ msgstr "WPML: Mover traducciones automáticamente"
295
+
296
+ #. translators:
297
+ #: inc/exception/FolderAlreadyExistsException.php:1
298
+ msgid "'%s' already exists in this folder."
299
+ msgstr "'%s' ya existe en esta carpeta."
300
+
301
+ #. translators:
302
+ #: inc/exception/OnlyInProVersionException.php:1
303
+ msgid "This functionality is not available in the free version (%s)."
304
+ msgstr "Esta funcionalidad no está disponible en la versión gratuita (%s)."
305
+
306
+ #: inc/folder/Creatable.php:1
307
+ msgid "You need to provide a set of files."
308
+ msgstr "Debes proporcionar un conjunto de archivos."
309
+
310
+ #: inc/folder/Creatable.php:1
311
+ msgid "The folder could not be created in the database."
312
+ msgstr "No se pudo crear la carpeta en la base de datos."
313
+
314
+ #: inc/folder/Creatable.php:1
315
+ msgid "The folder could not be created because it already exists."
316
+ msgstr "No se pudo crear la carpeta porque ya existe."
317
+
318
+ #: inc/folder/Creatable.php:1
319
+ msgid ""
320
+ "A folder can contain every type of file or a collection, but not gallery."
321
+ msgstr ""
322
+ "Una carpeta puede contener cada tipo de archivo o una colección, pero no una "
323
+ "galería."
324
+
325
+ #. translators:
326
+ #: inc/folder/Creatable.php:1
327
+ msgid "'%s' is not a valid folder name."
328
+ msgstr "'%s' no es un nombre de carpeta válido."
329
+
330
+ #: inc/folder/Creatable.php:1
331
+ msgid "Order by name ascending"
332
+ msgstr "Orden por nombre ascendente"
333
+
334
+ #: inc/folder/Creatable.php:1
335
+ msgid "Order by name descending"
336
+ msgstr "Orden por nombre descendente"
337
+
338
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
339
+ msgid "Order by ID ascending"
340
+ msgstr "Ordenar por ID ascendente"
341
+
342
+ #: inc/folder/Creatable.php:1 inc/order/Sortable.php:1
343
+ msgid "Order by ID descending"
344
+ msgstr "Ordenar por ID descendente"
345
+
346
+ #: inc/folder/CRUD.php:1
347
+ msgid "The given folder does not exist or you cannot rename this folder."
348
+ msgstr "La carpeta no existe o no puedes renombrar esta carpeta."
349
+
350
+ #: inc/folder/CRUD.php:1 inc/view/Lang.php:1
351
+ msgid "The folder you try to delete has subfolders."
352
+ msgstr "La carpeta que intentas eliminar tiene subcarpetas."
353
+
354
+ #: inc/folder/CRUD.php:1
355
+ msgid "The given folder does not exist."
356
+ msgstr "La carpeta dada no existe."
357
+
358
+ #: inc/folder/Root.php:1 inc/view/Lang.php:1 inc/view/View.php:1
359
+ msgid "Unorganized"
360
+ msgstr "Sin organizar"
361
+
362
+ #: inc/folder/Root.php:1
363
+ msgid ""
364
+ "Unorganized is the same as a root folder. Here you can find all files which "
365
+ "are not assigned to a folder."
366
+ msgstr ""
367
+ "Desorganizado es lo mismo que una carpeta raíz. Aquí puedes encontrar todos "
368
+ "los archivos que no están asignados a una carpeta."
369
+
370
+ #: inc/metadata/CoverImage.php:1
371
+ msgid ""
372
+ "This option is disabled on this page. Please navigate to the media library."
373
+ msgstr ""
374
+
375
+ #: inc/metadata/CoverImage.php:1
376
+ msgid "Cover image"
377
+ msgstr "Imagen de portada"
378
+
379
+ #: inc/metadata/Description.php:1
380
+ msgid "Description"
381
+ msgstr "Descripción"
382
+
383
+ #: inc/metadata/Meta.php:1
384
+ msgid "Path"
385
+ msgstr "Ruta"
386
+
387
+ #: inc/metadata/Meta.php:1
388
+ msgid "Folder type"
389
+ msgstr "Tipo de carpeta"
390
+
391
+ #: inc/metadata/Meta.php:1
392
+ msgid "General"
393
+ msgstr "General"
394
+
395
+ #: inc/order/Sortable.php:1
396
+ msgid "Order by date ascending"
397
+ msgstr "Orden por fecha ascendente"
398
+
399
+ #: inc/order/Sortable.php:1
400
+ msgid "Order by date descending"
401
+ msgstr "Orden por fecha descendente"
402
+
403
+ #: inc/order/Sortable.php:1
404
+ msgid "Order by title ascending"
405
+ msgstr "Ordenar por título ascendente"
406
+
407
+ #: inc/order/Sortable.php:1
408
+ msgid "Order by title descending"
409
+ msgstr "Ordenar por título descendente"
410
+
411
+ #: inc/order/Sortable.php:1
412
+ msgid "Order by filename ascending"
413
+ msgstr "Ordenar por nombre ascendente"
414
+
415
+ #: inc/order/Sortable.php:1
416
+ msgid "Order by filename descending"
417
+ msgstr "Ordenar por nombre descendente"
418
+
419
+ #: inc/order/Sortable.php:1
420
+ msgid "Natural order by filename ascending"
421
+ msgstr "Orden natural por nombre ascendente"
422
+
423
+ #: inc/order/Sortable.php:1
424
+ msgid "Natural order by filename descending"
425
+ msgstr "Orden natural por nombre descendente"
426
+
427
+ #: inc/overrides/lite/folder/Creatable.php:1
428
+ #: inc/overrides/pro/folder/Creatable.php:1
429
+ #: inc/overrides/pro/order/Sortable.php:1 inc/rest/Attachment.php:1
430
+ msgid "Something went wrong."
431
+ msgstr "Algo salió mal."
432
+
433
+ #: inc/overrides/lite/rest/Service.php:1 inc/overrides/pro/rest/Service.php:1
434
+ msgid "Folder not found."
435
+ msgstr "Carpeta no encontrada."
436
+
437
+ #: inc/overrides/pro/Core.php:1
438
+ msgid ""
439
+ "<strong>You have not yet entered the license key</strong>. To receive "
440
+ "automatic updates, please enter the key in \"Enter license\"."
441
+ msgstr ""
442
+ "<strong>Todavía no has introducido la clave de licencia </strong>. Para "
443
+ "recibir actualizaciones automáticas, por favor introduce la clave en "
444
+ "\"Introducir licencia\"."
445
+
446
+ #: inc/overrides/pro/folder/Collection.php:1
447
+ msgid "A collection cannot contain files."
448
+ msgstr "Una colección no puede contener archivos."
449
+
450
+ #: inc/overrides/pro/folder/Collection.php:1
451
+ msgid "Collection"
452
+ msgstr "Colección"
453
+
454
+ #: inc/overrides/pro/folder/Collection.php:1
455
+ msgid ""
456
+ "A collection cannot contain files. But you can create other collections and "
457
+ "<strong> galleries</strong> there."
458
+ msgstr ""
459
+ "Una colección no puede contener archivos. Pero puedes crear allí otras "
460
+ "colecciones y <strong>galerías</strong>."
461
+
462
+ #. translators:
463
+ #: inc/overrides/pro/folder/Creatable.php:1
464
+ msgid "The parent %d does not exist."
465
+ msgstr "El padre %d no existe."
466
+
467
+ #: inc/overrides/pro/folder/Creatable.php:1
468
+ msgid "The given parent does not exist to set the parent for this folder."
469
+ msgstr "La carpeta superior no existe para asignarla a esta carpeta."
470
+
471
+ #: inc/overrides/pro/folder/Creatable.php:1
472
+ msgid "You are not allowed to change the parent for this folder."
473
+ msgstr "No estás autorizado para cambiar la carpeta superior de esta carpeta."
474
+
475
+ #: inc/overrides/pro/folder/Creatable.php:1
476
+ msgid "The given parent does not allow the folder type."
477
+ msgstr "La carpeta superior no permite el tipo de carpeta."
478
+
479
+ #: inc/overrides/pro/folder/Gallery.php:1
480
+ msgid "You can only move images to a gallery."
481
+ msgstr "Solo puedes mover imágenes a una galería."
482
+
483
+ #: inc/overrides/pro/folder/Gallery.php:1
484
+ msgid "Gallery"
485
+ msgstr "Galería"
486
+
487
+ #: inc/overrides/pro/folder/Gallery.php:1
488
+ msgid ""
489
+ "A gallery can only contain images. To view a gallery, go to a post and look "
490
+ "at the buttons of the visual editor.."
491
+ msgstr ""
492
+ "Una galería solo puede contener imágenes. Si deseas mostrar una galería, "
493
+ "dirígete a una entrada y echa un vistazo a los botones del editor visual."
494
+
495
+ #: inc/overrides/pro/order/Sortable.php:1
496
+ msgid "The given folder does not allow to reorder the files."
497
+ msgstr "La carpeta dada no permite reordenar los archivos."
498
+
499
+ #: inc/overrides/pro/order/Sortable.php:1
500
+ msgid "This folder has an automatic order. Please deactivate that first."
501
+ msgstr "Esta carpeta tiene un orden automático, por favor desactívalo primero."
502
+
503
+ #: inc/overrides/pro/usersettings/DefaultFolder.php:1 inc/view/Lang.php:1
504
+ msgid "Please select a folder to show items."
505
+ msgstr "Por favor, seleccione una carpeta para mostrar los elementos."
506
+
507
+ #: inc/rest/Attachment.php:1
508
+ msgid "Fetch only media in a folder by folder id."
509
+ msgstr "Obtener sólo los medios de una carpeta por el id de la carpeta."
510
+
511
+ #: inc/rest/Service.php:1
512
+ msgid "Forbidden"
513
+ msgstr "Prohibido"
514
+
515
+ #: inc/rest/Service.php:1
516
+ msgid "Real Media Library is not active for the current user."
517
+ msgstr "Real Media Library no está activo para el usuario actual."
518
+
519
+ #: inc/usersettings/AllFilesShortcuts.php:1
520
+ msgid "Hide shortcuts in \"All files\""
521
+ msgstr "Ocultar los atajos en \"Todos los archivos\""
522
+
523
+ #: inc/usersettings/AllFilesShortcuts.php:1
524
+ msgid "The count always includes shortcuts"
525
+ msgstr "El conteo siempre incluye atajos"
526
+
527
+ #: inc/usersettings/DefaultFolder.php:1
528
+ msgid "Default startup folder"
529
+ msgstr "Carpeta de inicio predeterminada"
530
+
531
+ #: inc/usersettings/DefaultFolder.php:1
532
+ msgid "No folder at startup"
533
+ msgstr "No hay carpeta en el inicio"
534
+
535
+ #: inc/usersettings/DefaultFolder.php:1
536
+ #, fuzzy
537
+ msgid "Last opened folder"
538
+ msgstr "La última carpeta consultada"
539
+
540
+ #: inc/usersettings/DefaultFolder.php:1
541
+ msgid ""
542
+ "Your media library can always open in the last opened folder or a folder you "
543
+ "choose. This saves you time every time you open the media library!"
544
+ msgstr ""
545
+
546
+ #: inc/usersettings/InfiniteScrolling.php:1
547
+ msgid "Enable infinite scrolling in grid view"
548
+ msgstr ""
549
+
550
+ #: inc/usersettings/InfiniteScrolling.php:1
551
+ msgid ""
552
+ "Instead of displaying a \"Load More\" button, all files are loaded "
553
+ "automatically as you scroll down. This is not supported in list view."
554
+ msgstr ""
555
+
556
+ #: inc/view/FolderShortcode.php:1
557
+ msgid "Gallery from Media Folder"
558
+ msgstr "Galería de la carpeta de medios"
559
+
560
+ #: inc/view/FolderShortcode.php:1
561
+ msgid ""
562
+ "Note: You can only select galleries. Folders and collections are grayed."
563
+ msgstr ""
564
+ "Nota: solo puedes seleccionar galerías. Las carpetas y colecciones están en "
565
+ "gris."
566
+
567
+ #: inc/view/FolderShortcode.php:1
568
+ msgid "Link to"
569
+ msgstr "Enlace a"
570
+
571
+ #: inc/view/FolderShortcode.php:1
572
+ msgid "Columns"
573
+ msgstr "Columnas"
574
+
575
+ #: inc/view/FolderShortcode.php:1
576
+ msgid "Random Order"
577
+ msgstr "Orden aleatorio"
578
+
579
+ #: inc/view/FolderShortcode.php:1
580
+ msgid "Size"
581
+ msgstr "Tamaño"
582
+
583
+ #: inc/view/FolderShortcode.php:1
584
+ msgid "Attachment File"
585
+ msgstr "Archivo Adjunto"
586
+
587
+ #: inc/view/FolderShortcode.php:1
588
+ msgid "Media File"
589
+ msgstr "Archivo multimedia"
590
+
591
+ #: inc/view/FolderShortcode.php:1
592
+ msgid "None"
593
+ msgstr "Ninguno"
594
+
595
+ #: inc/view/FolderShortcode.php:1
596
+ msgid "Thumbnail"
597
+ msgstr "Miniatura"
598
+
599
+ #: inc/view/FolderShortcode.php:1
600
+ msgid "Medium"
601
+ msgstr "Mediano"
602
+
603
+ #: inc/view/FolderShortcode.php:1
604
+ msgid "Large"
605
+ msgstr "Grande"
606
+
607
+ #: inc/view/FolderShortcode.php:1
608
+ msgid "Full Size"
609
+ msgstr "Tamaño completo"
610
+
611
+ #: inc/view/Lang.php:1
612
+ msgid ""
613
+ "Subfolders are only available in the PRO version. But you can now create an "
614
+ "unlimited number of folders on the main level (instead of the previous max. "
615
+ "10 folders)."
616
+ msgstr ""
617
+
618
+ #: inc/view/Lang.php:1
619
+ msgid "No folder selected"
620
+ msgstr "No hay ninguna carpeta seleccionada"
621
+
622
+ #: inc/view/Lang.php:1
623
+ #, fuzzy
624
+ msgid "Select folder"
625
+ msgstr "Seleccione la carpeta de destino"
626
+
627
+ #: inc/view/Lang.php:1
628
+ msgid "Reload content"
629
+ msgstr "Recargar el contenido"
630
+
631
+ #: inc/view/Lang.php:1
632
+ msgid "Subfolders"
633
+ msgstr "Subcarpetas"
634
+
635
+ #: inc/view/Lang.php:1
636
+ msgid "Please select a folder (media library) in the block settings."
637
+ msgstr ""
638
+ "Por favor selecciona una carpeta Media Library en la configuración del "
639
+ "bloque."
640
+
641
+ #: inc/view/Lang.php:1
642
+ msgid "New folders inherit this restriction"
643
+ msgstr "Las nuevas carpetas heredan esta restricción"
644
+
645
+ #: inc/view/Lang.php:1
646
+ msgid "The current selected folder has some restrictions:"
647
+ msgstr "La carpeta seleccionada tiene algunas restricciones:"
648
+
649
+ #: inc/view/Lang.php:1
650
+ msgid "You cannot change *parent* folder"
651
+ msgstr "No puedes cambiar la carpeta *parent*"
652
+
653
+ #: inc/view/Lang.php:1
654
+ msgid "You cannot *rearrange* subfolders"
655
+ msgstr "No puedes *reorganizar* las subcarpetas"
656
+
657
+ #: inc/view/Lang.php:1
658
+ msgid "You cannot *create* subfolders"
659
+ msgstr "No puedes *crear* subcarpetas"
660
+
661
+ #: inc/view/Lang.php:1
662
+ msgid "You cannot *insert* new files. New files will be moved to Unorganized…"
663
+ msgstr ""
664
+
665
+ #: inc/view/Lang.php:1
666
+ msgid "You cannot *rename* the folder"
667
+ msgstr "No puedes *renombrar* la carpeta"
668
+
669
+ #: inc/view/Lang.php:1
670
+ msgid "You cannot *delete* the folder"
671
+ msgstr "No puedes *eliminar* la carpeta"
672
+
673
+ #: inc/view/Lang.php:1
674
+ msgid "You cannot *move* files outside the folder"
675
+ msgstr "No puedes *mover* archivos fuera de la carpeta"
676
+
677
+ #: inc/view/Lang.php:1
678
+ msgid "Parent"
679
+ msgstr "Padre"
680
+
681
+ #: inc/view/Lang.php:1
682
+ msgid "Before this node"
683
+ msgstr "Antes de este nodo"
684
+
685
+ #: inc/view/Lang.php:1
686
+ msgid "If no next node is given, the element is placed at the end."
687
+ msgstr "Si no se proporciona el siguiente nodo, el elemento se pone al final."
688
+
689
+ #: inc/view/Lang.php:1
690
+ msgid "The file is uploaded to the folder where you are currently in."
691
+ msgstr ""
692
+ "El archivo está cargado en la carpeta en la que te encuentras actualmente."
693
+
694
+ #: inc/view/Lang.php:1
695
+ msgid "Are you sure?"
696
+ msgstr "¿Estás seguro?"
697
+
698
+ #: inc/view/Lang.php:1
699
+ msgid "Success"
700
+ msgstr "Éxito"
701
+
702
+ #: inc/view/Lang.php:1
703
+ msgid "Failed"
704
+ msgstr "Fallido"
705
+
706
+ #: inc/view/Lang.php:1
707
+ msgid "No entries found"
708
+ msgstr "No se han encontrado entradas"
709
+
710
+ #: inc/view/Lang.php:1
711
+ msgid "Are you sure to delete *{name}*? All files gets moved to Unorganized."
712
+ msgstr ""
713
+ "¿Estás seguro de borrar *{name}*? Todos los archivos serán movidos a / "
714
+ "Desorganizados."
715
+
716
+ #: inc/view/Lang.php:1
717
+ msgid ""
718
+ "Are you sure to delete *{count} folders*? All files gets moved to "
719
+ "Unorganized."
720
+ msgstr ""
721
+ "¿Está seguro de eliminar las carpetas de *{count}? Todos los archivos se "
722
+ "mueven a / Desorganizado."
723
+
724
+ #: inc/view/Lang.php:1
725
+ msgid "Ok"
726
+ msgstr ""
727
+
728
+ #: inc/view/Lang.php:1
729
+ msgid "Cancel"
730
+ msgstr "Cancelar"
731
+
732
+ #: inc/view/Lang.php:1
733
+ msgid "Save"
734
+ msgstr "Guardar"
735
+
736
+ #: inc/view/Lang.php:1
737
+ msgid "Back"
738
+ msgstr "Volver"
739
+
740
+ #: inc/view/Lang.php:1
741
+ msgid "No folders found"
742
+ msgstr "Carpetas no encontradas"
743
+
744
+ #: inc/view/Lang.php:1
745
+ msgid ""
746
+ "No folders have been created yet. Just click on the button above to create "
747
+ "your first folder."
748
+ msgstr ""
749
+ "No has creado ninguna carpeta. Solo tienes que hacer clic en el botón de "
750
+ "encabezado para crear tu primera carpeta."
751
+
752
+ #: inc/view/Lang.php:1
753
+ msgid "Folders"
754
+ msgstr "Carpetas"
755
+
756
+ #: inc/view/Lang.php:1
757
+ msgid "No search results."
758
+ msgstr "No hay resultados de búsqueda."
759
+
760
+ #: inc/view/Lang.php:1
761
+ msgid "Renaming to *{name}*…"
762
+ msgstr ""
763
+
764
+ #: inc/view/Lang.php:1
765
+ msgid "Successfully renamed folder to *{name}*"
766
+ msgstr "Se renombró correctamente la carpeta a *{name}*"
767
+
768
+ #: inc/view/Lang.php:1
769
+ msgid "Creating *{name}*…"
770
+ msgstr ""
771
+
772
+ #: inc/view/Lang.php:1
773
+ msgid "Successfully created *{name}*"
774
+ msgstr "*{name}* creado con éxito"
775
+
776
+ #: inc/view/Lang.php:1
777
+ msgid "Deleting *{name}*…"
778
+ msgstr ""
779
+
780
+ #: inc/view/Lang.php:1
781
+ msgid "Successfully deleted *{name}*"
782
+ msgstr "*{name}* borrado con éxito"
783
+
784
+ #: inc/view/Lang.php:1
785
+ msgid "Successfully deleted *{count} folders*"
786
+ msgstr "*Carpetas {Count}* eliminadas con éxito"
787
+
788
+ #: inc/view/Lang.php:1
789
+ msgid "Rearrange *{name}* placement manually"
790
+ msgstr "Reorganizar la ubicación *{name}* manualmente"
791
+
792
+ #: inc/view/Lang.php:1
793
+ msgid "Reordering the tree hierarchy…"
794
+ msgstr ""
795
+
796
+ #: inc/view/Lang.php:1
797
+ msgid "Successfully sorted the tree hierarchy"
798
+ msgstr "Se ordenó correctamente la jerarquía del árbol"
799
+
800
+ #: inc/view/Lang.php:1
801
+ msgid "Reorder subfolders of *{name}*…"
802
+ msgstr ""
803
+
804
+ #: inc/view/Lang.php:1
805
+ msgid "{count} files remaining…"
806
+ msgstr ""
807
+
808
+ #: inc/view/Lang.php:1
809
+ msgid "Receiving data…"
810
+ msgstr ""
811
+
812
+ #: inc/view/Lang.php:1
813
+ msgid "Shortcut"
814
+ msgstr "Acceso directo"
815
+
816
+ #: inc/view/Lang.php:1
817
+ msgid ""
818
+ "This is a shortcut of a media library file. Shortcuts doesn't need any "
819
+ "physical storage *(0 kB)*. If you want to change the file itself, you must "
820
+ "do this in the original file (for example replace media file through a "
821
+ "plugin).\n"
822
+ "Note also that the fields in the shortcuts can be different to the original "
823
+ "file, for example \"Title\", \"Description\" or \"Caption\"."
824
+ msgstr ""
825
+ "Este es un acceso directo de un archivo de biblioteca de medios. Los accesos "
826
+ "directos no necesitan ningún almacenamiento físico *(0kb)*. Si deseas "
827
+ "cambiar el archivo en sí, debea hacerlo en el archivo original (por ejemplo, "
828
+ "reemplazar el archivo multimedia a través de un complemento).\n"
829
+ "Ten en cuenta también que los campos en los accesos directos pueden ser "
830
+ "diferentes al archivo original, por ejemplo, \"Título\", \"Descripción\" o "
831
+ "\"Título\"."
832
+
833
+ #: inc/view/Lang.php:1
834
+ msgid ""
835
+ "In the current view of uploads, filters are active. Please reset them and "
836
+ "refresh the view."
837
+ msgstr ""
838
+ "En la vista actual de archivos subidos hay filtros activos. Por favor, "
839
+ "restablécelos y actualiza la vista."
840
+
841
+ #: inc/view/Lang.php:1
842
+ msgid "A collection cannot contain files. Upload moved to Unorganized…"
843
+ msgstr ""
844
+
845
+ #: inc/view/Lang.php:1
846
+ msgid "A gallery can only contain images. Upload moved to Unorganized…"
847
+ msgstr ""
848
+
849
+ #: inc/view/Lang.php:1
850
+ msgid "Order content by *{name}*…"
851
+ msgstr ""
852
+
853
+ #: inc/view/Lang.php:1
854
+ msgid "Order content by drag & drop"
855
+ msgstr "Reorganizar el árbol arrastrando y soltando"
856
+
857
+ #: inc/view/Lang.php:1
858
+ msgid "Reset order"
859
+ msgstr "Restablecer orden"
860
+
861
+ #: inc/view/Lang.php:1
862
+ msgid "Apply order once…"
863
+ msgstr ""
864
+
865
+ #: inc/view/Lang.php:1
866
+ msgid "Last"
867
+ msgstr "Último"
868
+
869
+ #: inc/view/Lang.php:1
870
+ msgid "Deactivate automatic ordering"
871
+ msgstr "Desactivar el pedido automático"
872
+
873
+ #: inc/view/Lang.php:1
874
+ msgid "Apply automatic order…"
875
+ msgstr ""
876
+
877
+ #: inc/view/Lang.php:1
878
+ msgid "Latest"
879
+ msgstr "Último"
880
+
881
+ #: inc/view/Lang.php:1
882
+ msgid "Reindex order"
883
+ msgstr "Reindexar orden"
884
+
885
+ #: inc/view/Lang.php:1
886
+ msgid "Reset to last order"
887
+ msgstr "Reajustar a la última orden"
888
+
889
+ #: inc/view/Lang.php:1
890
+ msgid "All files"
891
+ msgstr "Todos los archivos"
892
+
893
+ #: inc/view/Lang.php:1
894
+ msgid "Move {count} files"
895
+ msgstr "Mover {count} archivos"
896
+
897
+ #: inc/view/Lang.php:1
898
+ msgid "Move one file"
899
+ msgstr "Mover un archivo"
900
+
901
+ #: inc/view/Lang.php:1
902
+ msgid "Copy {count} files"
903
+ msgstr "Copiar {count} archivos"
904
+
905
+ #: inc/view/Lang.php:1
906
+ msgid "Copy one file"
907
+ msgstr "Copiar un archivo"
908
+
909
+ #: inc/view/Lang.php:1
910
+ msgid "Moving {count} files…"
911
+ msgstr ""
912
+
913
+ #: inc/view/Lang.php:1
914
+ msgid "Moving one file…"
915
+ msgstr ""
916
+
917
+ #: inc/view/Lang.php:1
918
+ msgid "Copying {count} files…"
919
+ msgstr ""
920
+
921
+ #: inc/view/Lang.php:1
922
+ msgid "Copying one file…"
923
+ msgstr ""
924
+
925
+ #: inc/view/Lang.php:1
926
+ msgid "Successfully moved {count} files"
927
+ msgstr "{count} archivos movidos con éxito"
928
+
929
+ #: inc/view/Lang.php:1
930
+ msgid "Successfully moved one file"
931
+ msgstr "Se ha movido con éxito un archivo"
932
+
933
+ #: inc/view/Lang.php:1
934
+ msgid "Successfully copied {count} files"
935
+ msgstr "{count} archivos copiados con éxito"
936
+
937
+ #: inc/view/Lang.php:1
938
+ msgid "Successfully copied one file"
939
+ msgstr "Un archivo copiado con éxito"
940
+
941
+ #: inc/view/Lang.php:1
942
+ msgid "Hold any key to create a shortcut"
943
+ msgstr "Mantén pulsada cualquier tecla para crear un atajo"
944
+
945
+ #: inc/view/Lang.php:1
946
+ msgid "Release key to move file"
947
+ msgstr "Suelta la tecla para mover el archivo"
948
+
949
+ #: inc/view/Lang.php:1
950
+ msgid "Click this to create a new folder"
951
+ msgstr "Haz clic aquí para crear una nueva carpeta"
952
+
953
+ #: inc/view/Lang.php:1
954
+ msgid ""
955
+ "A folder can contain any file type and collection, but not galleries. If you "
956
+ "want to create a subfolder, select a folder and click this button."
957
+ msgstr ""
958
+ "Una carpeta puede contener cualquier tipo de archivo y colecciones, pero no "
959
+ "galerías. Si deseas crear una subcarpeta solo selecciona una carpeta de la "
960
+ "lista y haz clic en este botón."
961
+
962
+ #: inc/view/Lang.php:1
963
+ msgid "Click this to create a new collection"
964
+ msgstr "Haz clic aquí para crear una nueva colección"
965
+
966
+ #: inc/view/Lang.php:1
967
+ msgid ""
968
+ "A collection cannot contain files. However, you can create additional "
969
+ "collections and *galleries* there. This gallery is only a *gallery data "
970
+ "folder*, i.e. they are not automatically visible on the website.\n"
971
+ "\n"
972
+ "You can create a *visual gallery* by using a shortcode in the Visual Editor "
973
+ "on your pages/postings."
974
+ msgstr ""
975
+ "Una colección puede no contener archivos. Pero puedes crear allí otras "
976
+ "colecciones y *galerías*. La galería arriba mencionada es solo una *carpeta "
977
+ "de datos de la galería*, lo que significa que no están automáticamente en tu "
978
+ "front-end (tu sitio web).\n"
979
+ "\n"
980
+ "Puedes crear una *galería visual* desde esta *carpeta de datos de la "
981
+ "galería* a través del Editor Visual en tu página/publicación."
982
+
983
+ #: inc/view/Lang.php:1
984
+ msgid "Click this to create a *new gallery data folder*"
985
+ msgstr "Haz clic aquí para crear una *nueva carpeta de datos de la galería*"
986
+
987
+ #: inc/view/Lang.php:1
988
+ msgid ""
989
+ "A *gallery data folder* can only contain images. It is easier for you to "
990
+ "distinguish where your visual galleries are located.\n"
991
+ "\n"
992
+ "You can also order the images into *a custom image order* per drag&drop."
993
+ msgstr ""
994
+ "Una *carpeta de datos de galería* solo puede contener imágenes. Es más "
995
+ "sencillo para ti distinguir dónde están tus galerías visuales.\n"
996
+ "\n"
997
+ "También puedes ordenar las imágenes en *un pedido de imágenes "
998
+ "personalizadas* arrastrando y soltando."
999
+
1000
+ #: inc/view/Lang.php:1
1001
+ msgid "Settings"
1002
+ msgstr "Ajustes"
1003
+
1004
+ #: inc/view/Lang.php:1
1005
+ msgid "General settings for the current logged in user."
1006
+ msgstr "Configuración general para el usuario conectado actualmente."
1007
+
1008
+ #: inc/view/Lang.php:1
1009
+ msgid "Permissions"
1010
+ msgstr "Permisos"
1011
+
1012
+ #: inc/view/Lang.php:1
1013
+ msgid "Reorder files in this folder"
1014
+ msgstr "Reordenar archivos en esta carpeta"
1015
+
1016
+ #: inc/view/Lang.php:1
1017
+ msgid "Start to reorder the files / images by *title, filename, ID, …*"
1018
+ msgstr ""
1019
+
1020
+ #: inc/view/Lang.php:1
1021
+ msgid "Refresh"
1022
+ msgstr "Actualizar"
1023
+
1024
+ #: inc/view/Lang.php:1
1025
+ msgid "Refreshes the current folder view."
1026
+ msgstr "Actualiza la vista de la carpeta actual."
1027
+
1028
+ #: inc/view/Lang.php:1
1029
+ msgid "Rename"
1030
+ msgstr "Renombrar"
1031
+
1032
+ #: inc/view/Lang.php:1
1033
+ msgid "Rename the current selected folder."
1034
+ msgstr "Renombrar la carpeta actualmente seleccionada."
1035
+
1036
+ #: inc/view/Lang.php:1
1037
+ msgid "Delete"
1038
+ msgstr "Eliminar"
1039
+
1040
+ #: inc/view/Lang.php:1
1041
+ msgid "Delete the current selected folder."
1042
+ msgstr "Eliminar la carpeta seleccionada."
1043
+
1044
+ #: inc/view/Lang.php:1
1045
+ msgid "Delete the current selected folders."
1046
+ msgstr "Eliminar la carpeta seleccionada."
1047
+
1048
+ #: inc/view/Lang.php:1
1049
+ msgid "Rearrange"
1050
+ msgstr "Reordenar"
1051
+
1052
+ #: inc/view/Lang.php:1
1053
+ msgid "Change the hierarchical order of the folders."
1054
+ msgstr "Cambiar el orden jerárquico de las carpetas."
1055
+
1056
+ #: inc/view/Lang.php:1
1057
+ msgid "Folder details"
1058
+ msgstr "Detalles de carpeta"
1059
+
1060
+ #: inc/view/Lang.php:1
1061
+ msgid "Select a folder and view more details about it."
1062
+ msgstr "Selecciona una carpeta y mira más detalles."
1063
+
1064
+ #: inc/view/Lang.php:1
1065
+ msgid "Product license not yet activated."
1066
+ msgstr "La licencia del producto no está activada todavía."
1067
+
1068
+ #: inc/view/Lang.php:1
1069
+ msgid "Enter license"
1070
+ msgstr "Introduce la licencia"
1071
+
1072
+ #: inc/view/Lang.php:1
1073
+ msgid "Dismiss notice"
1074
+ msgstr "Descartar este aviso"
1075
+
1076
+ #: inc/view/Lang.php:1
1077
+ msgid ""
1078
+ "It looks like you have already used another plugin for folders in the media "
1079
+ "library."
1080
+ msgstr "Parece que ya has usado otro plugin para las carpetas de la mediateca."
1081
+
1082
+ #: inc/view/Lang.php:1
1083
+ msgid "Start importing"
1084
+ msgstr "Empieza a importar"
1085
+
1086
+ #: inc/view/Lang.php:1
1087
+ msgid "Dismiss"
1088
+ msgstr "Descartar"
1089
+
1090
+ #: inc/view/Lang.php:1
1091
+ msgid ""
1092
+ "Real Media Library creates a virtual folder structure. The URLs of uploads "
1093
+ "do not change when you move the file. Learn more about <a href=\"https://"
1094
+ "devowl.io/knowledge-base/how-can-i-physically-reflect-the-virtual-folder-"
1095
+ "structure-to-my-file-system/\" target=\"_blank\">how to automatically move "
1096
+ "files to physical folders.</a>"
1097
+ msgstr ""
1098
+
1099
+ #: inc/view/Lang.php:1
1100
+ msgid ""
1101
+ "You will be redirected to the external website of PRO version. Please "
1102
+ "confirm to continue!"
1103
+ msgstr ""
1104
+ "Usted será redirigido a la página web externa de la versión PRO. Por favor, "
1105
+ "confirme para continuar!"
1106
+
1107
+ #: inc/view/Lang.php:1
1108
+ msgid "PRO Feature"
1109
+ msgstr "Función PRO"
1110
+
1111
+ #: inc/view/Lang.php:1
1112
+ msgid "Hide for 20 days"
1113
+ msgstr "Esconderse durante 20 días"
1114
+
1115
+ #: inc/view/Lang.php:1
1116
+ msgid "Thanks for using the free version of Real Media Library."
1117
+ msgstr "Gracias por usar la versión gratuita de la Real Media Library."
1118
+
1119
+ #: inc/view/Lang.php:1
1120
+ msgid "Get PRO!"
1121
+ msgstr "Consigue PRO!"
1122
+
1123
+ #: inc/view/Lang.php:1
1124
+ msgid "I want to learn more!"
1125
+ msgstr "Quiero aprender más!"
1126
+
1127
+ #: inc/view/Lang.php:1
1128
+ msgid "No, not interested…"
1129
+ msgstr ""
1130
+
1131
+ #: inc/view/Lang.php:1
1132
+ msgid "You like collections?"
1133
+ msgstr ""
1134
+
1135
+ #: inc/view/Lang.php:1
1136
+ msgid ""
1137
+ "Get more organized with different types of folders: Collections and "
1138
+ "galleries help you to easily recognize where your image galleries are "
1139
+ "located."
1140
+ msgstr ""
1141
+ "Organícese mejor con diferentes tipos de carpetas: Las colecciones y "
1142
+ "galerías le ayudan a reconocer fácilmente dónde se encuentran sus galerías "
1143
+ "de imágenes."
1144
+
1145
+ #: inc/view/Lang.php:1
1146
+ msgid "Custom content order?"
1147
+ msgstr ""
1148
+
1149
+ #: inc/view/Lang.php:1
1150
+ msgid ""
1151
+ "Get your folder contents in order and arrange your files according to a "
1152
+ "criterion (e.g. name descending) or by drag & drop."
1153
+ msgstr ""
1154
+ "Ordene los contenidos de sus carpetas y organice sus archivos según un "
1155
+ "criterio (por ejemplo, descendiendo el nombre) o mediante arrastrar y soltar."
1156
+
1157
+ #: inc/view/Lang.php:1
1158
+ msgid "Full order control?"
1159
+ msgstr ""
1160
+
1161
+ #: inc/view/Lang.php:1
1162
+ msgid ""
1163
+ "Organize the nodes within your folder tree according to a criterion (e.g. "
1164
+ "name descending) or by drag & drop."
1165
+ msgstr ""
1166
+ "Organice los nodos dentro de su árbol de carpetas según un criterio (por "
1167
+ "ejemplo, descendiendo el nombre) o mediante arrastrar y soltar."
1168
+
1169
+ #: inc/view/Lang.php:1
1170
+ #, fuzzy
1171
+ msgid "Want to create subfolders?"
1172
+ msgstr "Haz clic aquí para crear una nueva carpeta"
1173
+
1174
+ #: inc/view/Lang.php:1
1175
+ msgid ""
1176
+ "Subfolders offer you the possibility to bring more structure into your media "
1177
+ "library. They help you to keep the overview, even if you really have many "
1178
+ "files in your media library."
1179
+ msgstr ""
1180
+
1181
+ #: inc/view/Lang.php:1
1182
+ msgid "Want to switch between folders more comfortably?"
1183
+ msgstr ""
1184
+
1185
+ #: inc/view/Lang.php:1
1186
+ msgid ""
1187
+ "Let the complete folder tree as in your media library al