Compare commits
3 Commits
hamburgwah
...
piraten-mi
| Author | SHA1 | Date | |
|---|---|---|---|
| acdfb054ea | |||
|
f5e9d2a6d9
|
|||
|
|
ac980f592c |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Editor tips":["Editor-Tipps"],"Disable tips":["Tipps deaktivieren"],"Got it":["Verstanden"],"See next tip":["N\u00e4chsten Tipp ansehen"]}},"comment":{"reference":"wp-includes\/js\/dist\/nux.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Disable tips":["Tipps deaktivieren"],"Got it":["Verstanden"],"See next tip":["N\u00e4chsten Tipp ansehen"],"Editor tips":["Editor-Tipps"]}},"comment":{"reference":"wp-includes\/js\/dist\/nux.js"}}
|
||||||
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Reusable Blocks":["Wiederverwendbare Bl\u00f6cke"],"Embeds":["Einbettungen"],"Layout Elements":["Layout-Elemente"],"Formatting":["Formatierung"],"Common Blocks":["Allgemeine Bl\u00f6cke"],"Widgets":["Widgets"]}},"comment":{"reference":"wp-includes\/js\/dist\/blocks.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Reusable Blocks":["Wiederverwendbare Bl\u00f6cke"],"Embeds":["Einbettungen"],"Layout Elements":["Layout-Elemente"],"Formatting":["Formatierung"],"Common Blocks":["Allgemeine Bl\u00f6cke"],"Widgets":["Widgets"]}},"comment":{"reference":"wp-includes\/js\/dist\/blocks.js"}}
|
||||||
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"The response is not a valid JSON response.":["Die Antwort ist keine g\u00fcltige JSON-Antwort."],"An unknown error occurred.":["Ein unbekannter Fehler ist aufgetreten."]}},"comment":{"reference":"wp-includes\/js\/dist\/api-fetch.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"An unknown error occurred.":["Ein unbekannter Fehler ist aufgetreten."],"The response is not a valid JSON response.":["Die Antwort ist keine g\u00fcltige JSON-Antwort."]}},"comment":{"reference":"wp-includes\/js\/dist\/api-fetch.js"}}
|
||||||
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Reusable block imported successfully!":["Wiederverwendbarer Block erfolgreich importiert!"],"button label\u0004Import":["Importieren"],"Unknown error":["Unbekannter Fehler"],"Invalid Reusable Block JSON file":["Ung\u00fcltige JSON-Datei f\u00fcr wiederverwendbaren Block"],"Invalid JSON file":["Ung\u00fcltige JSON-Datei"],"Import from JSON":["Import von JSON"],"File":["Datei"]}},"comment":{"reference":"wp-includes\/js\/dist\/list-reusable-blocks.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Reusable block imported successfully!":["Wiederverwendbarer Block erfolgreich importiert!"],"Import from JSON":["Import von JSON"],"button label\u0004Import":["Importieren"],"File":["Datei"],"Unknown error":["Unbekannter Fehler"],"Invalid Reusable Block JSON file":["Ung\u00fcltige JSON-Datei f\u00fcr wiederverwendbaren Block"],"Invalid JSON file":["Ung\u00fcltige JSON-Datei"]}},"comment":{"reference":"wp-includes\/js\/dist\/list-reusable-blocks.js"}}
|
||||||
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Annotation":["Anmerkung"]}},"comment":{"reference":"wp-includes\/js\/dist\/annotations.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Annotation":["Anmerkung"]}},"comment":{"reference":"wp-includes\/js\/dist\/annotations.js"}}
|
||||||
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Link edited.":["Link bearbeitet."],"%s (opens in a new tab)":["%s (\u00f6ffnet in neuem Tab)"],"Link removed.":["Link entfernt."],"Inline Image":["Inline-Bild"],"media":["Medien"],"photo":["Foto"],"Warning: the link has been inserted but may have errors. Please test it.":["Warnung: Der Link wurde eingef\u00fcgt, k\u00f6nnte aber fehlerhaft sein. Bitte teste ihn."],"Link inserted.":["Link eingef\u00fcgt."],"Link":["Link"],"Open in New Tab":["In neuem Tab \u00f6ffnen"],"Image":["Bild"],"Unlink":["Link entfernen"],"Strikethrough":["Durchgestrichen"],"Underline":["Unterstreichen"],"Italic":["Kursiv"],"Bold":["Fett"],"Code":["Code"],"Width":["Breite"],"Apply":["\u00dcbernehmen"],"Edit":["Bearbeiten"]}},"comment":{"reference":"wp-includes\/js\/dist\/format-library.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Unlink":["Link entfernen"],"Link removed.":["Link entfernt."],"Link edited.":["Link bearbeitet."],"%s (opens in a new tab)":["%s (\u00f6ffnet in neuem Tab)"],"Inline Image":["Inline-Bild"],"media":["Medien"],"photo":["Foto"],"Open in New Tab":["In neuem Tab \u00f6ffnen"],"Warning: the link has been inserted but may have errors. Please test it.":["Warnung: Der Link wurde eingef\u00fcgt, k\u00f6nnte aber fehlerhaft sein. Bitte teste ihn."],"Edit":["Bearbeiten"],"Link":["Link"],"Strikethrough":["Durchgestrichen"],"Apply":["\u00dcbernehmen"],"Link inserted.":["Link eingef\u00fcgt."],"Image":["Bild"],"Code":["Code"],"Italic":["Kursiv"],"Bold":["Fett"]}},"comment":{"reference":"wp-includes\/js\/dist\/format-library.js"}}
|
||||||
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Vertical Pos.":["Vertikale Pos."],"Horizontal Pos.":["Horizontale Pos."],"Custom Color":["Individuelle Farbe"],"Font size: %s":["Schriftgr\u00f6\u00dfe: %s"],"Error loading block: %s":["Fehler beim Laden des Blocks: %s"],"Number of items":["Anzahl Elemente"],"Category":["Kategorie"],"Z \u2192 A":["Z → A"],"A \u2192 Z":["A → Z"],"Oldest to Newest":["Alt nach Neu"],"Newest to Oldest":["Neu nach Alt"],"Order by":["Reihenfolge von"],"Dismiss this notice":["Diesen Hinweis verwerfen"],"%1$s (%2$s of %3$s)":["%1$s (%2$s of %3$s)"],"Remove item":["Element entfernen"],"Item removed.":["Element entfernt."],"Item added.":["Element hinzugef\u00fcgt."],"Separate with commas":["Mit Kommas trennen"],"Add item":["Element hinzuf\u00fcgen"],"Reset":["Zur\u00fccksetzen"],"font size name\u0004Custom":["Individuell"],"font size name\u0004Normal":["Normal"],"Custom font size":["Individuelle Schriftgr\u00f6\u00dfe"],"(opens in a new tab)":["(\u00f6ffnet in neuem Tab)"],"Minutes":["Minuten"],"Calendar Help":["Kalender-Hilfe"],"Go to the first (home) or last (end) day of a week.":["Gehe zum ersten (Start) oder letzten (Ende) Tag der Woche."],"Home\/End":["Start\/Ende"],"Home and End":["Start und Ende"],"Move backward (PgUp) or forward (PgDn) by one month.":["Zur\u00fcck (Bild-auf) oder vorw\u00e4rts (Bild-ab) bewegen um einen Monat."],"PgUp\/PgDn":["Bild-auf\/Bild-ab"],"Page Up and Page Down":["Bild-auf und Bild-ab"],"Move backward (up) or forward (down) by one week.":["Zur\u00fcck (hoch) oder vorw\u00e4rts (runter) bewegen um eine Woche."],"Up and Down Arrows":["Pfeile hoch und runter"],"Move backward (left) or forward (right) by one day.":["Zur\u00fcck (links) oder vorw\u00e4rts (rechts) bewegen um einen Tag."],"Left and Right Arrows":["Pfeile links und rechts"],"Select the date in focus.":["Datum im Fokus ausw\u00e4hlen."],"keyboard button\u0004Enter":["Eingabetaste"],"Navigating with a keyboard":["Navigation mit einer Tastatur"],"Click the desired day to select it.":["Klicke den gew\u00fcnschten Tag an, um ihn auszuw\u00e4hlen."],"Click the right or left arrows to select other months in the past or the future.":["Klicke die Pfeile nach rechts oder links an, um Monate in der Vergangenheit oder der Zukunft auszuw\u00e4hlen."],"Click to Select":["Klicken zum Ausw\u00e4hlen"],"Use your arrow keys to change the base color. Move up to lighten the color, down to darken, left to decrease saturation, and right to increase saturation.":["Benutze deine Pfeiltasten, um die Basisfarbe zu \u00e4ndern. Hoch, um die Farbe aufzuhellen, runter zum Verdunkeln, links um die S\u00e4ttigung zu erh\u00f6hen, rechts um sie zu verringern."],"Choose a shade":["Farbton ausw\u00e4hlen"],"Change color format":["Farbformat wechseln"],"Color value in HSL":["HSL-Farbwert"],"Color value in RGB":["RGB-Farbwert"],"Color value in hexadecimal":["Hexadezimaler Farbwert"],"Hex color mode active":["Hex-Farbmodus aktiv"],"Hue\/saturation\/lightness mode active":["Farbton\/S\u00e4ttigung\/Helligkeit-Modus aktiv"],"RGB mode active":["RGB-Modus aktiv"],"Move the arrow left or right to change hue.":["Bewege den Pfeil nach rechts oder links zum \u00c4ndern des Farbtons."],"Hue value in degrees, from 0 to 359.":["Farbtonwert in Grad, von 0 bis 359."],"Alpha value, from 0 (transparent) to 1 (fully opaque).":["Alphawert von 0 (transparent) bis 1 (volle Deckkraft)."],"Color: %s":["Farbe: %s"],"Color code: %s":["Farbcode: %s"],"Custom color picker":["Individueller Farbw\u00e4hler"],"No results.":["Keine Ergebnisse."],"%d result found, use up and down arrow keys to navigate.":["%d Ergebnis gefunden, benutze die Pfeile nach oben oder unten zum Navigieren.","%d Ergebnisse gefunden, benutze die Pfeile nach oben oder unten zum Navigieren."],"Time":["Zeit"],"Day":["Tag"],"Month":["Monat"],"Date":["Datum"],"Hours":["\u00d6ffnungszeiten"],"Close dialog":["Dialog schlie\u00dfen"],"Year":["Jahr"],"Custom Size":["Individuelle Gr\u00f6\u00dfe"],"Drop files to upload":["Dateien f\u00fcr den Upload bereitstellen"],"Clear":["Leeren"],"PM":["PM"],"AM":["AM"],"Font Size":["Schriftgr\u00f6\u00dfe"],"December":["Dezember"],"November":["November"],"October":["Oktober"],"September":["September"],"August":["August"],"July":["Juli"],"June":["Juni"],"May":["Mai"],"April":["April"],"March":["M\u00e4rz"],"February":["Februar"],"January":["Januar"],"No results found.":["Es wurden keine Ergebnisse gefunden, die deinen Suchkriterien entsprechen."],"All":["Alle"],"Close":["Schlie\u00dfen"]}},"comment":{"reference":"wp-includes\/js\/dist\/components.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Error loading block: %s":["Fehler beim Laden des Blocks: %s"],"Number of items":["Anzahl Elemente"],"All":["Alle"],"Category":["Kategorie"],"Z \u2192 A":["Z → A"],"A \u2192 Z":["A → Z"],"Oldest to Newest":["Alt nach Neu"],"Newest to Oldest":["Neu nach Alt"],"Order by":["Reihenfolge von"],"Dismiss this notice":["Diesen Hinweis verwerfen"],"Remove item":["Element entfernen"],"Item removed.":["Element entfernt."],"Item added.":["Element hinzugef\u00fcgt."],"Separate with commas":["Mit Kommas trennen"],"Add item":["Element hinzuf\u00fcgen"],"%1$s (%2$s of %3$s)":["%1$s (%2$s of %3$s)"],"Custom font size":["Individuelle Schriftgr\u00f6\u00dfe"],"Font size: %s":["Schriftgr\u00f6\u00dfe: %s"],"Font Size":["Schriftgr\u00f6\u00dfe"],"font size name\u0004Custom":["Individuell"],"font size name\u0004Normal":["Normal"],"Reset":["Zur\u00fccksetzen"],"Calendar Help":["Kalender-Hilfe"],"Go to the first (home) or last (end) day of a week.":["Gehe zum ersten (Start) oder letzten (Ende) Tag der Woche."],"Home\/End":["Start\/Ende"],"Home and End":["Start und Ende"],"Move backward (PgUp) or forward (PgDn) by one month.":["Zur\u00fcck (Bild-auf) oder vorw\u00e4rts (Bild-ab) bewegen um einen Monat."],"PgUp\/PgDn":["Bild-auf\/Bild-ab"],"Page Up and Page Down":["Bild-auf und Bild-ab"],"Move backward (up) or forward (down) by one week.":["Zur\u00fcck (hoch) oder vorw\u00e4rts (runter) bewegen um eine Woche."],"Up and Down Arrows":["Pfeile hoch und runter"],"Move backward (left) or forward (right) by one day.":["Zur\u00fcck (links) oder vorw\u00e4rts (rechts) bewegen um einen Tag."],"Left and Right Arrows":["Pfeile links und rechts"],"Select the date in focus.":["Datum im Fokus ausw\u00e4hlen."],"keyboard button\u0004Enter":["Eingabetaste"],"Navigating with a keyboard":["Navigation mit einer Tastatur"],"Click the desired day to select it.":["Klicke den gew\u00fcnschten Tag an, um ihn auszuw\u00e4hlen."],"Click the right or left arrows to select other months in the past or the future.":["Klicke die Pfeile nach rechts oder links an, um Monate in der Vergangenheit oder der Zukunft auszuw\u00e4hlen."],"Click to Select":["Klicken zum Ausw\u00e4hlen"],"Minutes":["Minuten"],"Hours":["\u00d6ffnungszeiten"],"Color: %s":["Farbe: %s"],"Color code: %s":["Farbcode: %s"],"Custom color picker":["Individueller Farbw\u00e4hler"],"Use your arrow keys to change the base color. Move up to lighten the color, down to darken, left to increase saturation, and right to decrease saturation.":["Benutze deine Pfeiltasten, um die Basisfarbe zu \u00e4ndern. Hoch, um die Farbe aufzuhellen, runter zum Verdunkeln, links um die S\u00e4ttigung zu erh\u00f6hen, rechts um sie zu verringern."],"Choose a shade":["Farbton ausw\u00e4hlen"],"Change color format":["Farbformat wechseln"],"Color value in HSL":["HSL-Farbwert"],"Color value in RGB":["RGB-Farbwert"],"Color value in hexadecimal":["Hexadezimaler Farbwert"],"Hex color mode active":["Hex-Farbmodus aktiv"],"Hue\/saturation\/lightness mode active":["Farbton\/S\u00e4ttigung\/Helligkeit-Modus aktiv"],"RGB mode active":["RGB-Modus aktiv"],"Move the arrow left or right to change hue.":["Bewege den Pfeil nach rechts oder links zum \u00c4ndern des Farbtons."],"Hue value in degrees, from 0 to 359.":["Farbtonwert in Grad, von 0 bis 359."],"Alpha value, from 0 (transparent) to 1 (fully opaque).":["Alphawert von 0 (transparent) bis 1 (volle Deckkraft)."],"No results.":["Keine Ergebnisse."],"%d result found, use up and down arrow keys to navigate.":["%d Ergebnis gefunden, benutze die Pfeile nach oben oder unten zum Navigieren.","%d Ergebnisse gefunden, benutze die Pfeile nach oben oder unten zum Navigieren."],"Close dialog":["Dialog schlie\u00dfen"],"Time":["Zeit"],"Day":["Tag"],"Month":["Monat"],"Date":["Datum"],"PM":["PM"],"AM":["AM"],"December":["Dezember"],"November":["November"],"October":["Oktober"],"September":["September"],"August":["August"],"July":["Juli"],"June":["Juni"],"May":["Mai"],"April":["April"],"March":["M\u00e4rz"],"February":["Februar"],"January":["Januar"],"Year":["Jahr"],"Custom Size":["Individuelle Gr\u00f6\u00dfe"],"Drop files to upload":["Dateien f\u00fcr den Upload bereitstellen"],"(opens in a new tab)":["(\u00f6ffnet in neuem Tab)"],"Clear":["Leeren"],"Close":["Schlie\u00dfen"],"No results found.":["Es wurden keine Ergebnisse gefunden, die deinen Suchkriterien entsprechen."]}},"comment":{"reference":"wp-includes\/js\/dist\/components.js"}}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"translation-revision-date":"2019-09-05 12:55:55+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Backtick":["Backtick"],"Period":["Punkt"],"Comma":["Komma"]}},"comment":{"reference":"wp-includes\/js\/dist\/keycodes.js"}}
|
{"translation-revision-date":"2019-04-28 20:52:36+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"Backtick":["Backtick"],"Period":["Punkt"],"Comma":["Komma"]}},"comment":{"reference":"wp-includes\/js\/dist\/keycodes.js"}}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
wp-content/languages/plugins/akismet-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/akismet-de_DE.mo
Normal file
Binary file not shown.
900
wp-content/languages/plugins/akismet-de_DE.po
Normal file
900
wp-content/languages/plugins/akismet-de_DE.po
Normal file
@@ -0,0 +1,900 @@
|
|||||||
|
# Translation of Plugins - Akismet Anti-Spam - Stable (latest release) in German
|
||||||
|
# This file is distributed under the same license as the Plugins - Akismet Anti-Spam - Stable (latest release) package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2018-11-12 20:00:30+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Plugins - Akismet Anti-Spam - Stable (latest release)\n"
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:165
|
||||||
|
msgid "Stats response could not be decoded."
|
||||||
|
msgstr "Antwort mit Statistiken konnte nicht dekodiert werden."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:159
|
||||||
|
msgid "Currently unable to fetch stats. Please try again."
|
||||||
|
msgstr "Konnte Statistiken aktuell nicht abrufen. Bitte nochmal versuchen."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:134
|
||||||
|
msgid "API key must be set to fetch stats."
|
||||||
|
msgstr "API-Key muss konfiguriert sein, um die Statistiken abzurufen."
|
||||||
|
|
||||||
|
#: views/notice.php:138
|
||||||
|
msgid "To help your site with transparency under privacy laws like the GDPR, Akismet can display a notice to your users under your comment forms. This feature is disabled by default, however, you can turn it on below."
|
||||||
|
msgstr "Um deine Website mit Transparenz gemäß Datenschutzgesetzen wie der DSGVO zu unterstützen, kann Akismet deinen Benutzern unter den Kommentarfeldern eine Benachrichtigung anzeigen. Diese Funktion ist standardmäßig deaktiviert, du kannst sie jedoch unten aktivieren."
|
||||||
|
|
||||||
|
#: views/config.php:162
|
||||||
|
msgid "To help your site with transparency under privacy laws like the GDPR, Akismet can display a notice to your users under your comment forms. This feature is disabled by default, however, you can turn it on above."
|
||||||
|
msgstr "Um deine Website mit Transparenz gemäß Datenschutzgesetzen wie der DSGVO zu unterstützen, kann Akismet deinen Benutzern unter den Kommentarfeldern eine Benachrichtigung anzeigen. Diese Funktion ist standardmäßig deaktiviert, du kannst sie jedoch oben aktivieren."
|
||||||
|
|
||||||
|
#: views/notice.php:139
|
||||||
|
msgid " Please <a href=\"%s\">enable</a> or <a href=\"%s\">disable</a> this feature. <a href=\"%s\" id=\"akismet-privacy-notice-control-notice-info-link\" target=\"_blank\">More information</a>."
|
||||||
|
msgstr "Bitte<a href=\"%s\">aktiviere</a> oder <a href=\"%s\">deaktiviere</a> dieses Feature. <a href=\"%s\" id=\"akismet-privacy-notice-control-notice-info-link\" target=\"_blank\">Weitere Informationen</a>."
|
||||||
|
|
||||||
|
#: views/notice.php:137
|
||||||
|
msgid "Akismet & Privacy."
|
||||||
|
msgstr "Akismet & Datenschutz."
|
||||||
|
|
||||||
|
#: views/config.php:160
|
||||||
|
msgid "Do not display privacy notice."
|
||||||
|
msgstr "Datenschutz-Hinweis nicht anzeigen."
|
||||||
|
|
||||||
|
#: views/config.php:159
|
||||||
|
msgid "Display a privacy notice under your comment forms."
|
||||||
|
msgstr "Zeige einen Datenschutz-Hinweis unter den Kommentarformularen an."
|
||||||
|
|
||||||
|
#: views/config.php:158
|
||||||
|
msgid "Akismet privacy notice"
|
||||||
|
msgstr "Akismet Datenschutz-Hinweis"
|
||||||
|
|
||||||
|
#: views/config.php:155
|
||||||
|
msgid "Privacy"
|
||||||
|
msgstr "Datenschutz"
|
||||||
|
|
||||||
|
#: class.akismet.php:1423
|
||||||
|
msgid "This site uses Akismet to reduce spam. <a href=\"%s\" target=\"_blank\" rel=\"nofollow noopener\">Learn how your comment data is processed</a>."
|
||||||
|
msgstr "Diese Website verwendet Akismet, um Spam zu reduzieren. <a href=\"%s\" target=\"_blank\" rel=\"nofollow noopener\">Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden</a>."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:89
|
||||||
|
msgid "We collect information about visitors who comment on Sites that use our Akismet anti-spam service. The information we collect depends on how the User sets up Akismet for the Site, but typically includes the commenter's IP address, user agent, referrer, and Site URL (along with other information directly provided by the commenter such as their name, username, email address, and the comment itself)."
|
||||||
|
msgstr "Wir sammeln Informationen über Besucher, die Kommentare auf Websites, die unseren Akismet Anti-Spam Service benutzen, hinterlassen. Das Ausmaß an Informationen, die wir sammeln, hängt davon ab, wie der Benutzer seine Website eingestellt hat. Normalerweise beinhalten diese Daten die IP-Adresse des Benutzers, den User Agent, Referrer und Website-URL (sowie die Informationen, die der Benutzer direkt eingegeben hat wie z.B. Namen, Benutzernamen, E-Mail-Adresse und den Kommentar selbst)."
|
||||||
|
|
||||||
|
#: class.akismet.php:226
|
||||||
|
msgid "Comment discarded."
|
||||||
|
msgstr "Kommentar verworfen."
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:174
|
||||||
|
msgid "This site's API key is hardcoded and cannot be deleted."
|
||||||
|
msgstr "Der API-Schlüssel dieser Website ist im Quelltext festgeschrieben und kann nicht gelöscht werden."
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:158
|
||||||
|
msgid "The value provided is not a valid and registered API key."
|
||||||
|
msgstr "Der eingegebene Wert ist kein gültiger und registrierter API-Schlüssel."
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:152
|
||||||
|
msgid "This site's API key is hardcoded and cannot be changed via the API."
|
||||||
|
msgstr "Der API-Schlüssel dieser Website ist im Quelltext festgeschrieben und kann nicht über die API verändert werden."
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:71 class.akismet-rest-api.php:80
|
||||||
|
msgid "The time period for which to retrieve stats. Options: 60-days, 6-months, all"
|
||||||
|
msgstr "Der Zeitraum, für den Statistiken abgerufen werden. Optionen: 60 Tage, 6 Monate, alle"
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:56
|
||||||
|
msgid "If true, show the number of approved comments beside each comment author in the comments list page."
|
||||||
|
msgstr "Wenn wahr, zeige die Anzahl der genehmigten Kommentare neben jedem Kommentarautor in der Kommentarliste an."
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:51
|
||||||
|
msgid "If true, Akismet will automatically discard the worst spam automatically rather than putting it in the spam folder."
|
||||||
|
msgstr "Wenn wahr, wird Akismet automatisch den schlimmsten Spam automatisch aussortieren, anstatt ihn in den Spam-Ordner zu legen."
|
||||||
|
|
||||||
|
#: class.akismet-rest-api.php:27 class.akismet-rest-api.php:101
|
||||||
|
#: class.akismet-rest-api.php:114 class.akismet-rest-api.php:127
|
||||||
|
msgid "A 12-character Akismet API key. Available at akismet.com/get/"
|
||||||
|
msgstr "Ein 12-stelliger Akismet-API-Schlüssel. Erhältlich unter akismet.com/get/"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:398
|
||||||
|
msgid "(%1$s%)"
|
||||||
|
msgstr "(%1$s%)"
|
||||||
|
|
||||||
|
#: views/notice.php:49
|
||||||
|
msgid "Your site can’t connect to the Akismet servers."
|
||||||
|
msgstr "Deine Website konnte keine Verbindung zu den Akismet-Servern herstellen."
|
||||||
|
|
||||||
|
#: views/start.php:97
|
||||||
|
msgid "An Akismet API key has been defined in the %s file for this site."
|
||||||
|
msgstr "Ein Akismet-API-Schlüssel wurde in der Datei %s für diese Website definiert."
|
||||||
|
|
||||||
|
#: views/start.php:96
|
||||||
|
msgid "Manual Configuration"
|
||||||
|
msgstr "Manuelle Konfiguration"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:232
|
||||||
|
msgid "On this page, you are able to update your Akismet settings and view spam stats."
|
||||||
|
msgstr "Auf dieser Seite kannst du deine Akismet-Einstellungen aktualisieren und Spam-Statistiken betrachten."
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from spam</strong>. It keeps your site protected even while you sleep. To get started: activate the Akismet plugin and then go to your Akismet Settings page to set up your API key."
|
||||||
|
msgstr "Von Millionen genutzt, ist Akismet wahrscheinlich der beste Weg in der Welt, <strong>um deine Website oder deinen Blog vor Spam zu schützen</strong>. Es schützt deine Website auch während du schläfst. Um zu beginnen: Aktiviere das Akismet Plugin und gehe dann auf deine Akismet-Einstellungen Seite, um deinen API-Schlüssel einzurichten."
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
#: class.akismet-admin.php:114 class.akismet-admin.php:117
|
||||||
|
msgid "Akismet Anti-Spam"
|
||||||
|
msgstr "Akismet Anti-Spam"
|
||||||
|
|
||||||
|
#: views/stats.php:4
|
||||||
|
msgid "Akismet Settings"
|
||||||
|
msgstr "Akismet-Einstellungen"
|
||||||
|
|
||||||
|
#: views/start.php:90
|
||||||
|
msgid "Connect with API key"
|
||||||
|
msgstr "Mit API-Schlüssel verbinden"
|
||||||
|
|
||||||
|
#: views/start.php:84
|
||||||
|
msgid "(What is an API key?)"
|
||||||
|
msgstr "(Was ist ein API-Schlüssel?)"
|
||||||
|
|
||||||
|
#: views/start.php:83
|
||||||
|
msgid "Or enter an API key"
|
||||||
|
msgstr "Oder gib einen API-Schlüssel ein"
|
||||||
|
|
||||||
|
#: views/start.php:67
|
||||||
|
msgid "Or sign up with a different email address"
|
||||||
|
msgstr "Oder melde dich mit einer anderen E-Mail-Adresse an"
|
||||||
|
|
||||||
|
#: views/start.php:31 views/start.php:63
|
||||||
|
msgid "You are connected as %s."
|
||||||
|
msgstr "Du bist als %s verbunden."
|
||||||
|
|
||||||
|
#: views/start.php:28 views/start.php:60
|
||||||
|
msgid "Connect with Jetpack"
|
||||||
|
msgstr "Mit Jetpack verbinden"
|
||||||
|
|
||||||
|
#: views/start.php:22 views/start.php:55
|
||||||
|
msgid "Use your Jetpack connection to activate Akismet."
|
||||||
|
msgstr "Verwende deine Jetpack-Verbindung, um Akismet zu aktivieren."
|
||||||
|
|
||||||
|
#: views/start.php:21 views/start.php:35 views/start.php:54
|
||||||
|
msgid "Connect via Jetpack"
|
||||||
|
msgstr "Mit Jetpack verbinden"
|
||||||
|
|
||||||
|
#: views/start.php:14
|
||||||
|
msgid "Select one of the options below to get started."
|
||||||
|
msgstr "Wähle eine der folgenden Optionen aus, um zu beginnen."
|
||||||
|
|
||||||
|
#: views/start.php:13
|
||||||
|
msgid "Eliminate spam from your site"
|
||||||
|
msgstr "Beseitige Spam von deiner Website"
|
||||||
|
|
||||||
|
#: views/notice.php:101
|
||||||
|
msgid "Would you like to <a href=\"%s\">check pending comments</a>?"
|
||||||
|
msgstr "Möchtest du <a href=\"%s\">ausstehende Kommentare überprüfen</a>?"
|
||||||
|
|
||||||
|
#: views/notice.php:99
|
||||||
|
msgid "Akismet is now protecting your site from spam. Happy blogging!"
|
||||||
|
msgstr "Akismet schützt deine Website ab sofort vor Spam. Fröhliches Bloggen!"
|
||||||
|
|
||||||
|
#: views/notice.php:8
|
||||||
|
msgid "Set up your Akismet account"
|
||||||
|
msgstr "Eröffne dein Akismet-Konto"
|
||||||
|
|
||||||
|
#: views/config.php:26
|
||||||
|
msgid "Detailed Stats"
|
||||||
|
msgstr "Detaillierte Statistiken"
|
||||||
|
|
||||||
|
#: views/config.php:22
|
||||||
|
msgid "Statistics"
|
||||||
|
msgstr "Statistiken"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:1170
|
||||||
|
msgid "Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from spam</strong>. It keeps your site protected even while you sleep. To get started, just go to <a href=\"admin.php?page=akismet-key-config\">your Akismet Settings page</a> to set up your API key."
|
||||||
|
msgstr "Von Millionen genutzt, ist Akismet wahrscheinlich der beste Weg in der Welt, <strong>um deine Website oder deinen Blog vor Spam zu schützen</strong>. Es schützt deine Website auch während du schläfst. Um zu beginnen: Aktiviere das Akismet Plugin und gehe dann auf <a href=\"admin.php?page=akismet-key-config\">deine Akismet-Einstellungen</a> Seite, um deinen API-Schlüssel einzurichten."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:1167
|
||||||
|
msgid "Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from spam</strong>. Your site is fully configured and being protected, even while you sleep."
|
||||||
|
msgstr "Von Millionen genutzt, ist Akismet wahrscheinlich der beste Weg in der Welt, <strong>um deine Website oder deinen Blog vor Spam zu schützen</strong>. Deine Website ist vollständig konfiguriert und geschützt, auch während du schläfst."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:1058
|
||||||
|
msgid "%s comment was caught as spam."
|
||||||
|
msgid_plural "%s comments were caught as spam."
|
||||||
|
msgstr[0] "%s Kommentar wurde als Spam erkannt."
|
||||||
|
msgstr[1] "%s Kommentare wurden als Spam erkannt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:1055
|
||||||
|
msgid "No comments were caught as spam."
|
||||||
|
msgstr "Es wurden keine Kommentare als Spam erkannt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:1051
|
||||||
|
msgid "Akismet checked %s comment."
|
||||||
|
msgid_plural "Akismet checked %s comments."
|
||||||
|
msgstr[0] "Akismet überprüfte %s Kommentar."
|
||||||
|
msgstr[1] "Akismet überprüfte %s Kommentare."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:1048
|
||||||
|
msgid "There were no comments to check. Akismet will only check comments in the Pending queue."
|
||||||
|
msgstr "Es gab keine Kommentare zu überprüfen. Akismet überprüft ausschließlich Kommentare, die sich in der Warteschlange befinden."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:397
|
||||||
|
msgid "Checking for Spam"
|
||||||
|
msgstr "Auf Spam prüfen"
|
||||||
|
|
||||||
|
#: class.akismet.php:507
|
||||||
|
msgid "Comment not found."
|
||||||
|
msgstr "Kommentar nicht gefunden."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:88
|
||||||
|
msgid "%d comment could not be checked."
|
||||||
|
msgid_plural "%d comments could not be checked."
|
||||||
|
msgstr[0] "%d Kommentar konnte nicht überprüft werden."
|
||||||
|
msgstr[1] "%d Kommentare konnten nicht überprüft werden."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:85
|
||||||
|
msgid "%d comment moved to Spam."
|
||||||
|
msgid_plural "%d comments moved to Spam."
|
||||||
|
msgstr[0] "%d Kommentar in Spam verschoben."
|
||||||
|
msgstr[1] "%d Kommentare in Spam verschoben."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:84
|
||||||
|
msgid "Processed %d comment."
|
||||||
|
msgid_plural "Processed %d comments."
|
||||||
|
msgstr[0] "%d Kommentar bearbeitet."
|
||||||
|
msgstr[1] "%d Kommentare bearbeitet."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:46
|
||||||
|
msgid "Comment #%d could not be checked."
|
||||||
|
msgstr "Kommentar #%d konnte nicht überprüft werden."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:43
|
||||||
|
msgid "Failed to connect to Akismet."
|
||||||
|
msgstr "Verbindung zu Akismet fehlgeschlagen."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:39
|
||||||
|
msgid "Comment #%d is not spam."
|
||||||
|
msgstr "Kommentar #%d ist kein Spam."
|
||||||
|
|
||||||
|
#: class.akismet-cli.php:36
|
||||||
|
msgid "Comment #%d is spam."
|
||||||
|
msgstr "Kommentar #%d ist Spam."
|
||||||
|
|
||||||
|
#: views/config.php:49
|
||||||
|
msgid "%s false positive"
|
||||||
|
msgid_plural "%s false positives"
|
||||||
|
msgstr[0] "%s falsches Positiv"
|
||||||
|
msgstr[1] "%s falsche Positive"
|
||||||
|
|
||||||
|
#: views/config.php:47
|
||||||
|
msgid "%s missed spam"
|
||||||
|
msgid_plural "%s missed spam"
|
||||||
|
msgstr[0] "%s verpasster Spam"
|
||||||
|
msgstr[1] "%s verpasste Spam"
|
||||||
|
|
||||||
|
#: views/start.php:79
|
||||||
|
msgid "Log in or sign up now."
|
||||||
|
msgstr "Anmelden oder jetzt registrieren."
|
||||||
|
|
||||||
|
#: views/start.php:84
|
||||||
|
msgid "Already have your key? Enter it here."
|
||||||
|
msgstr "Du hast bereits einen Schlüssel? Gib ihn hier ein."
|
||||||
|
|
||||||
|
#: views/start.php:69
|
||||||
|
msgid "Sign up with a different email address"
|
||||||
|
msgstr "Registriere dich mit einer anderen E-Mail-Adresse"
|
||||||
|
|
||||||
|
#: views/start.php:71
|
||||||
|
msgid "Choose this option to use Akismet independently of your Jetpack connection."
|
||||||
|
msgstr "Wähle diese Option aus, um Akismet unabhängig von deiner Jetpack-Verbindung zu verwenden."
|
||||||
|
|
||||||
|
#: views/notice.php:79
|
||||||
|
msgid "You don’t have an Akismet plan."
|
||||||
|
msgstr "Da hast kein Akismet Tarif-Paket."
|
||||||
|
|
||||||
|
#: views/notice.php:64
|
||||||
|
msgid "Your Akismet subscription is suspended."
|
||||||
|
msgstr "Dein Akismet-Abonnement wurde unterbrochen."
|
||||||
|
|
||||||
|
#: views/notice.php:59
|
||||||
|
msgid "Your Akismet plan has been cancelled."
|
||||||
|
msgstr "Dein Akismet-Tarif wurde beendet."
|
||||||
|
|
||||||
|
#: views/notice.php:55
|
||||||
|
msgid "We cannot process your payment. Please <a href=\"%s\" target=\"_blank\">update your payment details</a>."
|
||||||
|
msgstr "Wir konnten deine Bezahlung nicht ausführen. Bitte <a href=\"%s\" target=\"_blank\">aktualisiere deine Angaben zur Bezahlung</a>."
|
||||||
|
|
||||||
|
#: views/notice.php:54
|
||||||
|
msgid "Please update your payment information."
|
||||||
|
msgstr "Bitte aktualisiere deine Zahlungsinformationen."
|
||||||
|
|
||||||
|
#: views/notice.php:11
|
||||||
|
msgid "<strong>Almost done</strong> - configure Akismet and say goodbye to spam"
|
||||||
|
msgstr "<strong>Fast fertig</strong> - konfiguriere Akismet und verabschiede dich von Spam."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:979
|
||||||
|
msgid "Akismet has saved you %d minute!"
|
||||||
|
msgid_plural "Akismet has saved you %d minutes!"
|
||||||
|
msgstr[0] "Akismet hat dir %d Minute erspart!"
|
||||||
|
msgstr[1] "Akismet hat dir %d Minuten erspart!"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:977
|
||||||
|
msgid "Akismet has saved you %d hour!"
|
||||||
|
msgid_plural "Akismet has saved you %d hours!"
|
||||||
|
msgstr[0] "Akismet hat dir %d Stunde erspart!"
|
||||||
|
msgstr[1] "Akismet hat dir %d Stunden erspart!"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:975
|
||||||
|
msgid "Akismet has saved you %s day!"
|
||||||
|
msgid_plural "Akismet has saved you %s days!"
|
||||||
|
msgstr[0] "Akismet hat dir %s Tag erspart!"
|
||||||
|
msgstr[1] "Akismet hat dir %s Tage erspart!"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:180 class.akismet-admin.php:218
|
||||||
|
#: class.akismet-admin.php:231
|
||||||
|
msgid "Akismet filters out spam, so you can focus on more important things."
|
||||||
|
msgstr "Akismet filtert Spam heraus, sodass du dich auf wichtigere Dinge konzentrieren kannst."
|
||||||
|
|
||||||
|
#: views/notice.php:129
|
||||||
|
msgid "To continue your service, <a href=\"%s\" target=\"_blank\">upgrade to an Enterprise subscription</a>, which covers an unlimited number of sites."
|
||||||
|
msgstr "Um deine Aktion fortzusetzen, <a href=\"%s\" target=\"_blank\"> Upgrade auf ein Enterprise Abonnement</a>, womit eine beliebige Anzahl an Websites abgedeckt werden kann."
|
||||||
|
|
||||||
|
#: views/notice.php:122
|
||||||
|
msgid "Your Pro subscription allows the use of Akismet on only one site. Please <a href=\"%s\" target=\"_blank\">purchase additional Pro subscriptions</a> or upgrade to an Enterprise subscription that allows the use of Akismet on unlimited sites."
|
||||||
|
msgstr "Dein Pro-Abonnement erlaubt die Benutzung von Akismet nur für eine Website. Bitte <a href=\"%s\" target=\"_blank\">erwerbe weitere Pro-Abonnements</a> oder mache ein Upgrade auf ein Enterprise-Abonnement, das dir erlaubt Akismet auf beliebig vielen Websites zu benutzen."
|
||||||
|
|
||||||
|
#: views/notice.php:115
|
||||||
|
msgid "The connection to akismet.com could not be established. Please refer to <a href=\"%s\" target=\"_blank\">our guide about firewalls</a> and check your server configuration."
|
||||||
|
msgstr "Die Verbindung zu akismet.com konnte nicht eingerichtet werden. Schau dir <a href=\"%s\" target=\"_blank\">unser Handbuch zu Firefalls</a> an und prüfe deine Server-Konfiguration."
|
||||||
|
|
||||||
|
#: views/notice.php:114
|
||||||
|
msgid "The API key you entered could not be verified."
|
||||||
|
msgstr "Der eingegebene API-Schlüssel konnte nicht verifiziert werden."
|
||||||
|
|
||||||
|
#: views/notice.php:110
|
||||||
|
msgid "Your API key is no longer valid. Please enter a new key or contact support@akismet.com."
|
||||||
|
msgstr "Dein API-Schlüssel ist nicht mehr gültig. Bitte gib einen neuen Schlüssel ein oder kontaktiere support@akismet.com."
|
||||||
|
|
||||||
|
#: views/notice.php:83 views/notice.php:124 views/notice.php:131
|
||||||
|
msgid "Please <a href=\"%s\" target=\"_blank\">contact our support team</a> with any questions."
|
||||||
|
msgstr "Bitte <a href=\"%s\" target=\"_blank\">kontaktiere unser Support-Team</a> bei offenen Fragen."
|
||||||
|
|
||||||
|
#: views/notice.php:81
|
||||||
|
msgid "In 2012, Akismet began using subscription plans for all accounts (even free ones). A plan has not been assigned to your account, and we’d appreciate it if you’d <a href=\"%s\" target=\"_blank\">sign into your account</a> and choose one."
|
||||||
|
msgstr "Im Jahr 2012 begann Akismet Abonnement-Tarife für alle Konten (sogar die kostenlosen) einzuführen. Bisher wurde deinem Konto kein Tarif zugeordnet und wir würden es begrüßen, wenn du dich <a href=\"%s\" target=\"_blank\">bei deinem Konto anmelden</a> und einen Tarif wählen würdest."
|
||||||
|
|
||||||
|
#: views/config.php:95
|
||||||
|
msgid "All systems functional."
|
||||||
|
msgstr "Alle Systeme laufen ordnungsgemäß."
|
||||||
|
|
||||||
|
#: views/config.php:95
|
||||||
|
msgid "Enabled."
|
||||||
|
msgstr "Aktiviert."
|
||||||
|
|
||||||
|
#: views/config.php:92
|
||||||
|
msgid "Akismet encountered a problem with a previous SSL request and disabled it temporarily. It will begin using SSL for requests again shortly."
|
||||||
|
msgstr "Akismet hatte ein Probelm mit einer kürzlich erfolgten SSL-Anfrage und hat dies temporär deaktiviert. Akismet wird in Kürze wieder SSL-Anfragen nutzen."
|
||||||
|
|
||||||
|
#: views/config.php:92
|
||||||
|
msgid "Temporarily disabled."
|
||||||
|
msgstr "Temporär deaktiviert."
|
||||||
|
|
||||||
|
#: views/config.php:86
|
||||||
|
msgid "Your Web server cannot make SSL requests; contact your Web host and ask them to add support for SSL requests."
|
||||||
|
msgstr "Dein Webserver kann keine SSL-Anfragen herstellen. Kontaktiere deinen Web-Hoster und bitte ihn, Unterstützung für SSL-Anfragen hinzuzufügen."
|
||||||
|
|
||||||
|
#: views/config.php:86
|
||||||
|
msgid "Disabled."
|
||||||
|
msgstr "Deaktiviert."
|
||||||
|
|
||||||
|
#: views/config.php:79
|
||||||
|
msgid "SSL Status"
|
||||||
|
msgstr "SSL-Status"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:608
|
||||||
|
msgid "This comment was reported as not spam."
|
||||||
|
msgstr "Dieser Kommentar wurde als Kein-Spam bewertet."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:600
|
||||||
|
msgid "This comment was reported as spam."
|
||||||
|
msgstr "Dieser Kommentar wurde als Spam bewertet."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:149
|
||||||
|
msgid "(undo)"
|
||||||
|
msgstr "(rückgängig)"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:148
|
||||||
|
msgid "URL removed"
|
||||||
|
msgstr "URL entfernt"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:147
|
||||||
|
msgid "Removing..."
|
||||||
|
msgstr "Entferne …"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:88 class.akismet-admin.php:1189
|
||||||
|
msgid "Akismet"
|
||||||
|
msgstr "Akismet"
|
||||||
|
|
||||||
|
#: views/config.php:60 class.akismet-admin.php:107 class.akismet-admin.php:239
|
||||||
|
#: class.akismet-admin.php:658
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:150
|
||||||
|
msgid "Re-adding..."
|
||||||
|
msgstr "Wieder-Einfügen …"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:177 class.akismet-admin.php:215
|
||||||
|
#: class.akismet-admin.php:228
|
||||||
|
msgid "Overview"
|
||||||
|
msgstr "Überblick"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:179 class.akismet-admin.php:190
|
||||||
|
#: class.akismet-admin.php:201
|
||||||
|
msgid "Akismet Setup"
|
||||||
|
msgstr "Akismet-Einstellungen"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:181
|
||||||
|
msgid "On this page, you are able to set up the Akismet plugin."
|
||||||
|
msgstr "Auf dieser Seite kannst du das Akismet-Plugin konfigurieren."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:188
|
||||||
|
msgid "New to Akismet"
|
||||||
|
msgstr "Neu bei Akismet"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:191
|
||||||
|
msgid "You need to enter an API key to activate the Akismet service on your site."
|
||||||
|
msgstr "Du musst einen API-Schlüssel eingeben, um Akismet auf deiner Website zu aktivieren."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:199
|
||||||
|
msgid "Enter an API Key"
|
||||||
|
msgstr "Gib einen API-Schlüssel ein"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:192
|
||||||
|
msgid "Sign up for an account on %s to get an API Key."
|
||||||
|
msgstr "Registriere dich auf %s, um einen API-Schlüssel zu erhalten."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:202
|
||||||
|
msgid "If you already have an API key"
|
||||||
|
msgstr "Wenn du bereits einen API-Schlüssel hast"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:204
|
||||||
|
msgid "Copy and paste the API key into the text field."
|
||||||
|
msgstr "Kopiere den API-Schlüssel und füge ihn in das Text-Feld ein."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:205
|
||||||
|
msgid "Click the Use this Key button."
|
||||||
|
msgstr "Drücke die Schaltfläche „Nutze diesen Schlüssel“."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:217
|
||||||
|
msgid "Akismet Stats"
|
||||||
|
msgstr "Akismet-Statistiken"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:219
|
||||||
|
msgid "On this page, you are able to view stats on spam filtered on your site."
|
||||||
|
msgstr "Auf dieser Seite kannst du den Statistiken entnehmen, wie viel Spam auf deiner Website ausgefiltert wurde."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:230 class.akismet-admin.php:241
|
||||||
|
#: class.akismet-admin.php:254
|
||||||
|
msgid "Akismet Configuration"
|
||||||
|
msgstr "Akismet-Konfiguration"
|
||||||
|
|
||||||
|
#: views/config.php:70 class.akismet-admin.php:242
|
||||||
|
msgid "API Key"
|
||||||
|
msgstr "API-Schlüssel"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:242
|
||||||
|
msgid "Enter/remove an API key."
|
||||||
|
msgstr "API-Schlüssel hinzufügen/entfernen."
|
||||||
|
|
||||||
|
#: views/config.php:105 class.akismet-admin.php:243
|
||||||
|
msgid "Comments"
|
||||||
|
msgstr "Kommentare"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:243
|
||||||
|
msgid "Show the number of approved comments beside each comment author in the comments list page."
|
||||||
|
msgstr "Zeige auf der Seite mit den Kommentar-Listen neben jedem Kommentar-Autor die Anzahl der zugelassenen Kommentare."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:244
|
||||||
|
msgid "Choose to either discard the worst spam automatically or to always put all spam in spam folder."
|
||||||
|
msgstr "Wähle aus, ob der schlimmste Spam automatisch gelöscht wird oder immer in den Spam-Ordner kommen soll."
|
||||||
|
|
||||||
|
#: views/config.php:128 class.akismet-admin.php:244
|
||||||
|
msgid "Strictness"
|
||||||
|
msgstr "Genauigkeit"
|
||||||
|
|
||||||
|
#: views/config.php:188 class.akismet-admin.php:252
|
||||||
|
msgid "Account"
|
||||||
|
msgstr "Konto"
|
||||||
|
|
||||||
|
#: views/config.php:196 class.akismet-admin.php:255
|
||||||
|
msgid "Subscription Type"
|
||||||
|
msgstr "Abonnement-Art"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:256
|
||||||
|
msgid "The subscription status - active, cancelled or suspended"
|
||||||
|
msgstr "Der Abonnement-Status – aktiv, abgelaufen oder unterbrochen"
|
||||||
|
|
||||||
|
#: views/config.php:203 class.akismet-admin.php:256
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Status"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:255
|
||||||
|
msgid "The Akismet subscription plan"
|
||||||
|
msgstr "Das Akismet-Abonnement"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:266
|
||||||
|
msgid "Akismet FAQ"
|
||||||
|
msgstr "Akismet FAQ"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:265
|
||||||
|
msgid "For more information:"
|
||||||
|
msgstr "Weitere Informationen:"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:267
|
||||||
|
msgid "Akismet Support"
|
||||||
|
msgstr "Akismet Support"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:273
|
||||||
|
msgid "Cheatin’ uh?"
|
||||||
|
msgstr "Nicht mogeln!"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:343
|
||||||
|
msgctxt "comments"
|
||||||
|
msgid "Spam"
|
||||||
|
msgstr "Spam"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:345
|
||||||
|
msgid "<a href=\"%1$s\">Akismet</a> has protected your site from <a href=\"%2$s\">%3$s spam comment</a>."
|
||||||
|
msgid_plural "<a href=\"%1$s\">Akismet</a> has protected your site from <a href=\"%2$s\">%3$s spam comments</a>."
|
||||||
|
msgstr[0] "<a href=\"%1$s\">Akismet</a> hat deine Website vor <a href=\"%2$s\">%3$s Spam-Kommentar</a> geschützt."
|
||||||
|
msgstr[1] "<a href=\"%1$s\">Akismet</a> hat deine Website vor <a href=\"%2$s\">%3$s Spam-Kommentaren</a> geschützt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:355
|
||||||
|
msgid "<a href=\"%1$s\">Akismet</a> has protected your site from %2$s spam comment already. "
|
||||||
|
msgid_plural "<a href=\"%1$s\">Akismet</a> has protected your site from %2$s spam comments already. "
|
||||||
|
msgstr[0] "<a href=\"%1$s\">Akismet</a> hat deine Website bereits vor %2$s Spam-Kommentar geschützt."
|
||||||
|
msgstr[1] "<a href=\"%1$s\">Akismet</a> hat deine Website bereits vor %2$s Spam-Kommentaren geschützt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:361
|
||||||
|
msgid "<a href=\"%s\">Akismet</a> blocks spam from getting to your blog. "
|
||||||
|
msgstr "<a href=\"%s\">Akismet</a> sorgt dafür, dass kein Spam in deinen Blog gelangt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:367
|
||||||
|
msgid "There’s <a href=\"%2$s\">%1$s comment</a> in your spam queue right now."
|
||||||
|
msgid_plural "There are <a href=\"%2$s\">%1$s comments</a> in your spam queue right now."
|
||||||
|
msgstr[0] "In deiner Spam-Warteliste gibt es gerade <a href=\"%2$s\">%1$s Kommentar</a>."
|
||||||
|
msgstr[1] "In deiner Spam-Warteliste gibt es gerade <a href=\"%2$s\">%1$s Kommentare</a>."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:373
|
||||||
|
msgid "There’s nothing in your <a href='%s'>spam queue</a> at the moment."
|
||||||
|
msgstr "Es gibt im Moment keinen Eintrag in deiner <a href='%s'>Spam-Liste</a>."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:587
|
||||||
|
msgid "Akismet re-checked and cleared this comment."
|
||||||
|
msgstr "Akismet hat erneut überprüft und diesen Kommentar bereinigt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:581
|
||||||
|
msgid "Akismet re-checked and caught this comment as spam."
|
||||||
|
msgstr "Akismet hat den Kommentar erneut überprüft und nun als Spam bewertet."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:402
|
||||||
|
msgid "Check for Spam"
|
||||||
|
msgstr "Auf Spam prüfen"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:624
|
||||||
|
msgid "Akismet was unable to recheck this comment (response: %s)."
|
||||||
|
msgstr "Akismet konnte diesen Kommentar (Antwort: %s) nicht nochmal überprüfen."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:509
|
||||||
|
msgid "Flagged as spam by Akismet"
|
||||||
|
msgstr "Als Spam markiert durch Akismet"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:505
|
||||||
|
msgid "Awaiting spam check"
|
||||||
|
msgstr "Warten auf Spam-Prüfung"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:515
|
||||||
|
msgid "Flagged as spam by %s"
|
||||||
|
msgstr "Als Spam markiert von %s"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:511
|
||||||
|
msgid "Cleared by Akismet"
|
||||||
|
msgstr "Bereinigt durch Akismet"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:517
|
||||||
|
msgid "Un-spammed by %s"
|
||||||
|
msgstr "Als Kein-Spam markiert von %s"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:552
|
||||||
|
msgid "%s approved"
|
||||||
|
msgid_plural "%s approved"
|
||||||
|
msgstr[0] "%s Genehmigt"
|
||||||
|
msgstr[1] "%s Genehmigte"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:529
|
||||||
|
msgid "History"
|
||||||
|
msgstr "Verlauf"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:529 class.akismet-admin.php:537
|
||||||
|
msgid "View comment history"
|
||||||
|
msgstr "Kommentar-Verlauf ansehen"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:865
|
||||||
|
msgid "Please check your <a href=\"%s\">Akismet configuration</a> and contact your web host if problems persist."
|
||||||
|
msgstr "Bitte überprüfe deine <a href=\"%s\">Akismet-Konfiguration</a> und kontaktiere deinen Webhoster, wenn die Probleme bestehen bleiben."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:646
|
||||||
|
msgid "%s ago"
|
||||||
|
msgstr "vor %s"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:972
|
||||||
|
msgid "Cleaning up spam takes time."
|
||||||
|
msgstr "Spam aussortieren braucht Zeit."
|
||||||
|
|
||||||
|
#: class.akismet-widget.php:12
|
||||||
|
msgid "Akismet Widget"
|
||||||
|
msgstr "Akismet-Widget"
|
||||||
|
|
||||||
|
#: class.akismet-widget.php:13
|
||||||
|
msgid "Display the number of spam comments Akismet has caught"
|
||||||
|
msgstr "Zeige die Anzahl der Spam-Kommentare, die Akismet blockiert hat."
|
||||||
|
|
||||||
|
#: class.akismet-widget.php:74
|
||||||
|
msgid "Title:"
|
||||||
|
msgstr "Titel:"
|
||||||
|
|
||||||
|
#: class.akismet-widget.php:69 class.akismet-widget.php:90
|
||||||
|
msgid "Spam Blocked"
|
||||||
|
msgstr "Spam wurde blockiert"
|
||||||
|
|
||||||
|
#: class.akismet-widget.php:102
|
||||||
|
msgid "<strong class=\"count\">%1$s spam</strong> blocked by <strong>Akismet</strong>"
|
||||||
|
msgid_plural "<strong class=\"count\">%1$s spam</strong> blocked by <strong>Akismet</strong>"
|
||||||
|
msgstr[0] "<strong class=\"count\">%1$s Spam</strong> von <strong>Akismet</strong> blockiert."
|
||||||
|
msgstr[1] "<strong class=\"count\">%1$s Spam</strong> von <strong>Akismet</strong> blockiert."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:584
|
||||||
|
msgid "Akismet caught this comment as spam."
|
||||||
|
msgstr "Akismet hat den Kommentar als Spam bewertet."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:632
|
||||||
|
msgid "Comment status was changed to %s"
|
||||||
|
msgstr "Kommentar-Status wurde geändert auf %s"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:590
|
||||||
|
msgid "Akismet cleared this comment."
|
||||||
|
msgstr "Akismet hat diesen Kommentar bereinigt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:593
|
||||||
|
msgid "Comment was caught by wp_blacklist_check."
|
||||||
|
msgstr "Kommentar wurde durch wp_blacklist_check abgefangen."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:619
|
||||||
|
msgid "Akismet was unable to check this comment (response: %s) but will automatically retry later."
|
||||||
|
msgstr "Akismet konnte diesen Kommentar (Antwort: %s) nicht überprüfen, wird dies aber später automatisch nochmal versuchen."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:638
|
||||||
|
msgid "%1$s changed the comment status to %2$s."
|
||||||
|
msgstr "%1$s hat den Kommentar-Status auf „%2$s“ geändert."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:597
|
||||||
|
msgid "%s reported this comment as spam."
|
||||||
|
msgstr "%s haben diesen Kommentar als Spam bewertet."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:605
|
||||||
|
msgid "%s reported this comment as not spam."
|
||||||
|
msgstr "%s haben diesen Kommentar als Kein-Spam bewertet."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:612
|
||||||
|
msgid "Akismet caught this comment as spam during an automatic retry."
|
||||||
|
msgstr "Akismet hat diesen Kommentar durch eine erneute Überprüfung als Spam erkannt."
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:615
|
||||||
|
msgid "Akismet cleared this comment during an automatic retry."
|
||||||
|
msgstr "Akismet hat diesen Kommentar durch eine erneute Überprüfung als frei von Spam erkannt. "
|
||||||
|
|
||||||
|
#: class.akismet.php:1268
|
||||||
|
msgid "Please <a href=\"%1$s\">upgrade WordPress</a> to a current version, or <a href=\"%2$s\">downgrade to version 2.4 of the Akismet plugin</a>."
|
||||||
|
msgstr "Bitte <a href=\"%1$s\">aktualisiere WordPress</a> auf eine aktuelle Version oder führe ein <a href=\"%2$s\">Downgrade auf Version 2.4 des Akismet-Plugins</a> durch."
|
||||||
|
|
||||||
|
#: class.akismet.php:1268
|
||||||
|
msgid "Akismet %s requires WordPress %s or higher."
|
||||||
|
msgstr "Akismet %s benötigt WordPress %s oder höher."
|
||||||
|
|
||||||
|
#: views/config.php:37 views/config.php:42
|
||||||
|
msgid "Spam blocked"
|
||||||
|
msgid_plural "Spam blocked"
|
||||||
|
msgstr[0] "Spam abgewehrt"
|
||||||
|
msgstr[1] ""
|
||||||
|
|
||||||
|
#: views/config.php:35
|
||||||
|
msgid "Past six months"
|
||||||
|
msgstr "Letzte sechs Monate"
|
||||||
|
|
||||||
|
#: views/config.php:40
|
||||||
|
msgid "All time"
|
||||||
|
msgstr "Gesamte Zeit"
|
||||||
|
|
||||||
|
#: views/config.php:45
|
||||||
|
msgid "Accuracy"
|
||||||
|
msgstr "Genauigkeit"
|
||||||
|
|
||||||
|
#: views/config.php:109
|
||||||
|
msgid "Show approved comments"
|
||||||
|
msgstr "Genehmigte Kommentare anzeigen"
|
||||||
|
|
||||||
|
#: views/config.php:122
|
||||||
|
msgid "Show the number of approved comments beside each comment author"
|
||||||
|
msgstr "Zeige neben jedem Kommentar-Autor die Anzahl der genehmigten Kommentare."
|
||||||
|
|
||||||
|
#: views/config.php:131
|
||||||
|
msgid "Akismet anti-spam strictness"
|
||||||
|
msgstr "Akismet Anti-Spam-Genauigkeit"
|
||||||
|
|
||||||
|
#: views/config.php:132
|
||||||
|
msgid "Silently discard the worst and most pervasive spam so I never see it."
|
||||||
|
msgstr "Den ganzen Spam-Kram still und leise im Hintergrund entsorgen, damit ich diesen nie sehen muss."
|
||||||
|
|
||||||
|
#: views/config.php:133
|
||||||
|
msgid "Always put spam in the Spam folder for review."
|
||||||
|
msgstr "Spam immer in den Spam-Ordner zur Überprüfung ablegen."
|
||||||
|
|
||||||
|
#: views/config.php:141
|
||||||
|
msgid "Spam in the <a href=\"%1$s\">spam folder</a> older than 1 day is deleted automatically."
|
||||||
|
msgid_plural "Spam in the <a href=\"%1$s\">spam folder</a> older than %2$d days is deleted automatically."
|
||||||
|
msgstr[0] "Spam, der länger als 1 Tag im <a href=\"%1$s\">Spam-Ordner</a> war, wird automatisch gelöscht."
|
||||||
|
msgstr[1] "Spam, der länger als %2$d Tage im <a href=\"%1$s\">Spam-Ordner</a> war, wird automatisch gelöscht."
|
||||||
|
|
||||||
|
#: views/config.php:135
|
||||||
|
msgid "Note:"
|
||||||
|
msgstr "Hinweis: "
|
||||||
|
|
||||||
|
#: views/config.php:208
|
||||||
|
msgid "Cancelled"
|
||||||
|
msgstr "Abgelaufen"
|
||||||
|
|
||||||
|
#: views/config.php:176
|
||||||
|
msgid "Save Changes"
|
||||||
|
msgstr "Änderungen speichern"
|
||||||
|
|
||||||
|
#: views/config.php:170
|
||||||
|
msgid "Disconnect this account"
|
||||||
|
msgstr "Dieses Konto abkoppeln"
|
||||||
|
|
||||||
|
#: views/config.php:210
|
||||||
|
msgid "Suspended"
|
||||||
|
msgstr "Unterbrochen"
|
||||||
|
|
||||||
|
#: views/config.php:214
|
||||||
|
msgid "No Subscription Found"
|
||||||
|
msgstr "Kein Abonnement gefunden"
|
||||||
|
|
||||||
|
#: views/config.php:212
|
||||||
|
msgid "Missing"
|
||||||
|
msgstr "Fehlend"
|
||||||
|
|
||||||
|
#: views/config.php:222
|
||||||
|
msgid "Next Billing Date"
|
||||||
|
msgstr "Nächstes Rechnungs-Datum"
|
||||||
|
|
||||||
|
#: views/config.php:216
|
||||||
|
msgid "Active"
|
||||||
|
msgstr "Aktiv"
|
||||||
|
|
||||||
|
#: views/config.php:233
|
||||||
|
msgid "Upgrade"
|
||||||
|
msgstr "Aktualisierung"
|
||||||
|
|
||||||
|
#: views/config.php:233
|
||||||
|
msgid "Change"
|
||||||
|
msgstr "Ändern"
|
||||||
|
|
||||||
|
#: views/notice.php:17
|
||||||
|
msgid "Akismet has detected a problem."
|
||||||
|
msgstr "Akismet hat ein Problem festgestellt."
|
||||||
|
|
||||||
|
#: views/notice.php:18
|
||||||
|
msgid "Some comments have not yet been checked for spam by Akismet. They have been temporarily held for moderation and will automatically be rechecked later."
|
||||||
|
msgstr "Einige Kommentare wurden nicht durch Akismet auf Spam überprüft. Sie wurden temporär in die Moderation eingereiht und werden automatisch später nachgeprüft."
|
||||||
|
|
||||||
|
#: views/notice.php:25
|
||||||
|
msgid "Akismet Error Code: %s"
|
||||||
|
msgstr "Akismet Fehler-Code: %s"
|
||||||
|
|
||||||
|
#. translators: the placeholder is a clickable URL that leads to more
|
||||||
|
#. information regarding an error code.
|
||||||
|
#: views/notice.php:30
|
||||||
|
msgid "For more information: %s"
|
||||||
|
msgstr "Für weitere Informationen: %s"
|
||||||
|
|
||||||
|
#: views/notice.php:45
|
||||||
|
msgid "Your web host or server administrator has disabled PHP’s <code>gethostbynamel</code> function. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href=\"%s\" target=\"_blank\">this information about Akismet’s system requirements</a>."
|
||||||
|
msgstr "Dein Webhoster oder Server-Administrator hat die <code>gethostbynamel</code>-Funktionen von PHP deaktiviert. <strong>Akismet funktioniert nicht korrekt, solange dies nicht korrigiert wurde.</strong> Bitte kontaktiere deinen Webhoster oder Firewall-Administrator und gib ihm <a href=\"%s\" target=\"_blank\">diese Informationen über die Systemvoraussetzungen von Akismet</a>."
|
||||||
|
|
||||||
|
#: views/notice.php:44
|
||||||
|
msgid "Network functions are disabled."
|
||||||
|
msgstr "Netzwerkfunktionen sind deaktiviert."
|
||||||
|
|
||||||
|
#: views/notice.php:50
|
||||||
|
msgid "Your firewall may be blocking Akismet from connecting to its API. Please contact your host and refer to <a href=\"%s\" target=\"_blank\">our guide about firewalls</a>."
|
||||||
|
msgstr "Deine Firewall dürfte Akismet daran hindern, sich mit seiner API zu verbinden. Bitte wende dich an deinen Host und verweise auf <a href=\"%s\" target=\"_blank\">unseren Leitfaden über Firewalls</a>."
|
||||||
|
|
||||||
|
#: views/notice.php:60
|
||||||
|
msgid "Please visit your <a href=\"%s\" target=\"_blank\">Akismet account page</a> to reactivate your subscription."
|
||||||
|
msgstr "Bitte besuche die <a href=\"%s\" target=\"_blank\">Akismet-Konto-Seite</a>, um dein Abonnement wieder zu aktivieren."
|
||||||
|
|
||||||
|
#: views/notice.php:65 views/notice.php:75
|
||||||
|
msgid "Please contact <a href=\"%s\" target=\"_blank\">Akismet support</a> for assistance."
|
||||||
|
msgstr "Bitte kontaktiere den <a href=\"%s\" target=\"_blank\">Akismet Support</a>, um Unterstützung zu erhalten."
|
||||||
|
|
||||||
|
#: views/notice.php:70
|
||||||
|
msgid "You can help us fight spam and upgrade your account by <a href=\"%s\" target=\"_blank\">contributing a token amount</a>."
|
||||||
|
msgstr "Du kannst uns bei der Spam-Bekämpfung helfen und dein Konto upgraden mit einer <a href=\"%s\" target=\"_blank\">Spende eines symbolischen Betrags</a>."
|
||||||
|
|
||||||
|
#: views/notice.php:74
|
||||||
|
msgid "There is a problem with your API key."
|
||||||
|
msgstr "Es gibt ein Problem mit deinem API-Schlüssel."
|
||||||
|
|
||||||
|
#: views/notice.php:106
|
||||||
|
msgid "The key you entered is invalid. Please double-check it."
|
||||||
|
msgstr "Der Schlüssel, den du eingegeben hast, ist ungültig. Überprüfe ihn bitte nochmal."
|
||||||
|
|
||||||
|
#: views/notice.php:120
|
||||||
|
msgid "You’re using your Akismet key on more sites than your Pro subscription allows."
|
||||||
|
msgstr "Du benutzt deinen Akismet-Schlüssel auf mehr Websites, als es dein Pro-Abonnement erlaubt."
|
||||||
|
|
||||||
|
#: views/notice.php:127
|
||||||
|
msgid "You’re using Akismet on far too many sites for your Pro subscription."
|
||||||
|
msgstr "Du benutzt Akismet auf viel zu vielen Websites für dein Pro-Abonnement."
|
||||||
|
|
||||||
|
#: views/start.php:47
|
||||||
|
msgid "Connected via Jetpack"
|
||||||
|
msgstr "Mit Jetpack verbunden"
|
||||||
|
|
||||||
|
#: views/start.php:41
|
||||||
|
msgid "Reactivate Akismet"
|
||||||
|
msgstr "Reaktiviere Akismet"
|
||||||
|
|
||||||
|
#: views/start.php:43
|
||||||
|
msgid "Your subscription for %s is cancelled."
|
||||||
|
msgstr "Dein Abonnement für %s ist beendet."
|
||||||
|
|
||||||
|
#: views/start.php:48
|
||||||
|
msgid "Your subscription for %s is suspended."
|
||||||
|
msgstr "Dein Abonnement für %s wurde unterbrochen."
|
||||||
|
|
||||||
|
#: views/start.php:49
|
||||||
|
msgid "No worries! Get in touch and we’ll sort this out."
|
||||||
|
msgstr "Keine Sorge! Nimm einfach Kontakt auf, wir wissen wie wir dir helfen können."
|
||||||
|
|
||||||
|
#: views/start.php:50
|
||||||
|
msgid "Contact Akismet support"
|
||||||
|
msgstr "Kontaktiere den Akismet-Support"
|
||||||
|
|
||||||
|
#: views/start.php:75
|
||||||
|
msgid "Activate Akismet"
|
||||||
|
msgstr "Aktiviere Akismet"
|
||||||
|
|
||||||
|
#: views/start.php:77
|
||||||
|
msgid "Get your API key"
|
||||||
|
msgstr "Hol dir deinen API-Schlüssel"
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
msgid "https://akismet.com/"
|
||||||
|
msgstr "https://akismet.com/"
|
||||||
|
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "https://automattic.com/wordpress-plugins/"
|
||||||
|
msgstr "https://wordpress.org/plugins/akismet/"
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "Automattic"
|
||||||
|
msgstr "Automattic"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:146
|
||||||
|
msgid "Remove this URL"
|
||||||
|
msgstr "Entferne diese URL"
|
||||||
|
|
||||||
|
#: class.akismet-admin.php:84
|
||||||
|
msgid "Comment History"
|
||||||
|
msgstr "Kommentar-Verlauf"
|
||||||
BIN
wp-content/languages/plugins/antispam-bee-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/antispam-bee-de_DE.mo
Normal file
Binary file not shown.
438
wp-content/languages/plugins/antispam-bee-de_DE.po
Normal file
438
wp-content/languages/plugins/antispam-bee-de_DE.po
Normal file
@@ -0,0 +1,438 @@
|
|||||||
|
# Translation of Plugins - Antispam Bee - Stable (latest release) in German
|
||||||
|
# This file is distributed under the same license as the Plugins - Antispam Bee - Stable (latest release) package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-02-15 07:22:46+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Plugins - Antispam Bee - Stable (latest release)\n"
|
||||||
|
|
||||||
|
#: antispam_bee.php:1862
|
||||||
|
msgctxt "Word count type. Do not translate!"
|
||||||
|
msgid "words"
|
||||||
|
msgstr "words"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:540
|
||||||
|
msgid "https://wordpress.org/support/plugin/antispam-bee"
|
||||||
|
msgstr "https://wordpress.org/support/plugin/antispam-bee"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:537
|
||||||
|
msgid "https://github.com/pluginkollektiv/antispam-bee/wiki/"
|
||||||
|
msgstr "https://github.com/pluginkollektiv/antispam-bee/wiki/de-Home"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:477
|
||||||
|
msgid "Delete Antispam Bee data when uninstalling"
|
||||||
|
msgstr "Antispam Bee Daten bei Deinstallation löschen"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2523
|
||||||
|
msgid "Trackback"
|
||||||
|
msgstr "Trackback"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2523
|
||||||
|
msgid "Comment"
|
||||||
|
msgstr "Kommentar"
|
||||||
|
|
||||||
|
#: antispam_bee.php:437
|
||||||
|
msgid "Identical Post title and blog title"
|
||||||
|
msgstr "Identischer Beitrags- und Blog-Titel"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:478
|
||||||
|
msgid "If checked, you will delete all data Antispam Bee creates, when uninstalling the plugin."
|
||||||
|
msgstr "Wenn diese Option aktiviert ist, werden alle von Antispam Bee erstellten Daten bei der Deinstallation des Plugins gelöscht."
|
||||||
|
|
||||||
|
#: inc/gui.class.php:275
|
||||||
|
msgid "Block or allow comments from specific countries"
|
||||||
|
msgstr "Kommentare aus bestimmten Ländern blockieren oder zulassen"
|
||||||
|
|
||||||
|
#: antispam_bee.php:428
|
||||||
|
msgid "Honeypot"
|
||||||
|
msgstr "Honeypot"
|
||||||
|
|
||||||
|
#. translators: The number of spam comments Antispam Bee blocked so far.
|
||||||
|
#: antispam_bee.php:697
|
||||||
|
msgid "%d Blocked"
|
||||||
|
msgstr "%d blockiert"
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Antispam plugin with a sophisticated toolset for effective day to day comment and trackback spam-fighting. Built with data protection and privacy in mind."
|
||||||
|
msgstr "Antispam-Plugin mit einem hochentwickelten Tool-Set für effektive tägliche Kommentar- und Trackback-Spam-Bekämpfung. Entwickelt mit Blick auf Datenschutz und Privatsphäre."
|
||||||
|
|
||||||
|
#: inc/gui.class.php:564
|
||||||
|
msgid "Spanish"
|
||||||
|
msgstr "Spanisch"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:563
|
||||||
|
msgid "Italian"
|
||||||
|
msgstr "Italienisch"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:562
|
||||||
|
msgid "French"
|
||||||
|
msgstr "Französisch"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:561
|
||||||
|
msgid "English"
|
||||||
|
msgstr "Englisch"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:560
|
||||||
|
msgid "German"
|
||||||
|
msgstr "Deutsch"
|
||||||
|
|
||||||
|
#. translators: 1: opening <a> tag with link to documentation. 2: closing </a>
|
||||||
|
#. tag.
|
||||||
|
#: inc/gui.class.php:353
|
||||||
|
msgid "Detect and approve only the specified language. Please note the %1$sprivacy notice%2$s for this option."
|
||||||
|
msgstr "Kommentare nur in angegebener Sprache zulassen. Bitte beachte den %1$sDatenschutzhinweis%2$s für diese Option."
|
||||||
|
|
||||||
|
#: antispam_bee.php:432
|
||||||
|
msgid "Local DB Spam"
|
||||||
|
msgstr "Lokale Spam-DB"
|
||||||
|
|
||||||
|
#: antispam_bee.php:435
|
||||||
|
msgid "Comment Language"
|
||||||
|
msgstr "Kommentarsprache"
|
||||||
|
|
||||||
|
#: antispam_bee.php:431
|
||||||
|
msgid "Fake IP"
|
||||||
|
msgstr "Gefälschte IP"
|
||||||
|
|
||||||
|
#. translators: 1: opening <a> tag with link to documentation. 2: closing </a>
|
||||||
|
#. tag.
|
||||||
|
#: inc/gui.class.php:287
|
||||||
|
msgid "Filtering the requests depending on country. Please note the %1$sprivacy notice%2$s for this option."
|
||||||
|
msgstr "Kommentare nach Ursprungsländern filtern. Bitte beachte den %1$sDatenschutzhinweis%2$s für diese Option."
|
||||||
|
|
||||||
|
#: inc/gui.class.php:299
|
||||||
|
msgid "https://www.iso.org/iso/country_names_and_code_elements"
|
||||||
|
msgstr "https://www.iso.org/iso/country_names_and_code_elements"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:340
|
||||||
|
msgid "Allow comments only in certain language"
|
||||||
|
msgstr "Kommentare nur in einer bestimmten Sprache zulassen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:346
|
||||||
|
msgid "https://github.com/pluginkollektiv/antispam-bee/wiki/en-Documentation#allow-comments-only-in-certain-language"
|
||||||
|
msgstr "https://github.com/pluginkollektiv/antispam-bee/wiki/de-Dokumentation#kommentare-nur-in-einer-sprache-zulassen"
|
||||||
|
|
||||||
|
#. translators: 1: opening <a> tag with link to documentation. 2: closing </a>
|
||||||
|
#. tag
|
||||||
|
#: inc/gui.class.php:222
|
||||||
|
msgid "Check if commenter has a Gravatar image. Please note the %1$sprivacy notice%2$s for this option."
|
||||||
|
msgstr "Prüfung auf Nutzung eines Gravatar-Bildes. Bitte beachte den %1$sDatenschutzhinweis%2$s für diese Option."
|
||||||
|
|
||||||
|
#: inc/gui.class.php:374
|
||||||
|
msgid "Language"
|
||||||
|
msgstr "Sprache"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:252
|
||||||
|
msgid "Validation of the IP address used"
|
||||||
|
msgstr "Gültigkeitsprüfung der verwendeten IP-Adresse"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:402
|
||||||
|
msgid "Spam-Notification by email"
|
||||||
|
msgstr "Bei Spam per E-Mail benachrichtigen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:441
|
||||||
|
msgid "Comments"
|
||||||
|
msgstr "Kommentare"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:442
|
||||||
|
msgid "Pings"
|
||||||
|
msgstr "Pings"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:491
|
||||||
|
msgid "Various options"
|
||||||
|
msgstr "Verschiedene Optionen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:498
|
||||||
|
msgid "Generate statistics as a dashboard widget"
|
||||||
|
msgstr "Statistiken als Dashboard-Widget generieren"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:534
|
||||||
|
msgid "FAQ"
|
||||||
|
msgstr "FAQ"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:260
|
||||||
|
msgid "Predefined and custom patterns by plugin hook"
|
||||||
|
msgstr "Vordefinierte und eigene Muster via Plugin-Hook"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:537
|
||||||
|
msgid "Manual"
|
||||||
|
msgstr "Dokumentation"
|
||||||
|
|
||||||
|
#: antispam_bee.php:429
|
||||||
|
msgid "Comment time"
|
||||||
|
msgstr "Kommentarzeit"
|
||||||
|
|
||||||
|
#: antispam_bee.php:430
|
||||||
|
msgid "Empty Data"
|
||||||
|
msgstr "Unausgefüllte Felder"
|
||||||
|
|
||||||
|
#: antispam_bee.php:433
|
||||||
|
msgid "Country Check"
|
||||||
|
msgstr "Ländererkennung"
|
||||||
|
|
||||||
|
#: antispam_bee.php:434
|
||||||
|
msgid "BBCode"
|
||||||
|
msgstr "BBCode"
|
||||||
|
|
||||||
|
#: antispam_bee.php:436
|
||||||
|
msgid "Regular Expression"
|
||||||
|
msgstr "Regulärer Ausdruck"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:531 antispam_bee.php:557
|
||||||
|
msgid "Donate"
|
||||||
|
msgstr "Spenden"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:540 antispam_bee.php:558
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Support"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:281
|
||||||
|
msgid "https://github.com/pluginkollektiv/antispam-bee/wiki/en-Documentation#block-comments-from-specific-countries"
|
||||||
|
msgstr "https://github.com/pluginkollektiv/antispam-bee/wiki/de-Dokumentation#bestimmte-länder-blockieren-bzw-erlauben"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:216
|
||||||
|
msgid "https://github.com/pluginkollektiv/antispam-bee/wiki/en-Documentation#trust-commenters-with-a-gravatar"
|
||||||
|
msgstr "https://github.com/pluginkollektiv/antispam-bee/wiki/de-Dokumentation#kommentatoren-mit-gravatar-vertrauen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:202
|
||||||
|
msgid "No review of already commented users"
|
||||||
|
msgstr "Keine Prüfung bereits kommentierender Benutzer"
|
||||||
|
|
||||||
|
#. translators: 1: opening <a> tag with link to ISO codes reference. 2: closing
|
||||||
|
#. </a> tag.
|
||||||
|
#: inc/gui.class.php:326
|
||||||
|
msgid "Whitelist %1$sISO Codes%2$s for this option."
|
||||||
|
msgstr "%1$sISO-Codes%2$s, die immer erlaubt sind. (Whitelist)"
|
||||||
|
|
||||||
|
#. translators: 1: opening <a> tag with link to ISO codes reference. 2: closing
|
||||||
|
#. </a> tag.
|
||||||
|
#: inc/gui.class.php:311
|
||||||
|
msgid "Blacklist %1$sISO Codes%2$s for this option."
|
||||||
|
msgstr "%1$sISO-Codes%2$s, die nicht erlaubt sind. (Blacklist)"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:534
|
||||||
|
msgid "https://wordpress.org/plugins/antispam-bee/faq/"
|
||||||
|
msgstr "https://de.wordpress.org/plugins/antispam-bee/#faq"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:305 inc/gui.class.php:320
|
||||||
|
msgid "e.g. BF, SG, YE"
|
||||||
|
msgstr "z. B. BF, SG, YE"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:515
|
||||||
|
msgid "No spam check for link notifications"
|
||||||
|
msgstr "Keine Spam-Prüfung für Link-Benachrichtigungen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:268
|
||||||
|
msgid "Check for spam data on your own blog"
|
||||||
|
msgstr "Den Spam-Bestand des eigenen Blogs durchsuchen"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2538
|
||||||
|
msgid "Trash it"
|
||||||
|
msgstr "In den Papierkorb"
|
||||||
|
|
||||||
|
#: antispam_bee.php:533
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
|
#: antispam_bee.php:804
|
||||||
|
msgid "No data available."
|
||||||
|
msgstr "Noch keine Daten vorhanden."
|
||||||
|
|
||||||
|
#: antispam_bee.php:2514
|
||||||
|
msgid "Author"
|
||||||
|
msgstr "Autor"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2522
|
||||||
|
msgid "Type"
|
||||||
|
msgstr "Typ"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2544
|
||||||
|
msgid "Delete it"
|
||||||
|
msgstr "Löschen"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2550
|
||||||
|
msgid "Approve it"
|
||||||
|
msgstr "Freigeben"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2558
|
||||||
|
msgid "Notify message by Antispam Bee"
|
||||||
|
msgstr "Benachrichtigung von Antispam Bee"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2559
|
||||||
|
msgid "http://antispambee.com"
|
||||||
|
msgstr "http://antispambee.de"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:25 inc/gui.class.php:29
|
||||||
|
msgid "Cheatin’ uh?"
|
||||||
|
msgstr "Schummeln, was?"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:191
|
||||||
|
msgid "Antispam filter"
|
||||||
|
msgstr "Antispam-Regeln"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:201
|
||||||
|
msgid "Trust approved commenters"
|
||||||
|
msgstr "Genehmigten Kommentatoren vertrauen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:210
|
||||||
|
msgid "Trust commenters with a Gravatar"
|
||||||
|
msgstr "Kommentatoren mit Gravatar vertrauen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:235
|
||||||
|
msgid "Consider the comment time"
|
||||||
|
msgstr "Kommentarzeit berücksichtigen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:243
|
||||||
|
msgid "BBCode is spam"
|
||||||
|
msgstr "BBCode als Spam einstufen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:244
|
||||||
|
msgid "Review the comment contents for BBCode links"
|
||||||
|
msgstr "Analyse der Kommentarinhalte auf BBCode-Links"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:251
|
||||||
|
msgid "Validate the ip address of commenters"
|
||||||
|
msgstr "IP-Adresse des Kommentators validieren"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:259
|
||||||
|
msgid "Use regular expressions"
|
||||||
|
msgstr "Reguläre Ausdrücke anwenden"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:384
|
||||||
|
msgid "Advanced"
|
||||||
|
msgstr "Erweitert"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:387
|
||||||
|
msgid "Other antispam tools"
|
||||||
|
msgstr "Weitere Steuerungselemente"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:395
|
||||||
|
msgid "Keep the spam in my blog."
|
||||||
|
msgstr "Markierung als Spam / Aufbewahrung im Blog"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:425
|
||||||
|
msgid "Cleaning up the database from old entries"
|
||||||
|
msgstr "Säuberung der Datenbank von alten Einträgen"
|
||||||
|
|
||||||
|
#. translators: %s is the select field.
|
||||||
|
#: inc/gui.class.php:437
|
||||||
|
msgid "Limit approval to %s"
|
||||||
|
msgstr "Aufbewahrung gilt nur für %s"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:457
|
||||||
|
msgid "For multiple selections press Ctrl/CMD"
|
||||||
|
msgstr "Mehrfachauswahl bzw. Abwahl mit Strg/CMD"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:488
|
||||||
|
msgid "More"
|
||||||
|
msgstr "Sonstiges"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:499
|
||||||
|
msgid "Daily updates of spam detection rate"
|
||||||
|
msgstr "Verlauf der Erkennungsrate mit täglichen Werten"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:514
|
||||||
|
msgid "Do not check trackbacks / pingbacks"
|
||||||
|
msgstr "Eingehende Ping- und Trackbacks ignorieren"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:523
|
||||||
|
msgid "Check for comment forms on archive pages"
|
||||||
|
msgstr "Überwachung des Formulars auf Archivseiten"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:543
|
||||||
|
msgid "Save Changes"
|
||||||
|
msgstr "Änderungen speichern"
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
msgid "Antispam Bee"
|
||||||
|
msgstr "Antispam Bee"
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "pluginkollektiv"
|
||||||
|
msgstr "pluginkollektiv"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2503
|
||||||
|
msgid "Content removed by Antispam Bee"
|
||||||
|
msgstr "Inhalt von Antispam Bee entfernt"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:194
|
||||||
|
msgid "Filter in the execution order"
|
||||||
|
msgstr "Filter in der Ausführungsreihenfolge"
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
msgid "https://wordpress.org/plugins/antispam-bee/"
|
||||||
|
msgstr "https://de.wordpress.org/plugins/antispam-bee/"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:394
|
||||||
|
msgid "Mark as spam, do not delete"
|
||||||
|
msgstr "Erkannten Spam markieren, nicht löschen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:403
|
||||||
|
msgid "Notify admins by e-mail about incoming spam"
|
||||||
|
msgstr "E-Mail-Benachrichtigung an den Admin bei erkanntem Spam"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2495
|
||||||
|
msgid "Comment marked as spam"
|
||||||
|
msgstr "Kommentar als Spam markiert"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:522
|
||||||
|
msgid "Comment form used outside of posts"
|
||||||
|
msgstr "Kommentarformular wird außerhalb von Beiträgen verwendet"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:236
|
||||||
|
msgid "Not recommended when using page caching"
|
||||||
|
msgstr "Nicht empfohlen beim Caching von Blog-Seiten"
|
||||||
|
|
||||||
|
#. translators: $s is an input field containing the number of days.
|
||||||
|
#: inc/gui.class.php:421
|
||||||
|
msgid "Delete existing spam after %s days"
|
||||||
|
msgstr "Vorhandenen Spam nach %s Tagen löschen"
|
||||||
|
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "https://pluginkollektiv.org"
|
||||||
|
msgstr "https://pluginkollektiv.org"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:267
|
||||||
|
msgid "Look in the local spam database"
|
||||||
|
msgstr "Lokale Spam-Datenbank miteinbeziehen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:507
|
||||||
|
msgid "Amount of identified spam comments"
|
||||||
|
msgstr "Menge der identifizierten Spam-Kommentare"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:456
|
||||||
|
msgid "Delete comments by spam reasons"
|
||||||
|
msgstr "Bei definierten Spam-Gründen sofort löschen"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:410
|
||||||
|
msgid "Do not save the spam reason"
|
||||||
|
msgstr "Spam-Grund des Kommentars nicht speichern"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2510
|
||||||
|
msgid "New spam comment on your post"
|
||||||
|
msgstr "Neuer Spam-Kommentar zu deinem Beitrag"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:449
|
||||||
|
msgid "Other types of spam will be deleted immediately"
|
||||||
|
msgstr "Andere Spam-Typen werden sofort gelöscht"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:506
|
||||||
|
msgid "Spam counter on the dashboard"
|
||||||
|
msgstr "Spam-Zähler auf dem Dashboard anzeigen"
|
||||||
|
|
||||||
|
#: antispam_bee.php:2554
|
||||||
|
msgid "Spam list"
|
||||||
|
msgstr "Spam-Liste"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:468 inc/columns.class.php:28 antispam_bee.php:2529
|
||||||
|
msgid "Spam Reason"
|
||||||
|
msgstr "Spam-Grund"
|
||||||
|
|
||||||
|
#: inc/gui.class.php:411
|
||||||
|
msgid "Spam reason as a table column in the spam overview"
|
||||||
|
msgstr "Spam-Grund als Spalte in der Spam-Übersicht"
|
||||||
BIN
wp-content/languages/plugins/classic-editor-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/classic-editor-de_DE.mo
Normal file
Binary file not shown.
128
wp-content/languages/plugins/classic-editor-de_DE.po
Normal file
128
wp-content/languages/plugins/classic-editor-de_DE.po
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Translation of Plugins - Classic Editor - Stable (latest release) in German
|
||||||
|
# This file is distributed under the same license as the Plugins - Classic Editor - Stable (latest release) package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-02-03 10:03:56+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Plugins - Classic Editor - Stable (latest release)\n"
|
||||||
|
|
||||||
|
#: classic-editor.php:828
|
||||||
|
msgctxt "Editor Name"
|
||||||
|
msgid "Edit (Classic Editor)"
|
||||||
|
msgstr "Bearbeiten (Classic Editor)"
|
||||||
|
|
||||||
|
#: classic-editor.php:821
|
||||||
|
msgctxt "Editor Name"
|
||||||
|
msgid "Edit (Block Editor)"
|
||||||
|
msgstr "Bearbeiten (Block-Editor)"
|
||||||
|
|
||||||
|
#: classic-editor.php:457
|
||||||
|
msgid "Change settings"
|
||||||
|
msgstr "Einstellungen ändern"
|
||||||
|
|
||||||
|
#: classic-editor.php:444
|
||||||
|
msgid "Default editor for all sites"
|
||||||
|
msgstr "Standard-Editor für alle Websites"
|
||||||
|
|
||||||
|
#: classic-editor.php:440
|
||||||
|
msgid "Editor Settings"
|
||||||
|
msgstr "Editor-Einstellungen"
|
||||||
|
|
||||||
|
#: classic-editor.php:424
|
||||||
|
msgid "Default Editor"
|
||||||
|
msgstr "Standard-Editor"
|
||||||
|
|
||||||
|
#: classic-editor.php:375 classic-editor.php:452 classic-editor.php:858
|
||||||
|
#: classic-editor.php:869
|
||||||
|
msgctxt "Editor Name"
|
||||||
|
msgid "Block Editor"
|
||||||
|
msgstr "Block-Editor"
|
||||||
|
|
||||||
|
#: classic-editor.php:371 classic-editor.php:448 classic-editor.php:855
|
||||||
|
#: classic-editor.php:869
|
||||||
|
msgctxt "Editor Name"
|
||||||
|
msgid "Classic Editor"
|
||||||
|
msgstr "Classic Editor"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: classic-editor.php:823
|
||||||
|
msgid "Edit “%s” in the Block Editor"
|
||||||
|
msgstr "„%s“ im Block-Editor bearbeiten"
|
||||||
|
|
||||||
|
#: classic-editor.php:663
|
||||||
|
msgid "Switch to Block Editor"
|
||||||
|
msgstr "Zum Block-Editor wechseln"
|
||||||
|
|
||||||
|
#: classic-editor.php:687
|
||||||
|
msgid "Switch to Classic Editor"
|
||||||
|
msgstr "Zum Classic Editor wechseln"
|
||||||
|
|
||||||
|
#: classic-editor.php:513
|
||||||
|
msgid "Change the %1$sClassic Editor settings%2$s."
|
||||||
|
msgstr "Ändere die %1$sClassic-Editor-Einstellungen%2$s."
|
||||||
|
|
||||||
|
#: classic-editor.php:504
|
||||||
|
msgid "The Classic Editor plugin prevents use of the new Block Editor."
|
||||||
|
msgstr "Das Plugin Classic Editor schützt vor der Nutzung des neuen Block-Editors."
|
||||||
|
|
||||||
|
#: classic-editor.php:461
|
||||||
|
msgid "By default the Block Editor is replaced with the Classic Editor and users cannot switch editors."
|
||||||
|
msgstr "Standardmäßig wird der Block-Editor durch den klassischen Editor ersetzt und Benutzer können den Editor nicht wechseln."
|
||||||
|
|
||||||
|
#: classic-editor.php:460
|
||||||
|
msgid "Allow site admins to change settings"
|
||||||
|
msgstr "Website-Admins das Ändern der Einstellungen ermöglichen"
|
||||||
|
|
||||||
|
#: classic-editor.php:644
|
||||||
|
msgid "Editor"
|
||||||
|
msgstr "Standard-Editor"
|
||||||
|
|
||||||
|
#: classic-editor.php:399
|
||||||
|
msgid "No"
|
||||||
|
msgstr "Nein"
|
||||||
|
|
||||||
|
#: classic-editor.php:395
|
||||||
|
msgid "Yes"
|
||||||
|
msgstr "Ja"
|
||||||
|
|
||||||
|
#: classic-editor.php:322
|
||||||
|
msgid "Allow users to switch editors"
|
||||||
|
msgstr "Erlaube Benutzern, den Editor zu wechseln."
|
||||||
|
|
||||||
|
#: classic-editor.php:321
|
||||||
|
msgid "Default editor for all users"
|
||||||
|
msgstr "Standard-Editor für alle Benutzer"
|
||||||
|
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "https://github.com/WordPress/classic-editor/"
|
||||||
|
msgstr "https://github.com/WordPress/classic-editor/"
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
msgid "https://wordpress.org/plugins/classic-editor/"
|
||||||
|
msgstr "https://de.wordpress.org/plugins/classic-editor/"
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "WordPress Contributors"
|
||||||
|
msgstr "WordPress-Mitwirkende"
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Enables the WordPress classic editor and the old-style Edit Post screen with TinyMCE, Meta Boxes, etc. Supports the older plugins that extend this screen."
|
||||||
|
msgstr "Aktiviert den klassischen WordPress-Editor und die „old-style“-Bearbeiten-Ansicht für Beiträge bzw. Seiten (TinyMCE, Meta Boxen etc.). Unterstützt außerdem ältere Plugins, die diesen Bildschirm erweitern."
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
msgid "Classic Editor"
|
||||||
|
msgstr "Classic Editor"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: classic-editor.php:830
|
||||||
|
msgid "Edit “%s” in the Classic Editor"
|
||||||
|
msgstr "„%s“ im klassischen Editor bearbeiten"
|
||||||
|
|
||||||
|
#: classic-editor.php:706
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Einstellungen"
|
||||||
BIN
wp-content/languages/plugins/cookie-notice-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/cookie-notice-de_DE.mo
Normal file
Binary file not shown.
385
wp-content/languages/plugins/cookie-notice-de_DE.po
Normal file
385
wp-content/languages/plugins/cookie-notice-de_DE.po
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
# Translation of Plugins - Cookie Notice for GDPR - Stable (latest release) in German
|
||||||
|
# This file is distributed under the same license as the Plugins - Cookie Notice for GDPR - Stable (latest release) package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-02-14 13:47:23+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Plugins - Cookie Notice for GDPR - Stable (latest release)\n"
|
||||||
|
|
||||||
|
#: cookie-notice.php:554
|
||||||
|
msgid "The text of the privacy policy button."
|
||||||
|
msgstr "Der Text des Button für die Datenschutzerklärung."
|
||||||
|
|
||||||
|
#: cookie-notice.php:745
|
||||||
|
msgid "Enter additional button CSS classes separated by spaces."
|
||||||
|
msgstr "Gib zusätzliche CSS-Klassen für Buttons mit Leerzeichen getrennt ein."
|
||||||
|
|
||||||
|
#: cookie-notice.php:615
|
||||||
|
msgid "Select the privacy policy link target."
|
||||||
|
msgstr "Wähl das Linkziel zur Datenschutzerklärung aus."
|
||||||
|
|
||||||
|
#: cookie-notice.php:586
|
||||||
|
msgid "Synchronize with WordPress Privacy Policy page."
|
||||||
|
msgstr "Synchronisiere mit der Seite Datenschutzerklärung in WordPress."
|
||||||
|
|
||||||
|
#: cookie-notice.php:550
|
||||||
|
msgid "Enable privacy policy link."
|
||||||
|
msgstr "Link zu den Datenschutzrichtlinien aktivieren."
|
||||||
|
|
||||||
|
#: cookie-notice.php:516
|
||||||
|
msgid "Select the method for displaying the revoke button - automatic (in the Cookie Notice container) or manual using <code>[cookies_revoke]</code> shortcode."
|
||||||
|
msgstr "Wähle die Methode zur Anzeige des Widerrufs-Buttons – automatisch (im Cookie-Notice-Container) oder manuell mit dem Shortcode <code>[cookies_revoke]</code>."
|
||||||
|
|
||||||
|
#: cookie-notice.php:508
|
||||||
|
msgid "The text of the button to revoke the cookie consent."
|
||||||
|
msgstr "Der Text des Buttons, mit dem die Cookie-Einwilligung widerrufen wird."
|
||||||
|
|
||||||
|
#: cookie-notice.php:505
|
||||||
|
msgid "Enable to give to the user the possibility to revoke their cookie consent <i>(requires \"Refuse cookies\" option enabled)</i>."
|
||||||
|
msgstr "Aktivieren, um dem Benutzer die Möglichkeit zu geben, seine Cookie-Einwilligung zu widerrufen <i>(erfordert die aktivierte Option \"Cookies ablehnen\")</i>."
|
||||||
|
|
||||||
|
#: cookie-notice.php:490
|
||||||
|
msgid "The code to be used in your site footer, before the closing body tag."
|
||||||
|
msgstr "Der Code, der in deinem Website-Footer vor dem schließenden Body-Tag verwendet werden soll."
|
||||||
|
|
||||||
|
#: cookie-notice.php:486
|
||||||
|
msgid "The code to be used in your site header, before the closing head tag."
|
||||||
|
msgstr "Der Code, der in deinem Header vor dem schließenden Head-Tag verwendet werden soll."
|
||||||
|
|
||||||
|
#: cookie-notice.php:483
|
||||||
|
msgid "Body"
|
||||||
|
msgstr "Body"
|
||||||
|
|
||||||
|
#: cookie-notice.php:482
|
||||||
|
msgid "Head"
|
||||||
|
msgstr "Head"
|
||||||
|
|
||||||
|
#: cookie-notice.php:408
|
||||||
|
msgid "Button class"
|
||||||
|
msgstr "Button-Klasse"
|
||||||
|
|
||||||
|
#: cookie-notice.php:193 cookie-notice.php:395
|
||||||
|
msgid "Revoke cookies"
|
||||||
|
msgstr "Cookies widerrufen"
|
||||||
|
|
||||||
|
#: cookie-notice.php:394
|
||||||
|
msgid "Refuse cookies"
|
||||||
|
msgstr "Cookies ablehnen"
|
||||||
|
|
||||||
|
#: cookie-notice.php:194 cookie-notice.php:392
|
||||||
|
msgid "Privacy policy"
|
||||||
|
msgstr "Datenschutzerklärung"
|
||||||
|
|
||||||
|
#: cookie-notice.php:166
|
||||||
|
msgid "An hour"
|
||||||
|
msgstr "eine Stunde"
|
||||||
|
|
||||||
|
#: cookie-notice.php:147
|
||||||
|
msgid "Manual"
|
||||||
|
msgstr "Manuell"
|
||||||
|
|
||||||
|
#: cookie-notice.php:146
|
||||||
|
msgid "Automatic"
|
||||||
|
msgstr "Automatisch"
|
||||||
|
|
||||||
|
#: cookie-notice.php:527
|
||||||
|
msgid "Enable to reload the page after cookies are accepted."
|
||||||
|
msgstr "Aktiviere diese Option, um die Seite neu zu laden, nachdem Cookies akzeptiert wurden."
|
||||||
|
|
||||||
|
#: cookie-notice.php:397
|
||||||
|
msgid "Reloading"
|
||||||
|
msgstr "Lade"
|
||||||
|
|
||||||
|
#: cookie-notice.php:494
|
||||||
|
msgid "To get the cookie notice status use <code>cn_cookies_accepted()</code> function."
|
||||||
|
msgstr "Um den Status der Cookie-Benachrichtigung zu erhalten, verwende die Funktion <code>cn_cookies_accepted()</code>."
|
||||||
|
|
||||||
|
#: cookie-notice.php:464
|
||||||
|
msgid "The text of the button to refuse the usage of the cookies."
|
||||||
|
msgstr "Der Text des Buttons, mit dem die Verwendung von Cookies abgelehnt wird."
|
||||||
|
|
||||||
|
#: cookie-notice.php:396
|
||||||
|
msgid "Script blocking"
|
||||||
|
msgstr "Script-Blockierung"
|
||||||
|
|
||||||
|
#: cookie-notice.php:358
|
||||||
|
msgid "Check out our other <a href=\"%s\" target=\"_blank\">WordPress plugins</a>."
|
||||||
|
msgstr "Schau dir auch unsere anderen <a href=\"%s\" target=\"_blank\">WordPress-Plugins</a> an."
|
||||||
|
|
||||||
|
#: cookie-notice.php:357
|
||||||
|
msgid "Blog about it & link to the <a href=\"%s\" target=\"_blank\">plugin page</a>."
|
||||||
|
msgstr "Schreibe darüber & verlinke auf die <a href=\"%s\" target=\"_blank\">Plugin-Seite</a>."
|
||||||
|
|
||||||
|
#: cookie-notice.php:356
|
||||||
|
msgid "<a href=\"%s\" target=\"_blank\">Rate it 5</a> on WordPress.org"
|
||||||
|
msgstr "<a href=\"%s\" target=\"_blank\">Bewerte es mit 5*</a> auf WordPress.org"
|
||||||
|
|
||||||
|
#: cookie-notice.php:353
|
||||||
|
msgid "If you are having problems with this plugin, please browse it's <a href=\"%s\" target=\"_blank\">Documentation</a> or talk about them in the <a href=\"%s\" target=\"_blank\">Support forum</a>"
|
||||||
|
msgstr "Wenn du Probleme mit diesem Plugin hast, dann schau bitte in unsere <a href=\"%s\" target=\"_blank\">Dokumentation</a> oder berichte darüber im <a href=\"%s\" target=\"_blank\">Support-Forum</a>."
|
||||||
|
|
||||||
|
#: cookie-notice.php:551
|
||||||
|
msgid "Need a Cookie Policy? Generate one with <a href=\"%s\" target=\"_blank\" title=\"iubenda\">iubenda</a>."
|
||||||
|
msgstr "Benötigst du eine Cookie-Richtlinie? Generiere eine mit <a href=\"%s\" target=\"_blank\" title=\"iubenda\">iubenda</a>."
|
||||||
|
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "http://www.dfactory.eu/"
|
||||||
|
msgstr "https://dfactory.eu/"
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "dFactory"
|
||||||
|
msgstr "dFactory"
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Cookie Notice allows you to elegantly inform users that your site uses cookies and to comply with the EU cookie law GDPR regulations."
|
||||||
|
msgstr "Mit Cookie Notice kannst du deine Besucher elegant darüber informieren, dass deine Website Cookies benutzt. Dies ist notwendig, um die EU-Cookie-Richtlinie zu erfüllen."
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
msgid "http://www.dfactory.eu/plugins/cookie-notice/"
|
||||||
|
msgstr "https://dfactory.eu/products/cookie-notice/"
|
||||||
|
|
||||||
|
#: cookie-notice.php:1080
|
||||||
|
msgid "Are you sure you want to reset these settings to defaults?"
|
||||||
|
msgstr "Bist du dir sicher, dass du die Einstellungen zurücksetzen möchtest?"
|
||||||
|
|
||||||
|
#: cookie-notice.php:1008
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
|
#: cookie-notice.php:991
|
||||||
|
msgid "Support"
|
||||||
|
msgstr "Support"
|
||||||
|
|
||||||
|
#: cookie-notice.php:871
|
||||||
|
msgid "Settings restored to defaults."
|
||||||
|
msgstr "Standard-Einstellungen wiederhergestellt."
|
||||||
|
|
||||||
|
#: cookie-notice.php:732
|
||||||
|
msgid "Choose buttons style."
|
||||||
|
msgstr "Style der Buttons einstellen."
|
||||||
|
|
||||||
|
#: cookie-notice.php:711
|
||||||
|
msgid "Number of pixels user has to scroll to accept the usage of the cookies and make the notification disappear."
|
||||||
|
msgstr "Anzahl der Pixel, die der Nutzer scrollen muss, um der Verwendung von Cookies zuzustimmen und die Meldung verschwinden zu lassen."
|
||||||
|
|
||||||
|
#: cookie-notice.php:708
|
||||||
|
msgid "Enable cookie notice acceptance when users scroll."
|
||||||
|
msgstr "Der Cookie-Verwendung soll zugestimmt werden, wenn der Nutzer scrollt."
|
||||||
|
|
||||||
|
#: cookie-notice.php:697
|
||||||
|
msgid "Cookie notice acceptance animation."
|
||||||
|
msgstr "Animation beim Akzeptieren der Cookie-Nachricht."
|
||||||
|
|
||||||
|
#: cookie-notice.php:676
|
||||||
|
msgid "Select location for your cookie notice."
|
||||||
|
msgstr "Wähle die Position der Meldung aus."
|
||||||
|
|
||||||
|
#: cookie-notice.php:656
|
||||||
|
msgid "Select where all the plugin scripts should be placed."
|
||||||
|
msgstr "Wähle, wo alle Plugin-Skripte abgelegt werden sollen."
|
||||||
|
|
||||||
|
#: cookie-notice.php:638
|
||||||
|
msgid "The amount of time that cookie should be stored for."
|
||||||
|
msgstr "Für diesen Zeitraum soll der Cookie gespeichert werden."
|
||||||
|
|
||||||
|
#: cookie-notice.php:593
|
||||||
|
msgid "Enter the full URL starting with http(s)://"
|
||||||
|
msgstr "Gib die vollständige URL ein, beginnend mit http(s)://"
|
||||||
|
|
||||||
|
#: cookie-notice.php:580
|
||||||
|
msgid "Select from one of your site's pages."
|
||||||
|
msgstr "Wähle eine der vorhandenen Seiten deiner Website aus."
|
||||||
|
|
||||||
|
#: cookie-notice.php:569
|
||||||
|
msgid "-- select page --"
|
||||||
|
msgstr "-- Seite auswählen --"
|
||||||
|
|
||||||
|
#: cookie-notice.php:566
|
||||||
|
msgid "Select where to redirect user for more information about cookies."
|
||||||
|
msgstr "Gib an, wo die Besucher weitere Informationen über Cookies finden."
|
||||||
|
|
||||||
|
#: cookie-notice.php:494
|
||||||
|
msgid "Enter non functional cookies Javascript code here (for e.g. Google Analitycs) to be used after cookies are accepted."
|
||||||
|
msgstr "Füge nicht-funktionalen Cookie-JavaScript-Code hier ein (z.B. Google Analytics). Er wird nach dem Akzeptieren der Cookies verwendet."
|
||||||
|
|
||||||
|
#: cookie-notice.php:460
|
||||||
|
msgid "Enable to give to the user the possibility to refuse third party non functional cookies."
|
||||||
|
msgstr "Aktivieren, um dem Benutzer die Möglichkeit zu geben, nicht funktionale Cookies von Drittanbietern abzulehnen."
|
||||||
|
|
||||||
|
#: cookie-notice.php:449
|
||||||
|
msgid "The text of the option to accept the usage of the cookies and make the notification disappear."
|
||||||
|
msgstr "Der Text, der angezeigt werden soll, um den Hinweis zu akzeptieren und die Nachricht auszublenden."
|
||||||
|
|
||||||
|
#: cookie-notice.php:436
|
||||||
|
msgid "Enter the cookie notice message."
|
||||||
|
msgstr "Gib hier den Meldungstext ein."
|
||||||
|
|
||||||
|
#: cookie-notice.php:424
|
||||||
|
msgid "Enable if you want all plugin data to be deleted on deactivation."
|
||||||
|
msgstr "Aktiviere diese Funktion, wenn du möchtest, dass alle Plugin-Daten gelöscht werden, sobald das Plugin deaktiviert wird."
|
||||||
|
|
||||||
|
#: cookie-notice.php:409
|
||||||
|
msgid "Colors"
|
||||||
|
msgstr "Farben"
|
||||||
|
|
||||||
|
#: cookie-notice.php:407
|
||||||
|
msgid "Button style"
|
||||||
|
msgstr "Buttonstil"
|
||||||
|
|
||||||
|
#: cookie-notice.php:406
|
||||||
|
msgid "Animation"
|
||||||
|
msgstr "Animation"
|
||||||
|
|
||||||
|
#: cookie-notice.php:405
|
||||||
|
msgid "Position"
|
||||||
|
msgstr "Position"
|
||||||
|
|
||||||
|
#: cookie-notice.php:404
|
||||||
|
msgid "Design"
|
||||||
|
msgstr "Design"
|
||||||
|
|
||||||
|
#: cookie-notice.php:401
|
||||||
|
msgid "Deactivation"
|
||||||
|
msgstr "Deaktivierung"
|
||||||
|
|
||||||
|
#: cookie-notice.php:400
|
||||||
|
msgid "Script placement"
|
||||||
|
msgstr "Script-Platzierung"
|
||||||
|
|
||||||
|
#: cookie-notice.php:399
|
||||||
|
msgid "Cookie expiry"
|
||||||
|
msgstr "Cookie-Gültigkeit"
|
||||||
|
|
||||||
|
#: cookie-notice.php:398
|
||||||
|
msgid "On scroll"
|
||||||
|
msgstr "Beim Scrollen"
|
||||||
|
|
||||||
|
#: cookie-notice.php:393
|
||||||
|
msgid "Link target"
|
||||||
|
msgstr "Linkziel"
|
||||||
|
|
||||||
|
#: cookie-notice.php:391
|
||||||
|
msgid "Button text"
|
||||||
|
msgstr "Buttontext"
|
||||||
|
|
||||||
|
#: cookie-notice.php:390
|
||||||
|
msgid "Message"
|
||||||
|
msgstr "Meldungstext"
|
||||||
|
|
||||||
|
#: cookie-notice.php:389
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
|
#: cookie-notice.php:373
|
||||||
|
msgid "Reset to defaults"
|
||||||
|
msgstr "Auf Standard-Einstellungen zurücksetzen"
|
||||||
|
|
||||||
|
#: cookie-notice.php:355
|
||||||
|
msgid "Do you like this plugin?"
|
||||||
|
msgstr "Gefällt dir das Plugin?"
|
||||||
|
|
||||||
|
#: cookie-notice.php:352
|
||||||
|
msgid "Need support?"
|
||||||
|
msgstr "Benötigst du Hilfe?"
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
#: cookie-notice.php:336 cookie-notice.php:347 cookie-notice.php:350
|
||||||
|
msgid "Cookie Notice"
|
||||||
|
msgstr "Cookie Notice"
|
||||||
|
|
||||||
|
#: cookie-notice.php:192
|
||||||
|
msgid "No"
|
||||||
|
msgstr "Nein"
|
||||||
|
|
||||||
|
#: cookie-notice.php:191
|
||||||
|
msgid "Ok"
|
||||||
|
msgstr "OK"
|
||||||
|
|
||||||
|
#: cookie-notice.php:190
|
||||||
|
msgid "We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it."
|
||||||
|
msgstr "Diese Website benutzt Cookies. Wenn du die Website weiter nutzt, gehen wir von deinem Einverständnis aus."
|
||||||
|
|
||||||
|
#: cookie-notice.php:184
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Footer"
|
||||||
|
|
||||||
|
#: cookie-notice.php:183
|
||||||
|
msgid "Header"
|
||||||
|
msgstr "Header"
|
||||||
|
|
||||||
|
#: cookie-notice.php:179
|
||||||
|
msgid "Slide"
|
||||||
|
msgstr "Ausgleiten"
|
||||||
|
|
||||||
|
#: cookie-notice.php:178
|
||||||
|
msgid "Fade"
|
||||||
|
msgstr "Ausblenden"
|
||||||
|
|
||||||
|
#: cookie-notice.php:173
|
||||||
|
msgid "infinity"
|
||||||
|
msgstr "unbegrenzt"
|
||||||
|
|
||||||
|
#: cookie-notice.php:172
|
||||||
|
msgid "1 year"
|
||||||
|
msgstr "1 Jahr"
|
||||||
|
|
||||||
|
#: cookie-notice.php:171
|
||||||
|
msgid "6 months"
|
||||||
|
msgstr "6 Monate"
|
||||||
|
|
||||||
|
#: cookie-notice.php:170
|
||||||
|
msgid "3 months"
|
||||||
|
msgstr "3 Monate"
|
||||||
|
|
||||||
|
#: cookie-notice.php:169
|
||||||
|
msgid "1 month"
|
||||||
|
msgstr "1 Monat"
|
||||||
|
|
||||||
|
#: cookie-notice.php:168
|
||||||
|
msgid "1 week"
|
||||||
|
msgstr "1 Woche"
|
||||||
|
|
||||||
|
#: cookie-notice.php:167
|
||||||
|
msgid "1 day"
|
||||||
|
msgstr "1 Tag"
|
||||||
|
|
||||||
|
#: cookie-notice.php:162
|
||||||
|
msgid "Bar color"
|
||||||
|
msgstr "Hintergrundfarbe"
|
||||||
|
|
||||||
|
#: cookie-notice.php:161
|
||||||
|
msgid "Text color"
|
||||||
|
msgstr "Textfarbe"
|
||||||
|
|
||||||
|
#: cookie-notice.php:151
|
||||||
|
msgid "Page link"
|
||||||
|
msgstr "Seiten-Link"
|
||||||
|
|
||||||
|
#: cookie-notice.php:152
|
||||||
|
msgid "Custom link"
|
||||||
|
msgstr "Benutzerdefinierter Link"
|
||||||
|
|
||||||
|
#: cookie-notice.php:142
|
||||||
|
msgid "Bootstrap"
|
||||||
|
msgstr "Bootstrap"
|
||||||
|
|
||||||
|
#: cookie-notice.php:141
|
||||||
|
msgid "WordPress"
|
||||||
|
msgstr "WordPress"
|
||||||
|
|
||||||
|
#: cookie-notice.php:140 cookie-notice.php:177
|
||||||
|
msgid "None"
|
||||||
|
msgstr "Keine"
|
||||||
|
|
||||||
|
#: cookie-notice.php:136
|
||||||
|
msgid "Bottom"
|
||||||
|
msgstr "Unten"
|
||||||
|
|
||||||
|
#: cookie-notice.php:135
|
||||||
|
msgid "Top"
|
||||||
|
msgstr "Oben"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"translation-revision-date":"2019-08-15 19:03:43+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"de"},"block search term\u0004map":["zuordnen"],"block search term\u0004navigation":["Navigation"],"Terrain":["Gel\u00e4nde"],"Satellite":["Satellit"],"Black and white":["Schwarz-wei\u00df"],"Basic":["Basis"],"Add an interactive map showing one or more locations.":["F\u00fcge eine interaktive Karte hinzu, auf der ein oder mehrere Standorte verzeichnet sind."],"Delete Marker":["Marker l\u00f6schen"],"Marker Caption":["Marker-Beschriftung"],"Marker Title":["Marker-Titel"],"block search term\u0004location":["Ort"],"Map":["Karte"]}},"comment":{"reference":"_inc\/blocks\/map\/view.js"}}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
wp-content/languages/plugins/jetpack-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/jetpack-de_DE.mo
Normal file
Binary file not shown.
14758
wp-content/languages/plugins/jetpack-de_DE.po
Normal file
14758
wp-content/languages/plugins/jetpack-de_DE.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
wp-content/languages/plugins/shariff-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/shariff-de_DE.mo
Normal file
Binary file not shown.
843
wp-content/languages/plugins/shariff-de_DE.po
Normal file
843
wp-content/languages/plugins/shariff-de_DE.po
Normal file
@@ -0,0 +1,843 @@
|
|||||||
|
# Translation of Plugins - Shariff Wrapper - Stable (latest release) in German
|
||||||
|
# This file is distributed under the same license as the Plugins - Shariff Wrapper - Stable (latest release) package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-07-23 17:12:57+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Plugins - Shariff Wrapper - Stable (latest release)\n"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1997
|
||||||
|
msgid "Facebook shut down the possibility to request share counts without an APP ID and Secret. Therefore, you need to create a Facebook APP ID and Secret and enter it in the settings on the Statistic tab. Google will provide you with many tutorials. Simple search for “facebook app id secret” and you will find one in your language."
|
||||||
|
msgstr "Facebook hat die Möglichkeit abgeschaltet Share Counts ohne Registrierung, d.h. ohne App-ID und App-Geheimcode, abzufragen. Daher ist es nun zwingend erforderlich, sich eine App-ID und einen App-Geheimcode zu erstellen und diese in den Shariff-Einstellungen auf dem Reiter \"Statistik\" einzutragen. Über Google lassen sich diverse Tutorials finden die erklären, wie dies funktioniert. Eine Suche nach \"facebook app id secret\" sollte schnell eine geeignete Anleitung in der eigenen Sprache zu Tage fördern."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:371
|
||||||
|
msgid "Hide WhatsApp on desktop devices."
|
||||||
|
msgstr "Verstecke WhatsApp auf Desktop-Geräten."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1432
|
||||||
|
msgid "Notice: Twitter does not offer official share counts anymore. As an alternative share counts for Twitter can be requested via twitcount.com. You will need to register with them for it to work. Otherwise the count will always be zero."
|
||||||
|
msgstr "Hinweis: Twitter bietet keine Schnittstelle zur direkten Abfrage von Share Counts mehr an. Als Alternative können diese via twitcount.com abgerufen werden. Dazu ist eine Registrierung bei diesem Dienst erforderlich. Andernfalls werden die Zähler immer null anzeigen."
|
||||||
|
|
||||||
|
#: shariff.php:61
|
||||||
|
msgid ""
|
||||||
|
"<h2>Social Media Plugin \"Shariff Wrapper\"</h2>\n"
|
||||||
|
"\n"
|
||||||
|
"On our website we offer you the possibility to use so called \"Social Media Buttons\". To protect your data, we use a solution called \"Shariff\". Hereby the share buttons are implemented as static images, which contain a link to the corresponding social network site. If you click on such a button, you will be redirected to the respective social network site in the same way, as normal links would do as well. Only in that moment of time the provider of the social network site will get information about you, for example your IP address. If you do not click on such a share button, no data will be transmitted. Information about the collection and usage of your date on the social network sites can be found in the corresponding terms of use of the respective provider. More information about the plugin and the Shariff solution can be found here: <a href=\"https://wordpress.org/plugins/shariff/\">https://wordpress.org/plugins/shariff/</a>\n"
|
||||||
|
"\n"
|
||||||
|
"On our website we offer share buttons for the following services / companies: AddThis, Diaspora, Facebook, Flattr, Flipboard, LinkedIn, Mix, Odnoklassniki, Patreon, PayPal, Pinterest, Pocket, Qzone, Reddit, Telegram, TencentWeibo, Threema, Tumblr, Twitter, VK, Wallabag, Weibo, WhatsApp, Xing."
|
||||||
|
msgstr ""
|
||||||
|
"<h2>Social-Media-Plugin „Shariff Wrapper“</h2>\n"
|
||||||
|
"\n"
|
||||||
|
"Wir bieten Ihnen auf unserer Website die Möglichkeit zur Nutzung von sogenannten „Social-Media-Buttons“ an. Zum Schutz Ihrer Daten setzen wir bei der Implementierung auf die Lösung „Shariff“. Hierdurch werden diese Buttons auf unserer Seite lediglich als statische Grafik eingebunden, die eine Verlinkung auf die entsprechende Website des Anbieters enthält. Durch das Anklicken der Grafik werden Sie somit zu der Website des jeweiligen Anbieters weitergeleitet, genauso wie es auch bei normalen Links funktioniert. Erst beim Aufruf der Website des Anbieters erhält dieser Informationen über Sie, wie zum Beispiel Ihre IP-Adresse. Sofern Sie die Button-Grafiken nicht anklicken, findet keinerlei Datenaustausch statt. Informationen über die Erhebung und Verwendung Ihrer Daten in den sozialen Netzwerken finden Sie in den jeweiligen Nutzungsbedingungen der entsprechenden Anbieter. Mehr Informationen über das Plugin und zur Shariff-Lösung finden Sie hier: <a href=\"https://de.wordpress.org/plugins/shariff/\">https://de.wordpress.org/plugins/shariff/</a>\n"
|
||||||
|
"\n"
|
||||||
|
"Wir bieten auf unserer Website Buttons für die folgenden Dienste / Unternehmen an: AddThis, Diaspora, Facebook, Flattr, Flipboard, LinkedIn, Mix, Odnoklassniki, Patreon, PayPal, Pinterest, Pocket, Qzone, Reddit, Telegram, TencentWeibo, Threema, Tumblr, Twitter, VK, Wallabag, Weibo, WhatsApp, Xing."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2367
|
||||||
|
msgid "Product"
|
||||||
|
msgstr "Produkt"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1206
|
||||||
|
msgid "Same rules as for the default headline. Leave empty to keep the same headline in all cases."
|
||||||
|
msgstr "Die gleichen Regeln wie für die Standardüberschrift. Leer lassen, um überall die gleiche Überschrift beizubehalten."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1204
|
||||||
|
msgid "Be the first one to share this post!"
|
||||||
|
msgstr "Sei der Erste, der diesen Beitrag teilt!"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:968
|
||||||
|
msgid "Use the pipe sign | (Alt Gr + < or ⌥ + 7) between two or more hooks."
|
||||||
|
msgstr "Verwende das Pipe-Zeichen | (Alt Gr + < oder ⌥ + 7) als Trennzeichen zwischen den Hooks."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:967
|
||||||
|
msgid "some_custom_wordpress_hook|some_other_custom_wordpress_hook"
|
||||||
|
msgstr "irgendein_benutzerdefinierter_WordPress_Hook|irgendein_anderer_benutzerdefinierter_WordPress_Hook"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:232
|
||||||
|
msgid "Alternative headline, if share counts are zero:"
|
||||||
|
msgstr "Alternative Überschrift, wenn die Anzahl der Teilungen null ist:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:133
|
||||||
|
msgid "Automatically set button language based on locale (e.g. set by WPML)."
|
||||||
|
msgstr "Automatische Einstellung der Button-Sprache basierend auf dem Gebietsschema (z. B. durch WPML festgelegt)."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:124
|
||||||
|
msgid "Default button language:"
|
||||||
|
msgstr "Standard-Button-Sprache:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:111
|
||||||
|
msgid "Use the following shortcode for the custom hooks:"
|
||||||
|
msgstr "Verwende den folgenden Shortcode für die Hooks:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:108
|
||||||
|
msgid "Add Shariff to the following custom WordPress hooks:"
|
||||||
|
msgstr "Die Shariff-Buttons zu den folgenden WordPress-Hooks hinzufügen:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1821
|
||||||
|
msgid "Adds a custom class to the container around Shariff."
|
||||||
|
msgstr "Fügt eine individuelle Klasse zum Container um Shariff hinzu."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1813
|
||||||
|
msgid "Adds custom style attributes to the container around Shariff."
|
||||||
|
msgstr "Fügt individuelle Style-Attribute zum Container um Shariff hinzu."
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
msgid "https://wordpress.org/plugins-wp/shariff/"
|
||||||
|
msgstr "https://de.wordpress.org/plugins-wp/shariff/"
|
||||||
|
|
||||||
|
#: shariff.php:208
|
||||||
|
msgid "Timestamp of the last update of the post. Used for dynamic cache lifespan."
|
||||||
|
msgstr "Der Zeitstempel der letzten Beitragsaktualisierung. Dieser wird für die dynamische Cache-Lebensdauer verwendet."
|
||||||
|
|
||||||
|
#: shariff.php:204
|
||||||
|
msgid "A list of services separated by |. Example: twitter|facebook|xing"
|
||||||
|
msgstr "Eine Liste mit Dienste durch | getrennt. Beispiel: twitter|facebook|xing"
|
||||||
|
|
||||||
|
#: shariff.php:199
|
||||||
|
msgid "URL of the post or page to request share counts for."
|
||||||
|
msgstr "URL des Beitrags oder der Seite, für die Share Counts abgefragt werden sollen."
|
||||||
|
|
||||||
|
#: includes/class-shariff-widget.php:57 includes/class-shariff-widget.php:61
|
||||||
|
msgid "(optional)"
|
||||||
|
msgstr "(optional)"
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with the correct URL to the local Shariff
|
||||||
|
#. Settings page and tab.
|
||||||
|
#: admin/admin-notices.php:43
|
||||||
|
msgid "Please check your <a href=\"%s\">Shariff Settings</a>!"
|
||||||
|
msgstr "Bitte überprüfe deine <a href=\"%s\">Shariff-Einstellungen</a>!"
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:77
|
||||||
|
msgid "Add buttons after this content."
|
||||||
|
msgstr "Buttons nach dem Inhalt einfügen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2252
|
||||||
|
msgid "Page"
|
||||||
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1885
|
||||||
|
msgid "Sets a custom text for the info button."
|
||||||
|
msgstr "Legt einen individuelle Text für den Alt-Text des Info-Buttons fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1884
|
||||||
|
msgid "My custom text."
|
||||||
|
msgstr "Mein eigener Text."
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with the correct URL to the wordpress.org
|
||||||
|
#. review page.
|
||||||
|
#: admin/admin-menu.php:1687
|
||||||
|
msgid "If you enjoy our plugin, please consider writing a review about it on <a href=\"%s\" target=\"_blank\">wordpress.org</a>."
|
||||||
|
msgstr "Wenn dir unser Plugin gefällt, würden wir uns über eine Bewertung auf <a href=\"%s\" target=\"_blank\">wordpress.org</a> freuen."
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with the correct URL to the authors twitter
|
||||||
|
#. account.
|
||||||
|
#: admin/admin-menu.php:1671
|
||||||
|
msgid "You can also follow <a href=\"%s\" target=_blank\">@jplambeck</a> on Twitter."
|
||||||
|
msgstr "Du kannst auch <a href=\"%s\" target=_blank\">@jplambeck</a> auf Twitter folgen."
|
||||||
|
|
||||||
|
#. Translators: %1$s and %2$s will be replaced with the correct URLs to FAQ and
|
||||||
|
#. the forum on wordpress.org.
|
||||||
|
#: admin/admin-menu.php:1654
|
||||||
|
msgid "If you need any help with the plugin, take a look at the <a href=\"%1$s\" target=\"_blank\">Frequently Asked Questions (FAQ)</a> and the <a href=\"%2$s\" target=\"_blank\">Support Forum</a> on wordpress.org. "
|
||||||
|
msgstr "Bei Problemen, Fragen und Anregungen wirf einen Blick in die <a href=\"%1$s\" target=\"_blank\">Frequently Asked Questions (FAQ)</a> und das <a href=\"%2$s\" target=\"_blank\">Support-Forum</a>."
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with the correct URL to the German computer
|
||||||
|
#. magazine.
|
||||||
|
#: admin/admin-menu.php:1640
|
||||||
|
msgid "It is based on the original Shariff buttons developed by the German computer magazine <a href=\"%s\" target=\"_blank\">c't</a> that are compliant to the General Data Protection Regulation (GDPR) (Regulation (EU) 2016/679)."
|
||||||
|
msgstr "Es basiert auf den original Shariff-Buttons, die vom Computermagazin <a href=\"%s\" target=\"_blank\">c't</a> entwickelt wurden, die den strengen Regeln der europäischen Datenschutzgrundverordnung (DSGVO) folgen (Verordnung (EU) 2016/679)."
|
||||||
|
|
||||||
|
#. Translators: %1$s and %2$s will be replaced with the correct URLs to the
|
||||||
|
#. authors websites.
|
||||||
|
#: admin/admin-menu.php:1625
|
||||||
|
msgid "The WordPress plugin \"Shariff Wrapper\" has been developed by <a href=\"%1$s\" target=\"_blank\">Jan-Peter Lambeck</a> and <a href=\"%2$s\" target=\"_blank\">3UU</a> in order to help protect the privacy of your visitors. "
|
||||||
|
msgstr "Das WordPress-Plugin „Shariff Wrapper“ wurde von <a href=\"%1$s\" target=\"_blank\">Jan-Peter Lambeck</a> und <a href=\"%2$s\" target=\"_blank\">3UU</a> entwickelt, um die Privatsphäre von Webseitenbesuchern zu schützen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1437
|
||||||
|
msgid "You entered an external API and chose to call it directly! Therefore, all options and features (e.g. the ranking tab) regarding the statistic have no effect. You need to configure them on the external server. Remember: This feature is still experimental!"
|
||||||
|
msgstr "Es wurde eine externe API angegeben und ausgewählt, diese direkt abzurufen! Daher haben viele Optionen und Funktionen (z.B. der Ranglisten-Tab) auf dieser Seite keinen Effekt. Diese müssen auf dem externen Server eingestellt werden. Zur Erinnerung: Diese Funktion ist noch experimentell!"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1435
|
||||||
|
msgid "Warning: "
|
||||||
|
msgstr "Warnung: "
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1302 admin/admin-menu.php:1883
|
||||||
|
msgid "More information about these buttons."
|
||||||
|
msgstr "Weitere Informationen zu diesen Buttons."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1262
|
||||||
|
msgid "This configures the advanced options of Shariff regarding specific services. "
|
||||||
|
msgstr "Dies konfiguriert die erweiterten Optionen von Shariff in Bezug auf bestimmte Dienste. "
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with the correct URL to the wordpress.org
|
||||||
|
#. support forum.
|
||||||
|
#: admin/admin-menu.php:996 admin/admin-menu.php:1269
|
||||||
|
msgid "You should also check out the <a href=\"%s\" target=\"_blank\">Support Forum</a>. "
|
||||||
|
msgstr "Du kannst auch das <a href=\"%s\" target=\"_blank\">Support-Forum</a> aufsuchen."
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with the correct URL to the help section.
|
||||||
|
#: admin/admin-menu.php:992 admin/admin-menu.php:1265
|
||||||
|
msgid "For more information please take a look at the <a href=\"%s\">Help Section</a>. "
|
||||||
|
msgstr " Weitere Informationen findest du im <a href=\"%s\">Hilfeabschnitt</a>. "
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:989
|
||||||
|
msgid "This configures the default design of the Shariff buttons. Most options can be overwritten for single posts or pages with the options within the [shariff] shorttag. "
|
||||||
|
msgstr "Im Folgenden wird das Standarddesign der Shariff-Buttons festgelegt. Die meisten Einstellungen können in einzelnen Beiträgen und auf Seiten mit dem Shorttag [shariff] überschrieben werden."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:389
|
||||||
|
msgid "Disable the metabox."
|
||||||
|
msgstr "Deaktiviere die Metabox."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:299
|
||||||
|
msgid "Custom text for the info button:"
|
||||||
|
msgstr "Individueller Alt-Text für den Info-Button."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:101
|
||||||
|
msgid "Do not affect buttons in widgets."
|
||||||
|
msgstr "Keine Buttons in Widgets beeinflussen."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:95
|
||||||
|
msgid "Ignore Widgets"
|
||||||
|
msgstr "Widgets ignorieren"
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:89
|
||||||
|
msgid "The settings in this shortcode field overwrite ALL global settings."
|
||||||
|
msgstr "Die Einstellungen in diesem Shortcode-Feld überschreiben ALLE globalen Einstellungen."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:89
|
||||||
|
msgid "Shortcode"
|
||||||
|
msgstr "Shortcode"
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:83
|
||||||
|
msgid "The complete url to your desired custom image for Pinterest."
|
||||||
|
msgstr "Die vollständige URL zum gewünschten individuellen Pinterest-Bild."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:83
|
||||||
|
msgid "Pinterest Image"
|
||||||
|
msgstr "Pinterest-Bild"
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:70
|
||||||
|
msgid "Add buttons before this content."
|
||||||
|
msgstr "Buttons vor diesem Inhalt einfügen."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:63
|
||||||
|
msgid "Add Shariff"
|
||||||
|
msgstr "Shariff hinzufügen"
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:57
|
||||||
|
msgid "Disable Shariff for this content."
|
||||||
|
msgstr "Shariff für diesen Inhalt deaktivieren."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:51
|
||||||
|
msgid "Disable Shariff"
|
||||||
|
msgstr "Shariff deaktivieren"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1909
|
||||||
|
msgid "Provides the time the current post or page was last modified as a timestamp. Used for determining the dynamic cache lifespan. Only for special use cases."
|
||||||
|
msgstr "Stelle den Zeitpunkt, an dem der aktuelle Beitrag oder die Seite zuletzt geändert wurde, als Zeitstempel (timestamp) zur Verfügung."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1907
|
||||||
|
msgid "The timestamp of the last modification of the current post or page."
|
||||||
|
msgstr "Zeitstempel (timestamp) der letzten Änderung des aktuellen Beitrags oder Seite."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1741
|
||||||
|
msgid "Determines the button size regardless of theme choice."
|
||||||
|
msgstr "Legt die Buttongröße unabhängig vom gewählten Theme fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1086
|
||||||
|
msgid "large"
|
||||||
|
msgstr "groß"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1085
|
||||||
|
msgid "medium"
|
||||||
|
msgstr "mittel"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1084
|
||||||
|
msgid "small"
|
||||||
|
msgstr "klein"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:483
|
||||||
|
msgid "Disable the dynamic cache lifespan (not recommended)."
|
||||||
|
msgstr "Die dynamische Cache-Lebensdauer deaktivieren (nicht empfohlen)."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:429
|
||||||
|
msgid "Hide share counts when they are zero."
|
||||||
|
msgstr "Zähler (Share Counts) verstecken, wenn sie null sind."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:268
|
||||||
|
msgid "Open links in a popup (requires JavaScript)."
|
||||||
|
msgstr "Links in einem Popup öffnen (erfordert JavaScript)."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:250
|
||||||
|
msgid "Custom CSS <u>class</u> for the container <u>around</u> Shariff:"
|
||||||
|
msgstr "Individuelle CSS-<u>Klasse</u> für den Container <u>um</u> Shariff:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:241
|
||||||
|
msgid "Custom CSS <u>attributes</u> for the container <u>around</u> Shariff:"
|
||||||
|
msgstr "Individuelle CSS-<u>Attribute</u> für den Container <u>um</u> Shariff:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:151
|
||||||
|
msgid "Button size:"
|
||||||
|
msgstr "Button-Größe:"
|
||||||
|
|
||||||
|
#. Translators: %s will be replaced with a service name e.g. Twitter.
|
||||||
|
#: admin/admin-notices.php:46
|
||||||
|
msgid "%s has been selected as a service, but no username, ID or address has been provided! Please enter the required information on the advanced tab!"
|
||||||
|
msgstr "%s wurde als Dienst ausgewählt. Es wurde jedoch keine ID, Adresse oder Benutzername angegeben. Bitte ergänze die notwendigen Angaben unter dem Tab „Erweitert“."
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:30
|
||||||
|
msgid "Shariff Settings"
|
||||||
|
msgstr "Shariff-Einstellungen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:101
|
||||||
|
msgid "Disable the Shariff buttons outside of the main loop."
|
||||||
|
msgstr "Shariff-Buttons außerhalb der Hauptschleife deaktivieren."
|
||||||
|
|
||||||
|
#: shariff.php:541
|
||||||
|
msgid "Once weekly"
|
||||||
|
msgstr "Einmal wöchentlich"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1773
|
||||||
|
msgid "Sets a custom secondary color for all buttons (hexadecimal). The secondary color is, depending on theme, used for hover effects."
|
||||||
|
msgstr "Legt die individuelle Sekundärfarbe für alle Buttons fest (hexadezimal). Die Sekundärfarbe wird, je nach Theme, für Hover-Effekte verwendet."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1765
|
||||||
|
msgid "Sets a custom main color for all buttons (hexadecimal)."
|
||||||
|
msgstr "Legt die individuelle Hauptfarbe für alle Buttons fest (hexadezimal)."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1757
|
||||||
|
msgid "Sets the border radius for the round theme. 1 essentially equals a square."
|
||||||
|
msgstr "Legt den Radius (border-radius) für das runde Theme fest. 1 entspricht einem Quadrat."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:465
|
||||||
|
msgid "Number of posts on ranking tab:"
|
||||||
|
msgstr "Anzahl an Beiträgen auf dem Ranglisten-Reiter:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:456
|
||||||
|
msgid "Fill cache automatically."
|
||||||
|
msgstr "Den Cache automatisch befüllen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:259
|
||||||
|
msgid "Hide buttons until page is fully loaded."
|
||||||
|
msgstr "Buttons verstecken, bis die Seite vollständig geladen wurde."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:187
|
||||||
|
msgid "Custom secondary color for <b>all</b> buttons (hexadecimal):"
|
||||||
|
msgstr "Individuelle Sekundärfarbe für <b>alle</b> Buttons (hexadezimal):"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:178
|
||||||
|
msgid "Custom main color for <b>all</b> buttons (hexadecimal):"
|
||||||
|
msgstr "Individuelle Hauptfarbe für <b>alle</b> Buttons (hexadezimal):"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:169
|
||||||
|
msgid "Border radius for the round theme (1-50):"
|
||||||
|
msgstr "Individueller Radius (border-radius) für das runde Theme (1-50):"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:519
|
||||||
|
msgid "Local API not reachable in root."
|
||||||
|
msgstr "Lokale API nicht über das Stammverzeichnis erreichbar."
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "Jan-Peter Lambeck & 3UU"
|
||||||
|
msgstr "Jan-Peter Lambeck & 3UU"
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Shariff provides share buttons that respect the privacy of your visitors and follow the General Data Protection Regulation (GDPR)."
|
||||||
|
msgstr "Shariff stellt Teilen-Buttons bereit, die die Privatsphäre der Besucher schützen und im Einklang mit der Datenschutzgrundverordnung (DSGVO) stehen."
|
||||||
|
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "https://wordpress.org/plugins/shariff/"
|
||||||
|
msgstr "https://wordpress.org/plugins/shariff/ "
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
msgid "Shariff Wrapper"
|
||||||
|
msgstr "Shariff Wrapper"
|
||||||
|
|
||||||
|
#: includes/class-shariff-widget.php:55
|
||||||
|
msgid "Title"
|
||||||
|
msgstr "Titel"
|
||||||
|
|
||||||
|
#: includes/class-shariff-widget.php:30
|
||||||
|
msgid "Add Shariff as configured on the plugin options page."
|
||||||
|
msgstr "Fügt die Shariff-Buttons mit den Einstellungen aus dem Plugin-Menü ein."
|
||||||
|
|
||||||
|
#: shariff.php:1540
|
||||||
|
msgid "Address for Bitcoin is missing!"
|
||||||
|
msgstr "Adresse für Bitcoin fehlt!"
|
||||||
|
|
||||||
|
#: shariff.php:1536
|
||||||
|
msgid "PayPal.Me ID is missing!"
|
||||||
|
msgstr "PayPal.Me ID fehlt!"
|
||||||
|
|
||||||
|
#: shariff.php:1532
|
||||||
|
msgid "Button ID for PayPal is missing!"
|
||||||
|
msgstr "Button-ID für PayPal fehlt!"
|
||||||
|
|
||||||
|
#: shariff.php:1528
|
||||||
|
msgid "Username for patreon is missing!"
|
||||||
|
msgstr "Benutzername für Patreon fehlt!"
|
||||||
|
|
||||||
|
#: shariff.php:173
|
||||||
|
msgid "Support Forum"
|
||||||
|
msgstr "Support-Forum"
|
||||||
|
|
||||||
|
#: shariff.php:173
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2459
|
||||||
|
msgid "Help"
|
||||||
|
msgstr "Hilfe"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2447
|
||||||
|
msgid "Advanced"
|
||||||
|
msgstr "Erweitert"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2441
|
||||||
|
msgid "Design"
|
||||||
|
msgstr "Design"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2435
|
||||||
|
msgid "Basic"
|
||||||
|
msgstr "Basis"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2144 admin/admin-menu.php:2258
|
||||||
|
#: admin/admin-menu.php:2373
|
||||||
|
msgid "Total"
|
||||||
|
msgstr "Gesamt"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2140 admin/admin-menu.php:2254
|
||||||
|
#: admin/admin-menu.php:2369
|
||||||
|
msgid "Time"
|
||||||
|
msgstr "Zeit"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2139 admin/admin-menu.php:2253
|
||||||
|
#: admin/admin-menu.php:2368
|
||||||
|
msgid "Date"
|
||||||
|
msgstr "Datum"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2138
|
||||||
|
msgid "Post"
|
||||||
|
msgstr "Beitrag"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2137 admin/admin-menu.php:2251
|
||||||
|
#: admin/admin-menu.php:2366
|
||||||
|
msgid "Rank"
|
||||||
|
msgstr "Rang"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2129 admin/admin-menu.php:2243
|
||||||
|
#: admin/admin-menu.php:2357
|
||||||
|
msgid "The statistic option has been disabled on the statistic tab. Share counts will not get updated!"
|
||||||
|
msgstr "Die Statistik-Option wurde unter dem Statistik-Tab deaktiviert. Die Zählerstände werden nicht aktualisiert!"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2127 admin/admin-menu.php:2241
|
||||||
|
#: admin/admin-menu.php:2355
|
||||||
|
msgid "Warning:"
|
||||||
|
msgstr "Warnung:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2120
|
||||||
|
msgid "The following tables shows the ranking of your last 100 posts, pages and, if applicable, products in descending order by total share counts. To prevent slow loading times only cached data is being used. Therefore, you may see blank entries for posts that have not been visited by anyone since the last update or activation of Shariff Wrapper. You can simply visit the respective post yourself in order to have the share counts fetched."
|
||||||
|
msgstr "Die nachfolgende Tabelle zeigt die Rangliste der letzten 100 Beiträge, Seiten und, falls verfügbar, Produkte. Die Einträge sind absteigend nach der Gesamtanzahl an Teilungen sortiert. Um lange Ladezeiten zu vermeiden werden nur im Cache gespeicherte Daten verwendet. Daher können Angaben fehlen, wenn niemand seit der letzten Aktualisierung oder der letzten Aktivierung des Shariff Wrappers den betreffenden Beitrag besucht hat. Es reicht in diesem Fall aus, selbst den jeweiligen Beitrag aufzurufen, um die Abfrage der Zählerstände anzustoßen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2035
|
||||||
|
msgid "The GD Library is not installed on this server. This is only needed for the QR codes, if your are using the bitcoin button."
|
||||||
|
msgstr "Die GD-Library ist auf diesem Server nicht installiert. Diese wird nur für die QR-Codes benötigt, wenn der Bitcoin-Button verwendet wird."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2021
|
||||||
|
msgid "GD Library:"
|
||||||
|
msgstr "GD-Library:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2004
|
||||||
|
msgid "Service didn't respond in less than five seconds."
|
||||||
|
msgstr "Dienst hat nicht innerhalb von fünf Sekunden geantwortet."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:2000
|
||||||
|
msgid "Share Count:"
|
||||||
|
msgstr "Share Count:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1978
|
||||||
|
msgid "One or more services didn't respond in less than five seconds."
|
||||||
|
msgstr "Einer oder mehrere Dienste haben nicht innerhalb von fünf Sekunden geantwortet."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1977 admin/admin-menu.php:2002
|
||||||
|
msgid "Timeout"
|
||||||
|
msgstr "Zeitüberschreitung"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1975
|
||||||
|
msgid "One or more services reported an error."
|
||||||
|
msgstr "Einer oder mehrere Dienste erzeugten eine Fehlermeldung."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1974 admin/admin-menu.php:2007
|
||||||
|
#: admin/admin-menu.php:2034
|
||||||
|
msgid "Error"
|
||||||
|
msgstr "Fehler"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1972
|
||||||
|
msgid "No error messages."
|
||||||
|
msgstr "Keine Fehlermeldungen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1971 admin/admin-menu.php:1999
|
||||||
|
#: admin/admin-menu.php:2027
|
||||||
|
msgid "OK"
|
||||||
|
msgstr "OK"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1941 admin/admin-menu.php:1995
|
||||||
|
msgid "Disabled"
|
||||||
|
msgstr "Deaktiviert"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1935
|
||||||
|
msgid "Statistic:"
|
||||||
|
msgstr "Statistik:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1917
|
||||||
|
msgid "Changes the RSS feed url to another feed."
|
||||||
|
msgstr "Ändert die Feed-URL für den RSS-Button."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1901
|
||||||
|
msgid "Changes the title to share. Only for special use cases."
|
||||||
|
msgstr "Legt den Titel zum Teilen fest. Nur für spezielle Umstände."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1900
|
||||||
|
msgid "My Post Title"
|
||||||
|
msgstr "Mein Beitragstitel"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1899
|
||||||
|
msgid "The title of the current post or page."
|
||||||
|
msgstr "Der Titel des aktuellen Beitrags oder der Seite."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1893
|
||||||
|
msgid "Changes the url to share. Only for special use cases."
|
||||||
|
msgstr "Legt die URL zum Teilen fest. Nur für spezielle Umstände."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1891
|
||||||
|
msgid "The url of the current post or page."
|
||||||
|
msgstr "Die URL des aktuellen Beitrags oder der Seite."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1877
|
||||||
|
msgid "Sets a custom link for the info button."
|
||||||
|
msgstr "Legt einen individuellen Link für den Info-Button fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1869
|
||||||
|
msgid "Determines the default image to share for Pinterest, if no other usable image is found."
|
||||||
|
msgstr "Legt das Standardbild zum Teilen für Pinterest fest, wenn kein anderes Bild gefunden wird."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1867
|
||||||
|
msgid "The post featured image or the first image of the post."
|
||||||
|
msgstr "Das Beitragsbild oder das erste Bild des Beitrags."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1861
|
||||||
|
msgid "Sets the bitcoin address."
|
||||||
|
msgstr "Legt die Bitcoin-Adresse fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1853
|
||||||
|
msgid "Sets the PayPal.Me ID. Default amount can be added with a / e.g. name/25."
|
||||||
|
msgstr "Legt die PayPal.Me ID fest. Standard Betrag kann mit einem / angehängt werden. Zum Beispiel: Name/25."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1845
|
||||||
|
msgid "Sets the PayPal hosted button ID."
|
||||||
|
msgstr "Legt die PayPal Hosted-Button-ID fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1837
|
||||||
|
msgid "Sets the Patreon username."
|
||||||
|
msgstr "Legt den Patreon-Benutzernamen fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1829
|
||||||
|
msgid "Sets the Twitter via tag."
|
||||||
|
msgstr "Bestimmt den Twitter-via-Tag."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1805
|
||||||
|
msgid "Adds a headline above the Shariff buttons. Basic HTML as well as style and class attributes can be used. To remove a headline set on the plugins options page use headline=\"\"."
|
||||||
|
msgstr "Fügt eine Überschrift zu den Shariff-Buttons hinzu. Basis-HTML sowie style- und class-Attribute dürfen verwendet werden. Um eine Überschrift, die in den Plugin-Einstellungen gesetzt wurde, bei einzelnen Widgets zu entfernen, kann headline=\"\" verwendet werden"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1804
|
||||||
|
msgid "Please share this post"
|
||||||
|
msgstr "Bitte teile diesen Beitrag"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1797
|
||||||
|
msgid "Changes the language of the share buttons."
|
||||||
|
msgstr "Stellt die Sprache der Shariff-Buttons ein."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1795
|
||||||
|
msgid "Automatically selected by browser."
|
||||||
|
msgstr "Automatisch durch den Browser bestimmt."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1789
|
||||||
|
msgid "Changes the horizontal alignment of the buttons. flex-start means left, center is obvious and flex-end means right."
|
||||||
|
msgstr "Verändert die horizontale Ausrichtung der Buttons. flex-start bedeutet linksbündig, center ist selbsterklärend und flex-end bedeutet rechtsbündig."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1781
|
||||||
|
msgid "Changes the orientation of the buttons."
|
||||||
|
msgstr "Verändert die Anordnung der Shariff-Buttons."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1733
|
||||||
|
msgid "Determines the main design of the buttons."
|
||||||
|
msgstr "Legt das Hauptdesign der Shariff-Buttons fest."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1725
|
||||||
|
msgid "Enables share counts on the buttons."
|
||||||
|
msgstr "Aktiviert die Statistik (share counts) in den Shariff-Buttons."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1717
|
||||||
|
msgid "Determines which buttons to show and in which order."
|
||||||
|
msgstr "Legt fest, welche Buttons benutzt werden sollen und in welcher Reihenfolge."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1709
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "Beschreibung"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1708
|
||||||
|
msgid "Example"
|
||||||
|
msgstr "Beispiel"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1707
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Standard"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1706
|
||||||
|
msgid "Options"
|
||||||
|
msgstr "Optionen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1705
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Name"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1699
|
||||||
|
msgid "This is a list of all available options for the <code>[shariff]</code> shortcode:"
|
||||||
|
msgstr "Dies ist eine Liste mit allen verfügbaren Optionen für den <code>[shariff]</code> Shortcode:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1603
|
||||||
|
msgid "Please check, if you have correctly set the Access-Control-Allow-Origin header!"
|
||||||
|
msgstr "Bitte überprüfe, ob der Access-Control-Allow-Origin-Header korrekt gesetzt wurde!"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1591
|
||||||
|
msgid "Please check, if you have to add this domain to the array $SHARIFF_FRONTENDS on the external server."
|
||||||
|
msgstr "Bitte überprüfe, ob diese Domain zum Array $SHARIFF_FRONTENDS auf dem externen Server hinzugefügt werden muss."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1583
|
||||||
|
msgid "Warning: This is an experimental feature. Please read the <a href=\"https://wordpress.org/plugins/shariff/faq/\" target=\"_blank\">Frequently Asked Questions (FAQ)</a>."
|
||||||
|
msgstr "Warnung: Dies ist eine experimentelle Funktion. Bitte lies die <a href=\"https://de.wordpress.org/plugins/shariff/#faq\" target=\"_blank\">Häufig gestellten Fragen (FAQ)</a>."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1470
|
||||||
|
msgid "Warning: The statistic functionality must be enabled in order for the share counts to be shown."
|
||||||
|
msgstr "Warnung: Die Statistik-Funktionalität muss aktiviert sein, damit die Zählerstände angezeigt werden können."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1449
|
||||||
|
msgid "WordPress-Version 4.4 or better is required to enable the statistic / share count functionality."
|
||||||
|
msgstr "WordPress-Version 4.4 oder neuer wird benötigt, um die Statistik- / Zähler-Funktionalität zu aktivieren."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1430
|
||||||
|
msgid "This determines how share counts are handled by Shariff."
|
||||||
|
msgstr "Diese Einstellungen bestimmen, wie Shariff mit den sogenannten „Share Counts“ umgeht."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1410
|
||||||
|
msgid "Warning: DO NOT change this unless you know what you are doing or have been told so by the plugin author!"
|
||||||
|
msgstr "Warnung: NICHT verändern, außer die Konsequenzen sind bekannt oder ein Plugin-Autor hat dazu aufgefordert!"
|
||||||
|
|
||||||
|
#: admin/admin-metabox.php:41 admin/admin-metabox.php:84
|
||||||
|
#: admin/admin-menu.php:35 admin/admin-menu.php:1386
|
||||||
|
msgid "Choose image"
|
||||||
|
msgstr "Bild wählen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1350
|
||||||
|
msgid "name"
|
||||||
|
msgstr "Name"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1314 admin/admin-menu.php:1326
|
||||||
|
msgid "username"
|
||||||
|
msgstr "Benutzername"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1219 admin/admin-menu.php:1231
|
||||||
|
msgid "More information in the FAQ."
|
||||||
|
msgstr "Mehr Informationen in der FAQ."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1191
|
||||||
|
msgid "Already shared %total times!"
|
||||||
|
msgstr "Bereits %total Mal geteilt!"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1189
|
||||||
|
msgid "Example:"
|
||||||
|
msgstr "Beispiel:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1187
|
||||||
|
msgid "Basic HTML as well as style and class attributes are allowed. You can use %total to show the total amount of shares."
|
||||||
|
msgstr "Basis-HTML sowie style- und class-Attribute sind erlaubt. Mittels %total kann die Gesamtanzahl an Shares angezeigt werden."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1185
|
||||||
|
msgid "Share this post"
|
||||||
|
msgstr "Teile diesen Beitrag"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1160 admin/admin-menu.php:1173
|
||||||
|
msgid "right"
|
||||||
|
msgstr "rechts"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1159 admin/admin-menu.php:1172
|
||||||
|
msgid "center"
|
||||||
|
msgstr "zentriert"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:1158 admin/admin-menu.php:1171
|
||||||
|
msgid "left"
|
||||||
|
msgstr "links"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:866 admin/admin-menu.php:916
|
||||||
|
msgid "Excerpts"
|
||||||
|
msgstr "Textauszügen (Excerpts)"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:859 admin/admin-menu.php:909
|
||||||
|
msgid "Pages"
|
||||||
|
msgstr "Seiten"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:852 admin/admin-menu.php:902
|
||||||
|
msgid "Posts (blog page)"
|
||||||
|
msgstr "Beiträgen (Blogseite)"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:845 admin/admin-menu.php:895
|
||||||
|
msgid "Posts"
|
||||||
|
msgstr "Beiträgen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:833
|
||||||
|
msgid "Use the pipe sign | (Alt Gr + < or ⌥ + 7) between two or more services."
|
||||||
|
msgstr "Verwende das Pipe-Zeichen | (Alt Gr + < oder ⌥ + 7) als Trennzeichen zwischen den Diensten. "
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:817
|
||||||
|
msgid "Select the desired services in the order you want them to be displayed and where the Shariff buttons should be included automatically."
|
||||||
|
msgstr "Wähle die zu aktivierenden Dienste in der gewünschten Reihenfolge und wo die Shariff-Buttons automatisch eingebunden werden sollen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:550 admin/admin-menu.php:2471
|
||||||
|
msgid "Ranking"
|
||||||
|
msgstr "Rangliste"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:540 admin/admin-menu.php:2465
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Status"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:530
|
||||||
|
msgid "Shariff Help"
|
||||||
|
msgstr "Shariff-Hilfe"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:510
|
||||||
|
msgid "Request external API directly."
|
||||||
|
msgstr "Die externe API direkt kontaktieren."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:501
|
||||||
|
msgid "External API for share counts:"
|
||||||
|
msgstr "Externe API für die Share Counts:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:492
|
||||||
|
msgid "Disable the following services (share counts only):"
|
||||||
|
msgstr "Folgende Dienste deaktivieren (nur Statistik):"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:474
|
||||||
|
msgid "Cache TTL in seconds (60 - 7200):"
|
||||||
|
msgstr "Cache-Lebensdauer (TTL) in Sekunden (60 - 7200):"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:447
|
||||||
|
msgid "Facebook App Secret:"
|
||||||
|
msgstr "Facebook App Secret:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:438
|
||||||
|
msgid "Facebook App ID:"
|
||||||
|
msgstr "Facebook App ID:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:420
|
||||||
|
msgid "Show share counts on buttons."
|
||||||
|
msgstr "Zähler (Share Counts) auf den Buttons anzeigen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:411
|
||||||
|
msgid "Enable statistic."
|
||||||
|
msgstr "Die Statistik aktivieren."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:403 admin/admin-menu.php:2453
|
||||||
|
msgid "Statistic"
|
||||||
|
msgstr "Statistik"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:380
|
||||||
|
msgid "Shortcode priority:"
|
||||||
|
msgstr "Shortcode-Priorität:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:362
|
||||||
|
msgid "Default image for Pinterest:"
|
||||||
|
msgstr "Standardbild für Pinterest:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:353
|
||||||
|
msgid "RSS feed:"
|
||||||
|
msgstr "RSS-Feed:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:344
|
||||||
|
msgid "Bitcoin address:"
|
||||||
|
msgstr "Bitcoin-Adresse:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:335
|
||||||
|
msgid "PayPal.Me ID:"
|
||||||
|
msgstr "PayPal.Me-ID:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:326
|
||||||
|
msgid "PayPal hosted button ID:"
|
||||||
|
msgstr "PayPal Hosted-Button-ID:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:317
|
||||||
|
msgid "Patreon username:"
|
||||||
|
msgstr "Patreon-Benutzername:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:308
|
||||||
|
msgid "Twitter username for the via tag:"
|
||||||
|
msgstr "Twitter-Benutzername für das via-Attribut:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:290
|
||||||
|
msgid "Custom link for the info button:"
|
||||||
|
msgstr "Individueller Link für den Info-Button:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:282
|
||||||
|
msgid "Advanced options"
|
||||||
|
msgstr "Erweiterte Einstellungen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:223
|
||||||
|
msgid "Headline above all Shariff buttons:"
|
||||||
|
msgstr "Überschrift über allen Shariff-Buttons:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:214
|
||||||
|
msgid "Alignment of the Shariff buttons in the widget:"
|
||||||
|
msgstr "Ausrichtung der Shariff-Buttons im Widget:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:205
|
||||||
|
msgid "Alignment of the Shariff buttons:"
|
||||||
|
msgstr "Ausrichtung der Shariff-Buttons:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:196
|
||||||
|
msgid "Shariff button orientation <b>vertical</b>."
|
||||||
|
msgstr "Die Shariff-Buttons <b>vertikal</b> anordnen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:160 admin/admin-menu.php:1749
|
||||||
|
msgid "Stretch buttons horizontally to full width."
|
||||||
|
msgstr "Die Buttons horizontal auf die gesamte Breite strecken."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:142
|
||||||
|
msgid "Shariff button design:"
|
||||||
|
msgstr "Design der Shariff-Buttons:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:119
|
||||||
|
msgid "Design options"
|
||||||
|
msgstr "Designoptionen"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:92
|
||||||
|
msgid "Disable the Shariff buttons on password protected posts."
|
||||||
|
msgstr "Die Buttons bei passwortgeschützten Beiträgen verbergen."
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:83
|
||||||
|
msgid "Add the Shariff buttons <u>before</u> all:"
|
||||||
|
msgstr "Die Shariff-Buttons einfügen <u>vor</u> allen:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:74
|
||||||
|
msgid "Add the Shariff buttons <u>after</u> all:"
|
||||||
|
msgstr "Die Shariff-Buttons einfügen <u>nach</u> allen:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:69
|
||||||
|
msgid "Enable the following services in the provided order:"
|
||||||
|
msgstr "Folgende Dienste in dieser Reihenfolge aktivieren:"
|
||||||
|
|
||||||
|
#: admin/admin-menu.php:63
|
||||||
|
msgid "Basic options"
|
||||||
|
msgstr "Basiseinstellungen"
|
||||||
BIN
wp-content/languages/plugins/updraftplus-de_DE.mo
Normal file
BIN
wp-content/languages/plugins/updraftplus-de_DE.mo
Normal file
Binary file not shown.
5896
wp-content/languages/plugins/updraftplus-de_DE.po
Normal file
5896
wp-content/languages/plugins/updraftplus-de_DE.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
wp-content/languages/themes/twentyeleven-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentyeleven-de_DE.mo
Normal file
Binary file not shown.
617
wp-content/languages/themes/twentyeleven-de_DE.po
Normal file
617
wp-content/languages/themes/twentyeleven-de_DE.po
Normal file
@@ -0,0 +1,617 @@
|
|||||||
|
# Translation of Themes - Twenty Eleven in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Eleven package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-06-17 08:21:48+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Eleven\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom \"Ephemera\" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured \"sticky\" posts), and special styles for six different post formats."
|
||||||
|
msgstr "Das Theme 2011 für WordPress ist leichtgewichtig und anpassbar. Die benutzerdefinierten Menüs, die Header-Grafiken und der Hintergrund können leicht geändert werden. Ebenso gibt es zwei Farbschemata in hell und dunkel. Benutzerdefinierte Farben für Links und drei Layoutvarianten."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Eleven"
|
||||||
|
msgstr "Twenty Eleven"
|
||||||
|
|
||||||
|
#. translators: %s: The post title.
|
||||||
|
#: comments.php:37
|
||||||
|
msgid "One thought on “%1$s”"
|
||||||
|
msgstr "Ein Gedanke zu „%1$s“"
|
||||||
|
|
||||||
|
#: functions.php:127
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:122
|
||||||
|
msgid "Light Gray"
|
||||||
|
msgstr "Hellgrau"
|
||||||
|
|
||||||
|
#: functions.php:117
|
||||||
|
msgid "Medium Gray"
|
||||||
|
msgstr "Mittelgrau"
|
||||||
|
|
||||||
|
#: functions.php:112
|
||||||
|
msgid "Dark Gray"
|
||||||
|
msgstr "Dunkelgrau"
|
||||||
|
|
||||||
|
#: functions.php:107
|
||||||
|
msgid "Black"
|
||||||
|
msgstr "Schwarz"
|
||||||
|
|
||||||
|
#: functions.php:102
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr "Blau"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "Sidebar Template"
|
||||||
|
msgstr "Sidebar-Template"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "Showcase Template"
|
||||||
|
msgstr "Showcase-Template"
|
||||||
|
|
||||||
|
#: tag.php:20
|
||||||
|
msgid "Tag Archives: %s"
|
||||||
|
msgstr "Schlagwort-Archive: %s"
|
||||||
|
|
||||||
|
#: single.php:23
|
||||||
|
msgid "Next <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Weiter <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: single.php:22
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Previous"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Vorherige"
|
||||||
|
|
||||||
|
#: sidebar.php:26
|
||||||
|
msgid "Meta"
|
||||||
|
msgstr "Meta"
|
||||||
|
|
||||||
|
#: sidebar.php:19
|
||||||
|
msgid "Archives"
|
||||||
|
msgstr "Archive"
|
||||||
|
|
||||||
|
#: showcase.php:170
|
||||||
|
msgid "Recent Posts"
|
||||||
|
msgstr "Letzte Beiträge"
|
||||||
|
|
||||||
|
#: showcase.php:160
|
||||||
|
msgid "Featuring: %s"
|
||||||
|
msgstr "Vorgestellt: %s"
|
||||||
|
|
||||||
|
#: showcase.php:83
|
||||||
|
msgid "Featured Post"
|
||||||
|
msgstr "Hervorgehobener Artikel"
|
||||||
|
|
||||||
|
#: searchform.php:11 searchform.php:12 searchform.php:13
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Suchen"
|
||||||
|
|
||||||
|
#: search.php:51
|
||||||
|
msgid "Sorry, but nothing matched your search criteria. Please try again with some different keywords."
|
||||||
|
msgstr "Leider gibt es keine Ergebnisse für deine Suchkriterien. Bitte versuche es noch einmal mit anderen Suchbegriffen."
|
||||||
|
|
||||||
|
#: search.php:18
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: inc/widgets.php:196
|
||||||
|
msgid "Number of posts to show:"
|
||||||
|
msgstr "Anzahl der Beiträge, die angezeigt werden:"
|
||||||
|
|
||||||
|
#: inc/widgets.php:193
|
||||||
|
msgid "Title:"
|
||||||
|
msgstr "Titel:"
|
||||||
|
|
||||||
|
#: inc/widgets.php:117 inc/widgets.php:126
|
||||||
|
msgid "% <span class=\"reply\">comments →</span>"
|
||||||
|
msgstr "% <span class=\"reply\">Kommentare →</span>"
|
||||||
|
|
||||||
|
#: inc/widgets.php:117 inc/widgets.php:126
|
||||||
|
msgid "1 <span class=\"reply\">comment →</span>"
|
||||||
|
msgstr "1 <span class=\"reply\">Kommentar →</span>"
|
||||||
|
|
||||||
|
#: inc/widgets.php:117 inc/widgets.php:126
|
||||||
|
msgid "0 <span class=\"reply\">comments →</span>"
|
||||||
|
msgstr "0 <span class=\"reply\">Kommentare →</span>"
|
||||||
|
|
||||||
|
#: inc/widgets.php:73
|
||||||
|
msgid "Ephemera"
|
||||||
|
msgstr "Ephemera"
|
||||||
|
|
||||||
|
#: inc/widgets.php:23
|
||||||
|
msgid "Twenty Eleven Ephemera"
|
||||||
|
msgstr "Twenty Eleven Ephemera"
|
||||||
|
|
||||||
|
#: inc/widgets.php:26
|
||||||
|
msgid "Use this widget to list your recent Aside, Status, Quote, and Link posts"
|
||||||
|
msgstr "Nutze dieses Widget um deine letzten Kurzmitteilungen, Links, Zitate oder Statusmitteilungen anzuzeigen."
|
||||||
|
|
||||||
|
#: inc/theme-options.php:600
|
||||||
|
msgid "Layout"
|
||||||
|
msgstr "Layout"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:341
|
||||||
|
msgid "%s Theme Options"
|
||||||
|
msgstr "%s Theme-Optionen"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:305
|
||||||
|
msgid "Default color: %s"
|
||||||
|
msgstr "Standardfarbe: %s"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:302
|
||||||
|
msgid "Select a Color"
|
||||||
|
msgstr "Wähle eine Farbe"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:193
|
||||||
|
msgid "One-column, no sidebar"
|
||||||
|
msgstr "Einspaltig, ohne Sidebar"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:188
|
||||||
|
msgid "Content on right"
|
||||||
|
msgstr "Inhalt rechts"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:183
|
||||||
|
msgid "Content on left"
|
||||||
|
msgstr "Inhalt links"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:158
|
||||||
|
msgid "Dark"
|
||||||
|
msgstr "Dunkel"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:152
|
||||||
|
msgid "Light"
|
||||||
|
msgstr "Hell"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:130
|
||||||
|
msgid "Overview"
|
||||||
|
msgstr "Übersicht"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:122
|
||||||
|
msgid "<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support</a>"
|
||||||
|
msgstr "<a href=\"https://de.wordpress.org/support/\" target=\"_blank\">Support-Foren</a>"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:121
|
||||||
|
msgid "<a href=\"https://codex.wordpress.org/Appearance_Theme_Options_Screen\" target=\"_blank\">Documentation on Theme Options</a>"
|
||||||
|
msgstr "<a href=\"https://codex.wordpress.org/Appearance_Theme_Options_Screen\" target=\"_blank\">Documentation on Theme Options (engl.)</a>"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:120
|
||||||
|
msgid "For more information:"
|
||||||
|
msgstr "Für mehr Information:"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:118
|
||||||
|
msgid "Remember to click \"Save Changes\" to save any changes you have made to the theme options."
|
||||||
|
msgstr "Vergiss nicht, zum Schluss auf \"Änderungen übernehmen\" zu klicken."
|
||||||
|
|
||||||
|
#: inc/theme-options.php:116
|
||||||
|
msgid "<strong>Default Layout</strong>: You can choose if you want your site’s default layout to have a sidebar on the left, the right, or not at all."
|
||||||
|
msgstr "<strong>Layout</strong>: Du kannst auswählen, ob die Sidebar auf der rechten Seite, linken Seite oder gar nicht angezeigt werden soll."
|
||||||
|
|
||||||
|
#: inc/theme-options.php:115
|
||||||
|
msgid "<strong>Link Color</strong>: You can choose the color used for text links on your site. You can enter the HTML color or hex code, or you can choose visually by clicking the \"Select a Color\" button to pick from a color wheel."
|
||||||
|
msgstr "<strong>Linkfarbe</strong>: Wähle eine eine Farbe mit der die Links in Artikeln etc. hervorgehoben werden sollen. Du kannst einen hexadezimalen Farbcode eingeben oder mit einem Klick auf die Schaltfläche \"Farbe aussuchen\" dir eine Farbe des Regenbogens aussuchen."
|
||||||
|
|
||||||
|
#: inc/theme-options.php:114
|
||||||
|
msgid "<strong>Color Scheme</strong>: You can choose a color palette of \"Light\" (light background with dark text) or \"Dark\" (dark background with light text) for your site."
|
||||||
|
msgstr "<strong>Farbschema</strong>: Du kannst zwischen einem hellen und dunklen Farbschema auswählen."
|
||||||
|
|
||||||
|
#: inc/theme-options.php:112
|
||||||
|
msgid "Some themes provide customization options that are grouped together on a Theme Options screen. If you change themes, options may change or disappear, as they are theme-specific. Your current theme, Twenty Eleven, provides the following Theme Options:"
|
||||||
|
msgstr "Manche Themes bieten Möglichkeiten zur individuellen Anpassung durch Optionen auf einer speziellen Seite. Wenn du dein Theme wechselst, werden diese Anpassungen verschwinden. Dein aktuelles Theme, Twenty Eleven, bietet folgende Optionen:"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:95 inc/theme-options.php:96
|
||||||
|
msgid "Theme Options"
|
||||||
|
msgstr "Theme-Einstellungen"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:63
|
||||||
|
msgid "Default Layout"
|
||||||
|
msgstr "Layout"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:62 inc/theme-options.php:589
|
||||||
|
msgid "Link Color"
|
||||||
|
msgstr "Linkfarbe"
|
||||||
|
|
||||||
|
#: inc/theme-options.php:56 inc/theme-options.php:564
|
||||||
|
msgid "Color Scheme"
|
||||||
|
msgstr "Farbschema"
|
||||||
|
|
||||||
|
#: image.php:34
|
||||||
|
msgid "<span class=\"meta-prep meta-prep-entry-date\">Published </span> <span class=\"entry-date\"><abbr class=\"published\" title=\"%1$s\">%2$s</abbr></span> at <a href=\"%3$s\" title=\"Link to full-size image\">%4$s × %5$s</a> in <a href=\"%6$s\" title=\"Return to %7$s\" rel=\"gallery\">%8$s</a>"
|
||||||
|
msgstr "<span class=\"meta-prep meta-prep-entry-date\">Veröffentlicht </span> <span class=\"entry-date\"><abbr class=\"published\" title=\"%1$s\">%2$s</abbr></span> mit <a href=\"%3$s\" title=\"Link zum Originalbild\">%4$s × %5$s</a> in <a href=\"%6$s\" title=\"zurück zu %7$s\" rel=\"gallery\">%8$s</a>"
|
||||||
|
|
||||||
|
#: image.php:23
|
||||||
|
msgid "Next →"
|
||||||
|
msgstr "Weiter →"
|
||||||
|
|
||||||
|
#: image.php:22
|
||||||
|
msgid "← Previous"
|
||||||
|
msgstr "← Zurück"
|
||||||
|
|
||||||
|
#: image.php:21
|
||||||
|
msgid "Image navigation"
|
||||||
|
msgstr "Bilder-Navigation"
|
||||||
|
|
||||||
|
#: header.php:147
|
||||||
|
msgid "Skip to secondary content"
|
||||||
|
msgstr "Zum sekundären Inhalt wechseln"
|
||||||
|
|
||||||
|
#: header.php:145
|
||||||
|
msgid "Skip to primary content"
|
||||||
|
msgstr "Zum Inhalt wechseln"
|
||||||
|
|
||||||
|
#: header.php:143
|
||||||
|
msgid "Main menu"
|
||||||
|
msgstr "Hauptmenü"
|
||||||
|
|
||||||
|
#: header.php:45
|
||||||
|
msgid "Page %s"
|
||||||
|
msgstr "Seite %s"
|
||||||
|
|
||||||
|
#: functions.php:787
|
||||||
|
msgid "<span class=\"sep\">Posted on </span><a href=\"%1$s\" title=\"%2$s\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"%3$s\">%4$s</time></a><span class=\"by-author\"> <span class=\"sep\"> by </span> <span class=\"author vcard\"><a class=\"url fn n\" href=\"%5$s\" title=\"%6$s\" rel=\"author\">%7$s</a></span></span>"
|
||||||
|
msgstr "<span class=\"sep\">Veröffentlicht am </span><a href=\"%1$s\" title=\"%2$s\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"%3$s\">%4$s</time></a><span class=\"by-author\"> <span class=\"sep\"> von </span> <span class=\"author vcard\"><a class=\"url fn n\" href=\"%5$s\" title=\"%6$s\" rel=\"author\">%7$s</a></span></span>"
|
||||||
|
|
||||||
|
#: functions.php:761
|
||||||
|
msgid "Reply <span>↓</span>"
|
||||||
|
msgstr "Kommentiere <span>↓</span>"
|
||||||
|
|
||||||
|
#: functions.php:747
|
||||||
|
msgid "Your comment is awaiting moderation."
|
||||||
|
msgstr "Dein Kommentar wartet auf Freischaltung."
|
||||||
|
|
||||||
|
#. translators: 1: date, 2: time
|
||||||
|
#: functions.php:738
|
||||||
|
msgid "%1$s at %2$s"
|
||||||
|
msgstr "%1$s um %2$s"
|
||||||
|
|
||||||
|
#: functions.php:731
|
||||||
|
msgid "%1$s on %2$s <span class=\"says\">said:</span>"
|
||||||
|
msgstr "%1$s sagte am %2$s <span class=\"says\">:</span>"
|
||||||
|
|
||||||
|
#: functions.php:712
|
||||||
|
msgid "Pingback:"
|
||||||
|
msgstr "Pingback:"
|
||||||
|
|
||||||
|
#: functions.php:607
|
||||||
|
msgid "Newer posts <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Neuere Beiträge <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: functions.php:606
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Older posts"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Ältere Beiträge"
|
||||||
|
|
||||||
|
#: single.php:21 functions.php:605
|
||||||
|
msgid "Post navigation"
|
||||||
|
msgstr "Beitrags-Navigation"
|
||||||
|
|
||||||
|
#: functions.php:579
|
||||||
|
msgid "Footer Area Three"
|
||||||
|
msgstr "Fußzeile, dritter Bereich"
|
||||||
|
|
||||||
|
#: functions.php:567
|
||||||
|
msgid "Footer Area Two"
|
||||||
|
msgstr "Fußzeile, zweiter Bereich"
|
||||||
|
|
||||||
|
#: functions.php:557 functions.php:569 functions.php:581
|
||||||
|
msgid "An optional widget area for your site footer"
|
||||||
|
msgstr "Ein optionaler Widget-Bereich in der Fußzeile deiner Website"
|
||||||
|
|
||||||
|
#: functions.php:555
|
||||||
|
msgid "Footer Area One"
|
||||||
|
msgstr "Fußzeile, erster Bereich"
|
||||||
|
|
||||||
|
#: functions.php:545
|
||||||
|
msgid "The sidebar for the optional Showcase Template"
|
||||||
|
msgstr "Die Sidebar für das Seitentemplate \"Showcase\""
|
||||||
|
|
||||||
|
#: functions.php:543
|
||||||
|
msgid "Showcase Sidebar"
|
||||||
|
msgstr "Showcase Sidebar"
|
||||||
|
|
||||||
|
#: functions.php:532
|
||||||
|
msgid "Main Sidebar"
|
||||||
|
msgstr "Haupt-Seitenleiste"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:280
|
||||||
|
msgid "Hanoi Plant"
|
||||||
|
msgstr "Äste"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:274
|
||||||
|
msgid "Willow"
|
||||||
|
msgstr "Weide"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:268
|
||||||
|
msgid "Lanterns"
|
||||||
|
msgstr "Lampions"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:262
|
||||||
|
msgid "Chessboard"
|
||||||
|
msgstr "Schachbrett"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:256
|
||||||
|
msgid "Pine Cone"
|
||||||
|
msgstr "Pinienzapfen"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:250
|
||||||
|
msgid "Trolley"
|
||||||
|
msgstr "Straßenbahn"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:244
|
||||||
|
msgid "Shore"
|
||||||
|
msgstr "Küste"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:238
|
||||||
|
msgid "Wheel"
|
||||||
|
msgstr "Rad"
|
||||||
|
|
||||||
|
#: functions.php:144
|
||||||
|
msgid "Primary Menu"
|
||||||
|
msgstr "Primäres Menü"
|
||||||
|
|
||||||
|
#: footer.php:35
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: footer.php:34
|
||||||
|
msgid "Semantic Personal Publishing Platform"
|
||||||
|
msgstr "Semantic Personal Publishing Platform"
|
||||||
|
|
||||||
|
#: content.php:16
|
||||||
|
msgid "Featured"
|
||||||
|
msgstr "Hervorgehoben"
|
||||||
|
|
||||||
|
#: content-status.php:19
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Status"
|
||||||
|
|
||||||
|
#: content-single.php:74
|
||||||
|
msgid "View all posts by %s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Zeige alle Beiträge von %s <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: content-single.php:46
|
||||||
|
msgid "This entry was posted by <a href=\"%6$s\">%5$s</a>. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Eintrag wurde von <a href=\"%6$s\">%5$s</a> veröffentlicht. Lesezeichen zum <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Artikel setzen</a>."
|
||||||
|
|
||||||
|
#: content-single.php:44
|
||||||
|
msgid "This entry was posted in %1$s by <a href=\"%6$s\">%5$s</a>. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Eintrag wurde veröffentlicht in %1$s von <a href=\"%6$s\">%5$s</a>. <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permanenter Link des Eintrags</a>."
|
||||||
|
|
||||||
|
#: content-single.php:42
|
||||||
|
msgid "This entry was posted in %1$s and tagged %2$s by <a href=\"%6$s\">%5$s</a>. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Eintrag wurde veröffentlicht in %1$s und verschlagwortet mit %2$s von <a href=\"%6$s\">%5$s</a>. <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permanenter Link zum Eintrag</a>."
|
||||||
|
|
||||||
|
#: content-quote.php:15
|
||||||
|
msgid "Quote"
|
||||||
|
msgstr "Zitat"
|
||||||
|
|
||||||
|
#: content-link.php:19
|
||||||
|
msgid "Link"
|
||||||
|
msgstr "Link"
|
||||||
|
|
||||||
|
#: content-image.php:49 functions.php:793
|
||||||
|
msgid "View all posts by %s"
|
||||||
|
msgstr "Zeige alle Artikel von %s"
|
||||||
|
|
||||||
|
#: content-image.php:44
|
||||||
|
msgid "<a href=\"%1$s\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"%2$s\">%3$s</time></a><span class=\"by-author\"> <span class=\"sep\"> by </span> <span class=\"author vcard\"><a class=\"url fn n\" href=\"%4$s\" title=\"%5$s\" rel=\"author\">%6$s</a></span></span>"
|
||||||
|
msgstr "<a href=\"%1$s\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"%2$s\">%3$s</time></a><span class=\"by-author\"> <span class=\"sep\"> von </span> <span class=\"author vcard\"><a class=\"url fn n\" href=\"%4$s\" title=\"%5$s\" rel=\"author\">%6$s</a></span></span>"
|
||||||
|
|
||||||
|
#: content-image.php:18
|
||||||
|
msgid "Image"
|
||||||
|
msgstr "Bild"
|
||||||
|
|
||||||
|
#: content-gallery.php:93 content-image.php:70 content-quote.php:71
|
||||||
|
#: content.php:80
|
||||||
|
msgid "<span class=\"%1$s\">Tagged</span> %2$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Verschlagwortet mit</span> %2$s"
|
||||||
|
|
||||||
|
#: content-gallery.php:78 content-image.php:61 content-quote.php:56
|
||||||
|
#: content.php:63
|
||||||
|
msgid "<span class=\"%1$s\">Posted in</span> %2$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Veröffentlicht unter</span> %2$s"
|
||||||
|
|
||||||
|
#: content-gallery.php:50 showcase.php:128
|
||||||
|
msgid "Permalink to %s"
|
||||||
|
msgstr "Permanentlink zu %s"
|
||||||
|
|
||||||
|
#: content-gallery.php:49
|
||||||
|
msgid "This gallery contains <a %1$s>%2$s photo</a>."
|
||||||
|
msgid_plural "This gallery contains <a %1$s>%2$s photos</a>."
|
||||||
|
msgstr[0] "Diese Galerie enthält <a %1$s>%2$s Foto</a>."
|
||||||
|
msgstr[1] "Diese Galerie enthält <a %1$s>%2$s Fotos</a>."
|
||||||
|
|
||||||
|
#: content-gallery.php:19
|
||||||
|
msgid "Gallery"
|
||||||
|
msgstr "Galerie"
|
||||||
|
|
||||||
|
#: content-featured.php:40
|
||||||
|
msgid "This entry was posted in %1$s. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Beitrag wurde unter %1$s veröffentlicht. Setze ein Lesezeichen auf den <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permalink</a>."
|
||||||
|
|
||||||
|
#: content-featured.php:38
|
||||||
|
msgid "This entry was posted in %1$s and tagged %2$s. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Beitrag wurde unter %1$s abgelegt und mit %2$s verschlagwortet. Setze ein Lesezeichen auf den <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permalink</a>."
|
||||||
|
|
||||||
|
#. translators: used between list items, there is a space after the comma
|
||||||
|
#: content-gallery.php:73 content-gallery.php:85 content-image.php:57
|
||||||
|
#: content-image.php:66 content-single.php:37 content-single.php:40
|
||||||
|
#: content-quote.php:51 content-quote.php:63 content-featured.php:36
|
||||||
|
#: content-featured.php:45 content.php:58 content.php:72
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#: content-gallery.php:106 content-aside.php:53 content-status.php:66
|
||||||
|
#: content-image.php:79 content-single.php:59 content-link.php:53
|
||||||
|
#: content-intro.php:26 content-page.php:28 content-quote.php:84 image.php:45
|
||||||
|
#: functions.php:712 functions.php:743 content-featured.php:52 content.php:94
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#: content-gallery.php:103 content-aside.php:51 content-status.php:64
|
||||||
|
#: content-image.php:75 content-link.php:51 content-quote.php:81
|
||||||
|
#: showcase.php:214 content.php:91
|
||||||
|
msgid "<b>%</b> Replies"
|
||||||
|
msgstr "<b>%</b> Kommentare"
|
||||||
|
|
||||||
|
#: content-gallery.php:103 content-aside.php:51 content-status.php:64
|
||||||
|
#: content-image.php:75 content-link.php:51 content-quote.php:81
|
||||||
|
#: showcase.php:214 content.php:91
|
||||||
|
msgid "<b>1</b> Reply"
|
||||||
|
msgstr "<b>1</b> Kommentar"
|
||||||
|
|
||||||
|
#: content-gallery.php:103 content-aside.php:51 content-status.php:64
|
||||||
|
#: content-image.php:75 content-link.php:51 content-quote.php:81
|
||||||
|
#: showcase.php:214 content.php:91
|
||||||
|
msgid "Leave a reply"
|
||||||
|
msgstr "Schreibe eine Antwort"
|
||||||
|
|
||||||
|
#: content-gallery.php:61 content-aside.php:39 content-status.php:52
|
||||||
|
#: content-image.php:33 content-single.php:27 content-link.php:39
|
||||||
|
#: content-intro.php:21 content-page.php:21 content-quote.php:39 image.php:119
|
||||||
|
#: content-featured.php:26 content.php:45
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#: content-gallery.php:34 content-aside.php:35 content-status.php:48
|
||||||
|
#: content-image.php:29 content-link.php:35 content-quote.php:35
|
||||||
|
#: functions.php:459 content.php:41
|
||||||
|
msgid "Continue reading <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Weiterlesen <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: content-aside.php:24 content-status.php:24 content-image.php:23
|
||||||
|
#: content-link.php:24 content-quote.php:24 content.php:30
|
||||||
|
msgctxt "comments number"
|
||||||
|
msgid "%"
|
||||||
|
msgstr "%"
|
||||||
|
|
||||||
|
#: content-aside.php:24 content-status.php:24 content-image.php:23
|
||||||
|
#: content-link.php:24 content-quote.php:24 content.php:30
|
||||||
|
msgctxt "comments number"
|
||||||
|
msgid "1"
|
||||||
|
msgstr "1"
|
||||||
|
|
||||||
|
#: content-aside.php:24 content-status.php:24 content-image.php:23
|
||||||
|
#: content-link.php:24 content-quote.php:24 content.php:30
|
||||||
|
msgid "Reply"
|
||||||
|
msgstr "Antworten"
|
||||||
|
|
||||||
|
#: content-aside.php:19
|
||||||
|
msgid "Aside"
|
||||||
|
msgstr "Kurzmitteilung"
|
||||||
|
|
||||||
|
#: comments.php:87
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#: comments.php:55 comments.php:76
|
||||||
|
msgid "Newer Comments →"
|
||||||
|
msgstr "Neuere Kommentare →"
|
||||||
|
|
||||||
|
#: comments.php:54 comments.php:75
|
||||||
|
msgid "← Older Comments"
|
||||||
|
msgstr "← Ältere Kommentare"
|
||||||
|
|
||||||
|
#: comments.php:53 comments.php:74
|
||||||
|
msgid "Comment navigation"
|
||||||
|
msgstr "Kommentar-Navigation"
|
||||||
|
|
||||||
|
#. translators: %1$s: The number of comments. %2$s: The post title.
|
||||||
|
#: comments.php:43
|
||||||
|
msgid "%1$s thought on “%2$s”"
|
||||||
|
msgid_plural "%1$s thoughts on “%2$s”"
|
||||||
|
msgstr[0] "Ein Gedanke zu „%2$s“"
|
||||||
|
msgstr[1] "%1$s Gedanken zu „%2$s“"
|
||||||
|
|
||||||
|
#: comments.php:17
|
||||||
|
msgid "This post is password protected. Enter the password to view any comments."
|
||||||
|
msgstr "Dieser Beitrag ist passwortgeschützt. Um Kommentare anschauen zu können musst du das Passwort angeben."
|
||||||
|
|
||||||
|
#: category.php:20
|
||||||
|
msgid "Category Archives: %s"
|
||||||
|
msgstr "Archiv der Kategorie: %s"
|
||||||
|
|
||||||
|
#: content-single.php:70 author.php:61
|
||||||
|
msgid "About %s"
|
||||||
|
msgstr "Über %s"
|
||||||
|
|
||||||
|
#: author.php:29
|
||||||
|
msgid "Author Archives: %s"
|
||||||
|
msgstr "Archiv des Autors: %s"
|
||||||
|
|
||||||
|
#: archive.php:64 index.php:44 tag.php:69 category.php:68 author.php:94
|
||||||
|
msgid "Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post."
|
||||||
|
msgstr "In diesem Archiv wurden keine Ergebnisse gefunden, vielleicht hilft die Suchfunktion weiter."
|
||||||
|
|
||||||
|
#: archive.php:60 index.php:40 tag.php:65 search.php:47 category.php:64
|
||||||
|
#: author.php:90
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Es konnte nichts gefunden werden."
|
||||||
|
|
||||||
|
#: archive.php:31
|
||||||
|
msgid "Blog Archives"
|
||||||
|
msgstr "Blog-Archive"
|
||||||
|
|
||||||
|
#: archive.php:29
|
||||||
|
msgctxt "yearly archives date format"
|
||||||
|
msgid "Y"
|
||||||
|
msgstr "Y"
|
||||||
|
|
||||||
|
#: archive.php:29
|
||||||
|
msgid "Yearly Archives: %s"
|
||||||
|
msgstr "Archiv für das Jahr: %s"
|
||||||
|
|
||||||
|
#: archive.php:27
|
||||||
|
msgctxt "monthly archives date format"
|
||||||
|
msgid "F Y"
|
||||||
|
msgstr "F Y"
|
||||||
|
|
||||||
|
#: archive.php:27
|
||||||
|
msgid "Monthly Archives: %s"
|
||||||
|
msgstr "Archiv für den Monat: %s"
|
||||||
|
|
||||||
|
#: archive.php:25
|
||||||
|
msgid "Daily Archives: %s"
|
||||||
|
msgstr "Archiv für den Tag: %s"
|
||||||
|
|
||||||
|
#. translators: %1$s: smilie
|
||||||
|
#: 404.php:46
|
||||||
|
msgid "Try looking in the monthly archives. %1$s"
|
||||||
|
msgstr "Versuchs mit einem Blick in die monatlichen Archive. %1$s"
|
||||||
|
|
||||||
|
#: 404.php:28
|
||||||
|
msgid "Most Used Categories"
|
||||||
|
msgstr "Oft verwendete Kategorien"
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching, or one of the links below, can help."
|
||||||
|
msgstr "Entschuldige bitte, aber das was du gesucht hast, konnte nicht gefunden werden. Nutze doch die Suchfunktion oder ein paar der weiter unten angebotenen Möglichkeiten, um das Gewünschte zu finden."
|
||||||
|
|
||||||
|
#: 404.php:17
|
||||||
|
msgid "This is somewhat embarrassing, isn’t it?"
|
||||||
|
msgstr "Ups, diesen Inhalt gibt es wohl nicht."
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:34
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentyeleven/"
|
||||||
|
msgstr "https://de.wordpress.org/themes/twentyeleven/"
|
||||||
BIN
wp-content/languages/themes/twentyfifteen-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentyfifteen-de_DE.mo
Normal file
Binary file not shown.
339
wp-content/languages/themes/twentyfifteen-de_DE.po
Normal file
339
wp-content/languages/themes/twentyfifteen-de_DE.po
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
# Translation of Themes - Twenty Fifteen in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Fifteen package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-01-29 05:14:01+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Fifteen\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "Our 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer."
|
||||||
|
msgstr "Unser Standard-Theme für 2015 ist reduziert, stellt das Bloggen in den Mittelpunkt und ist auf ein klares Erscheinungsbild ausgerichtet. Twenty Fifteens einfache, gradlinige Typografie lässt sich in verschiedenen Bildschirmauflösungen und zahlreichen Sprachen gut lesen. Wir sind bei unserem Design primär von mobilen Endgeräten ausgegangen, so dass deine Inhalte im Mittelpunkt stehen – ganz gleich, ob deine Besucher die Seiten mit einem Smartphone, Tablet, Laptop oder Desktop-Computer ansehen."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Fifteen"
|
||||||
|
msgstr "Twenty Fifteen"
|
||||||
|
|
||||||
|
#: functions.php:243
|
||||||
|
msgid "Light Blue"
|
||||||
|
msgstr "Hellblau"
|
||||||
|
|
||||||
|
#: functions.php:238
|
||||||
|
msgid "Bright Blue"
|
||||||
|
msgstr "Hellblau"
|
||||||
|
|
||||||
|
#: functions.php:193
|
||||||
|
msgid "Light Gray"
|
||||||
|
msgstr "Hellblau"
|
||||||
|
|
||||||
|
#: functions.php:188
|
||||||
|
msgid "Dark Gray"
|
||||||
|
msgstr "Dunkelgrau"
|
||||||
|
|
||||||
|
#: functions.php:208
|
||||||
|
msgid "Dark Brown"
|
||||||
|
msgstr "Dunkelbraun"
|
||||||
|
|
||||||
|
#: functions.php:198
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:218
|
||||||
|
msgid "Light Pink"
|
||||||
|
msgstr "Helles Pink"
|
||||||
|
|
||||||
|
#: functions.php:213
|
||||||
|
msgid "Medium Pink"
|
||||||
|
msgstr "Mittleres Pink"
|
||||||
|
|
||||||
|
#: functions.php:233
|
||||||
|
msgid "Blue Gray"
|
||||||
|
msgstr "Blau-Grau"
|
||||||
|
|
||||||
|
#: functions.php:223
|
||||||
|
msgid "Dark Purple"
|
||||||
|
msgstr "Dunkles Lila"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: comments.php:31
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "One thought on “%s”"
|
||||||
|
msgstr "Ein Gedanke zu „%s“"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: inc/template-tags.php:130
|
||||||
|
msgid "Leave a comment<span class=\"screen-reader-text\"> on %s</span>"
|
||||||
|
msgstr "Schreibe einen Kommentar<span class=\"screen-reader-text\"> zu %s</span>"
|
||||||
|
|
||||||
|
#: single.php:39
|
||||||
|
msgid "Previous post:"
|
||||||
|
msgstr "Vorheriger Beitrag:"
|
||||||
|
|
||||||
|
#: single.php:38
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Zurück"
|
||||||
|
|
||||||
|
#: single.php:36
|
||||||
|
msgid "Next post:"
|
||||||
|
msgstr "Nächster Beitrag:"
|
||||||
|
|
||||||
|
#: single.php:35
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Weiter"
|
||||||
|
|
||||||
|
#: search.php:18
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:120
|
||||||
|
msgctxt "Used before full size attachment link."
|
||||||
|
msgid "Full size"
|
||||||
|
msgstr "Volle Größe"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:108
|
||||||
|
msgctxt "Used before tag names."
|
||||||
|
msgid "Tags"
|
||||||
|
msgstr "Schlagwörter"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:99
|
||||||
|
msgctxt "Used before category names."
|
||||||
|
msgid "Categories"
|
||||||
|
msgstr "Kategorien"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:95 inc/template-tags.php:104
|
||||||
|
msgctxt "Used between list items, there is a space after the comma."
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#: inc/template-tags.php:89
|
||||||
|
msgctxt "Used before post author name."
|
||||||
|
msgid "Author"
|
||||||
|
msgstr "Autor"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:79
|
||||||
|
msgctxt "Used before publish date."
|
||||||
|
msgid "Posted on"
|
||||||
|
msgstr "Veröffentlicht am"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:56
|
||||||
|
msgctxt "Used before post format."
|
||||||
|
msgid "Format"
|
||||||
|
msgstr "Format"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:49
|
||||||
|
msgid "Featured"
|
||||||
|
msgstr "Hervorgehoben"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:30
|
||||||
|
msgid "Newer Comments"
|
||||||
|
msgstr "Neuere Kommentare"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:26
|
||||||
|
msgid "Older Comments"
|
||||||
|
msgstr "Ältere Kommentare"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:23
|
||||||
|
msgid "Comment navigation"
|
||||||
|
msgstr "Kommentar-Navigation"
|
||||||
|
|
||||||
|
#: inc/customizer.php:237
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr "Blau"
|
||||||
|
|
||||||
|
#: functions.php:228 inc/customizer.php:226
|
||||||
|
msgid "Purple"
|
||||||
|
msgstr "Violett"
|
||||||
|
|
||||||
|
#: inc/customizer.php:215
|
||||||
|
msgid "Pink"
|
||||||
|
msgstr "Pink"
|
||||||
|
|
||||||
|
#: functions.php:203 inc/customizer.php:204
|
||||||
|
msgid "Yellow"
|
||||||
|
msgstr "Gelb"
|
||||||
|
|
||||||
|
#: inc/customizer.php:193
|
||||||
|
msgid "Dark"
|
||||||
|
msgstr "Dunkel"
|
||||||
|
|
||||||
|
#: inc/customizer.php:182
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Standard"
|
||||||
|
|
||||||
|
#: inc/customizer.php:103
|
||||||
|
msgid "Header and Sidebar Background Color"
|
||||||
|
msgstr "Header- und Seitenleisten-Hintergrundfarbe"
|
||||||
|
|
||||||
|
#: inc/customizer.php:79 inc/customizer.php:104 inc/customizer.php:111
|
||||||
|
msgid "Applied to the header on small screens and the sidebar on wide screens."
|
||||||
|
msgstr "Das Header-Bild wird bei diesem Theme bei kleinen Bildschirmen (Mobil-Geräte) auf den Header angewandt und bei großen Bildschirmen (Desktop) auf die Seitenleiste."
|
||||||
|
|
||||||
|
#: inc/customizer.php:78
|
||||||
|
msgid "Header and Sidebar Text Color"
|
||||||
|
msgstr "Header- und Seitenleisten-Textfarbe"
|
||||||
|
|
||||||
|
#: inc/customizer.php:55
|
||||||
|
msgid "Base Color Scheme"
|
||||||
|
msgstr "Basis-Farbschema"
|
||||||
|
|
||||||
|
#: inc/back-compat.php:37 inc/back-compat.php:48 inc/back-compat.php:64
|
||||||
|
msgid "Twenty Fifteen requires at least WordPress version 4.1. You are running version %s. Please upgrade and try again."
|
||||||
|
msgstr "Twenty Fifteen erfordert mindestens WordPress in der Version 4.1. Du benutzt Version %s. Bitte aktualisiere dein WordPress und versuche es noch einmal."
|
||||||
|
|
||||||
|
#: image.php:88
|
||||||
|
msgctxt "Parent post link"
|
||||||
|
msgid "<span class=\"meta-nav\">Published in</span><span class=\"post-title\">%title</span>"
|
||||||
|
msgstr "<span class=\"meta-nav\">Veröffentlicht in</span><span class=\"post-title\">%title</span>"
|
||||||
|
|
||||||
|
#: image.php:25
|
||||||
|
msgid "Next Image"
|
||||||
|
msgstr "Nächstes Bild"
|
||||||
|
|
||||||
|
#: image.php:25
|
||||||
|
msgid "Previous Image"
|
||||||
|
msgstr "Vorheriges Bild"
|
||||||
|
|
||||||
|
#: header.php:49
|
||||||
|
msgid "Menu and widgets"
|
||||||
|
msgstr "Menü und Widgets"
|
||||||
|
|
||||||
|
#: header.php:26
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Springe zum Inhalt"
|
||||||
|
|
||||||
|
#: functions.php:399
|
||||||
|
msgid "collapse child menu"
|
||||||
|
msgstr "Untermenü verbergen"
|
||||||
|
|
||||||
|
#: functions.php:398
|
||||||
|
msgid "expand child menu"
|
||||||
|
msgstr "Untermenü anzeigen"
|
||||||
|
|
||||||
|
#: functions.php:319
|
||||||
|
msgctxt "Add new subset (greek, cyrillic, devanagari, vietnamese)"
|
||||||
|
msgid "no-subset"
|
||||||
|
msgstr "no-subset"
|
||||||
|
|
||||||
|
#: functions.php:311
|
||||||
|
msgctxt "Inconsolata font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:303
|
||||||
|
msgctxt "Noto Serif font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:295
|
||||||
|
msgctxt "Noto Sans font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:268
|
||||||
|
msgid "Add widgets here to appear in your sidebar."
|
||||||
|
msgstr "Widgets hier hinzufügen, um sie in die Seitenleiste einzubauen."
|
||||||
|
|
||||||
|
#: functions.php:266
|
||||||
|
msgid "Widget Area"
|
||||||
|
msgstr "Widgetbereich"
|
||||||
|
|
||||||
|
#: functions.php:87
|
||||||
|
msgid "Social Links Menu"
|
||||||
|
msgstr "Social-Links-Menü"
|
||||||
|
|
||||||
|
#: functions.php:86
|
||||||
|
msgid "Primary Menu"
|
||||||
|
msgstr "Primäres Menü"
|
||||||
|
|
||||||
|
#: footer.php:31
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: content-none.php:31
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: content-none.php:26
|
||||||
|
msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords."
|
||||||
|
msgstr "Entschuldigung, aber zu deinen Suchbegriffen wurde nichts passendes gefunden. Bitte versuche es mit anderen Stichworten noch einmal."
|
||||||
|
|
||||||
|
#: content-none.php:22
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%1$s\">Get started here</a>."
|
||||||
|
msgstr "Bereit, um deinen ersten Beitrag zu veröffentlichen? <a href=\"%1$s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: content-none.php:15
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Nichts gefunden"
|
||||||
|
|
||||||
|
#: content-page.php:37 content.php:61 content-search.php:28
|
||||||
|
#: content-search.php:33 image.php:74 content-link.php:60
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#: content-page.php:26 content.php:41 image.php:61 content-link.php:39
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: content.php:34 inc/template-tags.php:249 content-link.php:32
|
||||||
|
msgid "Continue reading %s"
|
||||||
|
msgstr "%s weiterlesen"
|
||||||
|
|
||||||
|
#: comments.php:71
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#. translators: 1: number of comments, 2: post title
|
||||||
|
#: comments.php:35
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "%1$s thought on “%2$s”"
|
||||||
|
msgid_plural "%1$s thoughts on “%2$s”"
|
||||||
|
msgstr[0] "Ein Gedanke zu „%2$s“"
|
||||||
|
msgstr[1] "%1$s Gedanken zu „%2$s“"
|
||||||
|
|
||||||
|
#: author-bio.php:34
|
||||||
|
msgid "View all posts by %s"
|
||||||
|
msgstr "Zeige alle Beiträge von %s"
|
||||||
|
|
||||||
|
#: author-bio.php:12
|
||||||
|
msgid "Published by"
|
||||||
|
msgstr "Veröffentlicht von"
|
||||||
|
|
||||||
|
#: content-page.php:30 content.php:45 image.php:65 search.php:43 archive.php:53
|
||||||
|
#: index.php:50 content-link.php:43
|
||||||
|
msgid "Page"
|
||||||
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#: search.php:42 archive.php:52 index.php:49
|
||||||
|
msgid "Next page"
|
||||||
|
msgstr "Nächste Seite"
|
||||||
|
|
||||||
|
#: search.php:41 archive.php:51 index.php:48
|
||||||
|
msgid "Previous page"
|
||||||
|
msgstr "Vorherige Seite"
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "It looks like nothing was found at this location. Maybe try a search?"
|
||||||
|
msgstr "Wie es aussieht, wurde an dieser Stelle nichts gefunden. Möchtest du eine Suche starten?"
|
||||||
|
|
||||||
|
#: 404.php:17
|
||||||
|
msgid "Oops! That page can’t be found."
|
||||||
|
msgstr "Die Seite konnte nicht gefunden werden."
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentyfifteen/"
|
||||||
|
msgstr "https://wordpress.org/themes/twentyfifteen/"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:30
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
BIN
wp-content/languages/themes/twentyfourteen-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentyfourteen-de_DE.mo
Normal file
Binary file not shown.
475
wp-content/languages/themes/twentyfourteen-de_DE.po
Normal file
475
wp-content/languages/themes/twentyfourteen-de_DE.po
Normal file
@@ -0,0 +1,475 @@
|
|||||||
|
# Translation of Themes - Twenty Fourteen in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Fourteen package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-06-23 16:27:18+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Fourteen\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "In 2014, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier."
|
||||||
|
msgstr "In 2014 lässt dich unser Standard-Theme eine adaptive Magazin-Website mit einem schnittigen, modernen Design erstellen. Präsentiere deine wichtigsten Beiträge entweder in einem Raster oder einem Slider. Passe deine Website mit drei Widget-Bereichen an deine Bedürfnisse an und verändere das Layout deiner Inhalte mit einem Seiten-Template, welches die gesamte Seitenbreite nutzt oder mit einem Template für eine Autoren-Seite."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
#: inc/customizer.php:159
|
||||||
|
msgid "Twenty Fourteen"
|
||||||
|
msgstr "Twenty Fourteen"
|
||||||
|
|
||||||
|
#: functions.php:112
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:107
|
||||||
|
msgid "Light Gray"
|
||||||
|
msgstr "Hellgrau"
|
||||||
|
|
||||||
|
#: functions.php:102
|
||||||
|
msgid "Medium Gray"
|
||||||
|
msgstr "Mittelgrau"
|
||||||
|
|
||||||
|
#: functions.php:97
|
||||||
|
msgid "Dark Gray"
|
||||||
|
msgstr "Dunkelgrau"
|
||||||
|
|
||||||
|
#: functions.php:92
|
||||||
|
msgid "Black"
|
||||||
|
msgstr "Schwarz"
|
||||||
|
|
||||||
|
#: functions.php:87
|
||||||
|
msgid "Green"
|
||||||
|
msgstr "Grün"
|
||||||
|
|
||||||
|
#. translators: 1: number of comments, 2: post title
|
||||||
|
#: comments.php:34
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "%1$s thought on “%2$s”"
|
||||||
|
msgid_plural "%1$s thoughts on “%2$s”"
|
||||||
|
msgstr[0] "%1$s Gedanke zu „%2$s“"
|
||||||
|
msgstr[1] "%1$s Gedanken zu „%2$s“"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: comments.php:30
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "One thought on “%s”"
|
||||||
|
msgstr "Ein Gedanke zu „%s“"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "Full Width Page"
|
||||||
|
msgstr "Seite in ganzer Breite"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "Contributor Page"
|
||||||
|
msgstr "Autoren-Seite"
|
||||||
|
|
||||||
|
#: tag.php:22
|
||||||
|
msgid "Tag Archives: %s"
|
||||||
|
msgstr "Schlagwort-Archive: %s"
|
||||||
|
|
||||||
|
#: search.php:18
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: inc/widgets.php:292
|
||||||
|
msgid "Post format to show:"
|
||||||
|
msgstr "Beitragsformat, das genutzt wird:"
|
||||||
|
|
||||||
|
#: inc/widgets.php:289
|
||||||
|
msgid "Number of posts to show:"
|
||||||
|
msgstr "Anzahl der Beiträge, die angezeigt werden:"
|
||||||
|
|
||||||
|
#: inc/widgets.php:286
|
||||||
|
msgid "Title:"
|
||||||
|
msgstr "Titel:"
|
||||||
|
|
||||||
|
#. translators: used with More archives link
|
||||||
|
#: inc/widgets.php:237
|
||||||
|
msgid "%s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "%s <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: inc/widgets.php:192
|
||||||
|
msgid "This gallery contains <a href=\"%1$s\" rel=\"bookmark\">%2$s photo</a>."
|
||||||
|
msgid_plural "This gallery contains <a href=\"%1$s\" rel=\"bookmark\">%2$s photos</a>."
|
||||||
|
msgstr[0] "Diese Galerie enthält <a href=\"%1$s\" rel=\"bookmark\">%2$s Foto</a>."
|
||||||
|
msgstr[1] "Diese Galerie enthält <a href=\"%1$s\" rel=\"bookmark\">%2$s Fotos</a>."
|
||||||
|
|
||||||
|
#: inc/widgets.php:153 inc/widgets.php:202
|
||||||
|
msgid "Continue reading <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Weiterlesen <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: inc/widgets.php:104
|
||||||
|
msgid "More asides"
|
||||||
|
msgstr "Mehr Kurzmitteilungen"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:30 inc/widgets.php:103
|
||||||
|
msgid "Asides"
|
||||||
|
msgstr "Kurzmitteilungen"
|
||||||
|
|
||||||
|
#: inc/widgets.php:99
|
||||||
|
msgid "More galleries"
|
||||||
|
msgstr "Weitere Galerien"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:48 inc/widgets.php:98
|
||||||
|
msgid "Galleries"
|
||||||
|
msgstr "Galerien"
|
||||||
|
|
||||||
|
#: inc/widgets.php:95
|
||||||
|
msgid "More links"
|
||||||
|
msgstr "Mehr Links"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:45 inc/widgets.php:94
|
||||||
|
msgid "Links"
|
||||||
|
msgstr "Links"
|
||||||
|
|
||||||
|
#: inc/widgets.php:91
|
||||||
|
msgid "More quotes"
|
||||||
|
msgstr "Mehr Zitate"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:42 inc/widgets.php:90
|
||||||
|
msgid "Quotes"
|
||||||
|
msgstr "Zitate"
|
||||||
|
|
||||||
|
#: inc/widgets.php:87
|
||||||
|
msgid "More audio"
|
||||||
|
msgstr "Mehr Audio"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:39 inc/widgets.php:86
|
||||||
|
msgid "Audio"
|
||||||
|
msgstr "Audio"
|
||||||
|
|
||||||
|
#: inc/widgets.php:83
|
||||||
|
msgid "More videos"
|
||||||
|
msgstr "Mehr Videos"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:36 inc/widgets.php:82
|
||||||
|
msgid "Videos"
|
||||||
|
msgstr "Videos"
|
||||||
|
|
||||||
|
#: inc/widgets.php:79
|
||||||
|
msgid "More images"
|
||||||
|
msgstr "Mehr Bilder"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:33 inc/widgets.php:78
|
||||||
|
msgid "Images"
|
||||||
|
msgstr "Bilder"
|
||||||
|
|
||||||
|
#: inc/widgets.php:38
|
||||||
|
msgid "Use this widget to list your recent Aside, Quote, Video, Audio, Image, Gallery, and Link posts."
|
||||||
|
msgstr "Nutze dieses Widget, um deine aktuellsten Kurzmitteilungen, Zitate, Videos, Audios, Bilder, Galerien und Links aufzulisten."
|
||||||
|
|
||||||
|
#: inc/widgets.php:35
|
||||||
|
msgid "Twenty Fourteen Ephemera"
|
||||||
|
msgstr "Twenty Fourteen Ephemera"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:111
|
||||||
|
msgid "Sticky"
|
||||||
|
msgstr "Oben halten"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:94
|
||||||
|
msgid "<span class=\"meta-nav\">Next Post</span>%title"
|
||||||
|
msgstr "<span class=\"meta-nav\">Nächster Beitrag</span>%title"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:93
|
||||||
|
msgid "<span class=\"meta-nav\">Previous Post</span>%title"
|
||||||
|
msgstr "<span class=\"meta-nav\">Vorheriger Beitrag</span>%title"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:91
|
||||||
|
msgid "<span class=\"meta-nav\">Published In</span>%title"
|
||||||
|
msgstr "<span class=\"meta-nav\">Veröffentlicht in</span>%title"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:87
|
||||||
|
msgid "Post navigation"
|
||||||
|
msgstr "Beitrags-Navigation"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:60
|
||||||
|
msgid "Posts navigation"
|
||||||
|
msgstr "Beitrags-Navigation"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:52
|
||||||
|
msgid "Next →"
|
||||||
|
msgstr "Weiter →"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:51
|
||||||
|
msgid "← Previous"
|
||||||
|
msgstr "← Zurück"
|
||||||
|
|
||||||
|
#: inc/featured-content.php:422
|
||||||
|
msgid "Don’t display tag on front end."
|
||||||
|
msgstr "Schlagwort nicht auf der Website anzeigen."
|
||||||
|
|
||||||
|
#: inc/featured-content.php:414
|
||||||
|
msgid "Tag Name"
|
||||||
|
msgstr "Schlagwort-Bezeichnung"
|
||||||
|
|
||||||
|
#: inc/customizer.php:164
|
||||||
|
msgid "For an in-depth tutorial, and more tips and tricks, visit the <a href=\"%s\">Twenty Fourteen documentation</a>."
|
||||||
|
msgstr "Besuche die <a href=\"%s\">Twenty Fourteen Dokumentation</a> für ein mehr in die Tiefe gehendes Tutorial und weitere Tipps und Tricks."
|
||||||
|
|
||||||
|
#: inc/customizer.php:163
|
||||||
|
msgid "Enhance your site design by using <a href=\"%s\">Featured Images</a> for posts you’d like to stand out (also known as post thumbnails). This allows you to associate an image with your post without inserting it. Twenty Fourteen uses featured images for posts and pages—above the title—and in the Featured Content area on the home page."
|
||||||
|
msgstr "Mit <a href=\"%s\">Beitragsbildern</a> kannst du die Gestaltung deiner Website aufwerten. So lässt sich einem Beitrag ein Bild zuordnen, ohne es einzufügen. Twenty Fourteen nutzt Beitragsbilder für Beiträge und Seiten – oberhalb des Titels – und im Bereich für hervorgehobene Inhalte auf der Startseite."
|
||||||
|
|
||||||
|
#: inc/customizer.php:162
|
||||||
|
msgid "The home page features your choice of up to 6 posts prominently displayed in a grid or slider, controlled by a <a href=\"%1$s\">tag</a>; you can change the tag and layout in <a href=\"%2$s\">Appearance → Customize</a>. If no posts match the tag, <a href=\"%3$s\">sticky posts</a> will be displayed instead."
|
||||||
|
msgstr "Die Startseite stellt deine Auswahl von bis zu 6 Beiträgen anhand eines <a href=\"%1$s\">Schlagworts</a> prominent in einem Raster oder Slider dar; Schlagwort und Layout kannst du unter <a href=\"%2$s\">Design > Customizer</a> ändern. Wenn dem Schlagwort noch kein Beitrag zugeordnet ist, werden stattdessen <a href=\"%3$s\">oben gehaltene Beiträge</a> dargestellt."
|
||||||
|
|
||||||
|
#: inc/customizer.php:89
|
||||||
|
msgid "Slider"
|
||||||
|
msgstr "Slider"
|
||||||
|
|
||||||
|
#: inc/customizer.php:88
|
||||||
|
msgid "Grid"
|
||||||
|
msgstr "Raster"
|
||||||
|
|
||||||
|
#: inc/customizer.php:84
|
||||||
|
msgid "Layout"
|
||||||
|
msgstr "Layout"
|
||||||
|
|
||||||
|
#: inc/featured-content.php:384 inc/featured-content.php:396
|
||||||
|
#: inc/featured-content.php:462 inc/customizer.php:64 inc/customizer.php:162
|
||||||
|
msgctxt "featured content default tag slug"
|
||||||
|
msgid "featured"
|
||||||
|
msgstr "featured"
|
||||||
|
|
||||||
|
#: inc/featured-content.php:383 inc/customizer.php:63
|
||||||
|
msgid "Use a <a href=\"%1$s\">tag</a> to feature your posts. If no posts match the tag, <a href=\"%2$s\">sticky posts</a> will be displayed instead."
|
||||||
|
msgstr "Verwende ein <a href=\"%1$s\">Schlagwort</a>, um deinen Beitrag hervorzuheben. Wenn kein Beitrag mit dem entsprechenden Schlagwort versehen ist, werden statt dessen <a href=\"%2$s\">oben gehaltene Beiträge</a> angezeigt."
|
||||||
|
|
||||||
|
#: inc/featured-content.php:381 inc/customizer.php:61
|
||||||
|
msgid "Featured Content"
|
||||||
|
msgstr "Hervorgehobener Inhalt"
|
||||||
|
|
||||||
|
#: inc/customizer.php:53 inc/customizer.php:54
|
||||||
|
msgid "Background may only be visible on wide screens."
|
||||||
|
msgstr "Der Hintergrund ist nur auf großen Bildschirmen sichtbar."
|
||||||
|
|
||||||
|
#: inc/customizer.php:50 inc/customizer.php:51
|
||||||
|
msgid "May only be visible on wide screens."
|
||||||
|
msgstr "Nur auf großen Bildschirmen sichtbar."
|
||||||
|
|
||||||
|
#: inc/customizer.php:46
|
||||||
|
msgid "Display Site Title & Tagline"
|
||||||
|
msgstr "Titel & Untertitel der Website anzeigen"
|
||||||
|
|
||||||
|
#: inc/customizer.php:43
|
||||||
|
msgid "Site Title Color"
|
||||||
|
msgstr "Website-Titelfarbe"
|
||||||
|
|
||||||
|
#: inc/back-compat.php:37 inc/back-compat.php:48 inc/back-compat.php:64
|
||||||
|
msgid "Twenty Fourteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again."
|
||||||
|
msgstr "Twenty Fourteen setzt mindestens WordPress in der Version 3.6 voraus. Du nutzt Version %s. Bitte aktualisiere und probiere es dann nochmal."
|
||||||
|
|
||||||
|
#: image.php:69
|
||||||
|
msgid "Next Image"
|
||||||
|
msgstr "Nächstes Bild"
|
||||||
|
|
||||||
|
#: image.php:68
|
||||||
|
msgid "Previous Image"
|
||||||
|
msgstr "Vorheriges Bild"
|
||||||
|
|
||||||
|
#: header.php:54
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Springe zum Inhalt"
|
||||||
|
|
||||||
|
#: header.php:53
|
||||||
|
msgid "Primary Menu"
|
||||||
|
msgstr "Primäres Menü"
|
||||||
|
|
||||||
|
#: header.php:49
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Suchen"
|
||||||
|
|
||||||
|
#: functions.php:625
|
||||||
|
msgid "Page %s"
|
||||||
|
msgstr "Seite %s"
|
||||||
|
|
||||||
|
#: functions.php:506
|
||||||
|
msgid "%d Article"
|
||||||
|
msgid_plural "%d Articles"
|
||||||
|
msgstr[0] "%d Beitrag"
|
||||||
|
msgstr[1] "%d Beiträge"
|
||||||
|
|
||||||
|
#: functions.php:347
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Weiter"
|
||||||
|
|
||||||
|
#: functions.php:346
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Zurück"
|
||||||
|
|
||||||
|
#: functions.php:295
|
||||||
|
msgctxt "Lato font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:272
|
||||||
|
msgid "Appears in the footer section of the site."
|
||||||
|
msgstr "Erscheint im Footer-Bereich der Website."
|
||||||
|
|
||||||
|
#: functions.php:270
|
||||||
|
msgid "Footer Widget Area"
|
||||||
|
msgstr "Footer-Bereich"
|
||||||
|
|
||||||
|
#: functions.php:261
|
||||||
|
msgid "Additional sidebar that appears on the right."
|
||||||
|
msgstr "Zusätzliche Seitenleiste, die rechts erscheint. "
|
||||||
|
|
||||||
|
#: functions.php:259
|
||||||
|
msgid "Content Sidebar"
|
||||||
|
msgstr "Inhalts-Seitenleiste"
|
||||||
|
|
||||||
|
#: functions.php:250
|
||||||
|
msgid "Main sidebar that appears on the left."
|
||||||
|
msgstr "Haupt-Seitenleiste, die links erscheint."
|
||||||
|
|
||||||
|
#: functions.php:248
|
||||||
|
msgid "Primary Sidebar"
|
||||||
|
msgstr "Primäre Seitenleiste"
|
||||||
|
|
||||||
|
#: functions.php:131
|
||||||
|
msgid "Secondary menu in left sidebar"
|
||||||
|
msgstr "Sekundäres Menü in der linken Seitenleiste"
|
||||||
|
|
||||||
|
#: functions.php:130
|
||||||
|
msgid "Top primary menu"
|
||||||
|
msgstr "Oberes primäres Menü"
|
||||||
|
|
||||||
|
#: footer.php:27
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: content-none.php:27
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: content-none.php:22
|
||||||
|
msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords."
|
||||||
|
msgstr "Entschuldigung, aber zu deinen Suchbegriffen wurde nichts passendes gefunden. Bitte versuche es mit anderen Stichworten noch einmal."
|
||||||
|
|
||||||
|
#: content-none.php:18
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%1$s\">Get started here</a>."
|
||||||
|
msgstr "Bereit, um deinen ersten Beitrag zu veröffentlichen? <a href=\"%1$s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: content-none.php:12
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Nichts gefunden"
|
||||||
|
|
||||||
|
#: content-audio.php:56 content.php:65 content-gallery.php:56
|
||||||
|
#: content-video.php:56 content-quote.php:56 content-page.php:23
|
||||||
|
#: content-link.php:56 content-image.php:56 image.php:56 content-aside.php:56
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: content-audio.php:49 content.php:58 content-gallery.php:49
|
||||||
|
#: content-video.php:49 content-quote.php:49 content-link.php:49
|
||||||
|
#: content-image.php:49 content-aside.php:49 inc/template-tags.php:229
|
||||||
|
msgid "Continue reading %s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "%s weiterlesen <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: content-audio.php:40 content.php:43 content-gallery.php:40
|
||||||
|
#: content-video.php:40 content-quote.php:40 content-page.php:30
|
||||||
|
#: page-templates/contributors.php:36 content-link.php:40 content-image.php:40
|
||||||
|
#: image.php:35 content-aside.php:40
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#: content-audio.php:37 content.php:39 content-gallery.php:37
|
||||||
|
#: content-video.php:37 content-quote.php:37 content-link.php:37
|
||||||
|
#: content-image.php:37 content-aside.php:37 inc/widgets.php:225
|
||||||
|
msgid "% Comments"
|
||||||
|
msgstr "% Kommentare"
|
||||||
|
|
||||||
|
#: content-audio.php:37 content.php:39 content-gallery.php:37
|
||||||
|
#: content-video.php:37 content-quote.php:37 content-link.php:37
|
||||||
|
#: content-image.php:37 content-aside.php:37 inc/widgets.php:225
|
||||||
|
msgid "1 Comment"
|
||||||
|
msgstr "1 Kommentar"
|
||||||
|
|
||||||
|
#: content-audio.php:37 content.php:39 content-gallery.php:37
|
||||||
|
#: content-video.php:37 content-quote.php:37 content-link.php:37
|
||||||
|
#: content-image.php:37 content-aside.php:37 inc/widgets.php:225
|
||||||
|
msgid "Leave a comment"
|
||||||
|
msgstr "Schreibe einen Kommentar"
|
||||||
|
|
||||||
|
#: content-audio.php:17 content.php:19 content-gallery.php:17
|
||||||
|
#: content-video.php:17 content-quote.php:17 content-featured-post.php:28
|
||||||
|
#: content-link.php:17 content-image.php:17 content-aside.php:17
|
||||||
|
msgctxt "Used between list items, there is a space after the comma."
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#: comments.php:77
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#: comments.php:52 comments.php:72
|
||||||
|
msgid "Newer Comments →"
|
||||||
|
msgstr "Neuere Kommentare →"
|
||||||
|
|
||||||
|
#: comments.php:51 comments.php:71
|
||||||
|
msgid "← Older Comments"
|
||||||
|
msgstr "← Ältere Kommentare"
|
||||||
|
|
||||||
|
#: comments.php:50 comments.php:70
|
||||||
|
msgid "Comment navigation"
|
||||||
|
msgstr "Kommentar-Navigation"
|
||||||
|
|
||||||
|
#: category.php:20
|
||||||
|
msgid "Category Archives: %s"
|
||||||
|
msgstr "Archiv der Kategorie: %s"
|
||||||
|
|
||||||
|
#: author.php:31
|
||||||
|
msgid "All posts by %s"
|
||||||
|
msgstr "Alle Beiträge von %s"
|
||||||
|
|
||||||
|
#: archive.php:40 taxonomy-post_format.php:51
|
||||||
|
msgid "Archives"
|
||||||
|
msgstr "Archive"
|
||||||
|
|
||||||
|
#: archive.php:37
|
||||||
|
msgctxt "yearly archives date format"
|
||||||
|
msgid "Y"
|
||||||
|
msgstr "Y"
|
||||||
|
|
||||||
|
#: archive.php:37
|
||||||
|
msgid "Yearly Archives: %s"
|
||||||
|
msgstr "Archiv für das Jahr: %s"
|
||||||
|
|
||||||
|
#: archive.php:34
|
||||||
|
msgctxt "monthly archives date format"
|
||||||
|
msgid "F Y"
|
||||||
|
msgstr "F Y"
|
||||||
|
|
||||||
|
#: archive.php:34
|
||||||
|
msgid "Monthly Archives: %s"
|
||||||
|
msgstr "Archiv für den Monat: %s"
|
||||||
|
|
||||||
|
#: archive.php:31
|
||||||
|
msgid "Daily Archives: %s"
|
||||||
|
msgstr "Archiv für den Tag: %s"
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "It looks like nothing was found at this location. Maybe try a search?"
|
||||||
|
msgstr "Wie es aussieht, wurde an dieser Stelle nichts gefunden. Möglicherweise hilft eine Suche?"
|
||||||
|
|
||||||
|
#: 404.php:17
|
||||||
|
msgid "Not Found"
|
||||||
|
msgstr "Nichts gefunden"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:26
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentyfourteen/"
|
||||||
|
msgstr "https://de.wordpress.org/themes/twentyfourteen/"
|
||||||
BIN
wp-content/languages/themes/twentynineteen-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentynineteen-de_DE.mo
Normal file
Binary file not shown.
389
wp-content/languages/themes/twentynineteen-de_DE.po
Normal file
389
wp-content/languages/themes/twentynineteen-de_DE.po
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
# Translation of Themes - Twenty Nineteen in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Nineteen package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-06-12 22:36:20+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Nineteen\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes."
|
||||||
|
msgstr "Unser 2019 Standard-Theme wurde entwickelt, um die Leistungsfähigkeit des Block-Editors zu demonstrieren. Es bietet benutzerdefinierte Stile für alle Standardblöcke und ist so aufgebaut, dass du das, was du im Editor siehst, auch auf deiner Website sehen wirst. Twenty Nineteen wurde entwickelt, um sich an eine Vielzahl von Websites anzupassen, egal du einen Fotoblog betreibst, ein neues Unternehmen startest oder eine gemeinnützige Organisation unterstützt. Mit reichlich Whitespace und modernen serifenlosen Überschriften, gepaart mit klassischem serifenbetontem Fließtext wird es auf allen Bildschirmgrößen schön aussehen."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Nineteen"
|
||||||
|
msgstr "Twenty Nineteen"
|
||||||
|
|
||||||
|
#. translators: %s: parent post link
|
||||||
|
#: single.php:31
|
||||||
|
msgid "<span class=\"meta-nav\">Published in</span><span class=\"post-title\">%s</span>"
|
||||||
|
msgstr "<span class=\"meta-nav\">Veröffentlicht in</span><span class=\"post-title\">%s</span>"
|
||||||
|
|
||||||
|
#: image.php:87
|
||||||
|
msgctxt "Parent post link"
|
||||||
|
msgid "<span class=\"meta-nav\">Published in</span><br><span class=\"post-title\">%title</span>"
|
||||||
|
msgstr "<span class=\"meta-nav\">Veröffentlicht in</span><br><span class=\"post-title\">%title</span>"
|
||||||
|
|
||||||
|
#: template-parts/content/content.php:18
|
||||||
|
#: template-parts/content/content-excerpt.php:18
|
||||||
|
msgctxt "post"
|
||||||
|
msgid "Featured"
|
||||||
|
msgstr "Hervorgehoben"
|
||||||
|
|
||||||
|
#: inc/back-compat.php:39 inc/back-compat.php:53 inc/back-compat.php:73
|
||||||
|
msgid "Twenty Nineteen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again."
|
||||||
|
msgstr "Twenty Nineteen erfordert mindestens WordPress Version 4.7. Deine Version ist %s. Bitte führe ein Upgrade durch und versuche es erneut."
|
||||||
|
|
||||||
|
#: inc/template-functions.php:216
|
||||||
|
msgid "Back"
|
||||||
|
msgstr "Zurück"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:209
|
||||||
|
msgid "More"
|
||||||
|
msgstr "Mehr"
|
||||||
|
|
||||||
|
#: inc/customizer.php:98
|
||||||
|
msgid "Apply a filter to featured images using the primary color"
|
||||||
|
msgstr "Für hervorgehobene Bilder einen Filter unter Benutzung der Primärfarbe anwenden"
|
||||||
|
|
||||||
|
#: inc/customizer.php:78
|
||||||
|
msgid "Apply a custom color for buttons, links, featured images, etc."
|
||||||
|
msgstr "Für Buttons, Links, hervorgehobene Bilder etc. eine individuelle Farbe anwenden"
|
||||||
|
|
||||||
|
#: inc/customizer.php:56
|
||||||
|
msgctxt "primary color"
|
||||||
|
msgid "Custom"
|
||||||
|
msgstr "Individuell"
|
||||||
|
|
||||||
|
#: inc/customizer.php:55
|
||||||
|
msgctxt "primary color"
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Standard"
|
||||||
|
|
||||||
|
#: functions.php:166
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:161
|
||||||
|
msgid "Light Gray"
|
||||||
|
msgstr "Hellgrau"
|
||||||
|
|
||||||
|
#: functions.php:156
|
||||||
|
msgid "Dark Gray"
|
||||||
|
msgstr "Dunkelgrau"
|
||||||
|
|
||||||
|
#: functions.php:151
|
||||||
|
msgid "Secondary"
|
||||||
|
msgstr "Sekundär"
|
||||||
|
|
||||||
|
#: functions.php:134
|
||||||
|
msgid "XL"
|
||||||
|
msgstr "XL"
|
||||||
|
|
||||||
|
#: functions.php:133
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr "Riesig"
|
||||||
|
|
||||||
|
#: functions.php:128
|
||||||
|
msgid "L"
|
||||||
|
msgstr "L"
|
||||||
|
|
||||||
|
#: functions.php:127
|
||||||
|
msgid "Large"
|
||||||
|
msgstr "Groß"
|
||||||
|
|
||||||
|
#: functions.php:122
|
||||||
|
msgid "M"
|
||||||
|
msgstr "M"
|
||||||
|
|
||||||
|
#: functions.php:121
|
||||||
|
msgid "Normal"
|
||||||
|
msgstr "Normal"
|
||||||
|
|
||||||
|
#: functions.php:115
|
||||||
|
msgid "Small"
|
||||||
|
msgstr "Klein"
|
||||||
|
|
||||||
|
#: functions.php:116
|
||||||
|
msgid "S"
|
||||||
|
msgstr "S"
|
||||||
|
|
||||||
|
#: functions.php:60 footer.php:37
|
||||||
|
msgid "Footer Menu"
|
||||||
|
msgstr "Footer-Menü"
|
||||||
|
|
||||||
|
#: image.php:70
|
||||||
|
msgctxt "Used before full size attachment link."
|
||||||
|
msgid "Full size"
|
||||||
|
msgstr "Vollständige Größe"
|
||||||
|
|
||||||
|
#: image.php:56
|
||||||
|
msgid "Page"
|
||||||
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#: functions.php:190
|
||||||
|
msgid "Add widgets here to appear in your footer."
|
||||||
|
msgstr "Füge hier Widgets hinzu, die in deinem Footer erscheinen sollen."
|
||||||
|
|
||||||
|
#: functions.php:188 template-parts/footer/footer-widgets.php:12
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Footer"
|
||||||
|
|
||||||
|
#: inc/customizer.php:53
|
||||||
|
msgid "Primary Color"
|
||||||
|
msgstr "Primäre Farbe"
|
||||||
|
|
||||||
|
#: template-parts/post/discussion-meta.php:18
|
||||||
|
msgid "No comments"
|
||||||
|
msgstr "Keine Kommentare"
|
||||||
|
|
||||||
|
#. translators: %1(X comments)$s
|
||||||
|
#: template-parts/post/discussion-meta.php:16
|
||||||
|
msgid "%d Comment"
|
||||||
|
msgid_plural "%d Comments"
|
||||||
|
msgstr[0] "%d Kommentar"
|
||||||
|
msgstr[1] "%d Kommentare"
|
||||||
|
|
||||||
|
#: template-parts/post/author-bio.php:26
|
||||||
|
msgid "View more posts"
|
||||||
|
msgstr "Mehr Beiträge anzeigen"
|
||||||
|
|
||||||
|
#. translators: %s: post author
|
||||||
|
#: template-parts/post/author-bio.php:17
|
||||||
|
msgid "Published by %s"
|
||||||
|
msgstr "Veröffentlicht von %s"
|
||||||
|
|
||||||
|
#: template-parts/header/site-branding.php:33
|
||||||
|
msgid "Top Menu"
|
||||||
|
msgstr "Oberes Menü"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post. Only visible to screen readers
|
||||||
|
#: template-parts/content/content.php:36
|
||||||
|
#: template-parts/content/content-single.php:27
|
||||||
|
msgid "Continue reading<span class=\"screen-reader-text\"> \"%s\"</span>"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">\"%s\"</span> weiterlesen"
|
||||||
|
|
||||||
|
#: image.php:52 template-parts/content/content-page.php:27
|
||||||
|
#: template-parts/content/content.php:49
|
||||||
|
#: template-parts/content/content-single.php:40
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#: template-parts/content/content-none.php:46
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: template-parts/content/content-none.php:39
|
||||||
|
msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords."
|
||||||
|
msgstr "Es gibt keine passenden Suchergebnisse. Bitte versuche es mit anderen Suchbegriffen."
|
||||||
|
|
||||||
|
#. translators: 1: link to WP admin new post page.
|
||||||
|
#: template-parts/content/content-none.php:26
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%1$s\">Get started here</a>."
|
||||||
|
msgstr "Bereit, deinen ersten Beitrag zu veröffentlichen? <a href=\"%1$s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: template-parts/content/content-none.php:16
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Nichts gefunden"
|
||||||
|
|
||||||
|
#: single.php:42
|
||||||
|
msgid "Previous post:"
|
||||||
|
msgstr "Vorheriger Beitrag:"
|
||||||
|
|
||||||
|
#: single.php:41
|
||||||
|
msgid "Previous Post"
|
||||||
|
msgstr "Vorheriger Beitrag"
|
||||||
|
|
||||||
|
#: single.php:39
|
||||||
|
msgid "Next post:"
|
||||||
|
msgstr "Nächster Beitrag:"
|
||||||
|
|
||||||
|
#: single.php:38
|
||||||
|
msgid "Next Post"
|
||||||
|
msgstr "Nächster Beitrag"
|
||||||
|
|
||||||
|
#: search.php:22
|
||||||
|
msgid "Search results for:"
|
||||||
|
msgstr "Suchergebnisse für:"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:234
|
||||||
|
msgid "Older posts"
|
||||||
|
msgstr "Ältere Beiträge"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:230
|
||||||
|
msgid "Newer posts"
|
||||||
|
msgstr "Neuere Beiträge"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:104
|
||||||
|
msgid "Tags:"
|
||||||
|
msgstr "Schlagwörter:"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:92
|
||||||
|
msgid "Posted in"
|
||||||
|
msgstr "Veröffentlicht in"
|
||||||
|
|
||||||
|
#. translators: used between list items, there is a space after the comma.
|
||||||
|
#: inc/template-tags.php:86 inc/template-tags.php:98
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post. Only visible to screen readers.
|
||||||
|
#: inc/template-tags.php:63
|
||||||
|
msgid "Leave a comment<span class=\"screen-reader-text\"> on %s</span>"
|
||||||
|
msgstr "Veröffentliche einen Kommentar <span class=\"screen-reader-text\">zu %s</span>"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:46
|
||||||
|
msgid "Posted by"
|
||||||
|
msgstr "Veröffentlicht von"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:82
|
||||||
|
msgctxt "monthly archives date format"
|
||||||
|
msgid "F Y"
|
||||||
|
msgstr "F Y"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:80
|
||||||
|
msgctxt "yearly archives date format"
|
||||||
|
msgid "Y"
|
||||||
|
msgstr "Y"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:92
|
||||||
|
msgid "Archives:"
|
||||||
|
msgstr "Archive:"
|
||||||
|
|
||||||
|
#. translators: %s: Taxonomy singular name
|
||||||
|
#: inc/template-functions.php:90
|
||||||
|
msgid "%s Archives:"
|
||||||
|
msgstr "%s-Archive:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:86
|
||||||
|
msgid "Post Type Archives: "
|
||||||
|
msgstr "Archive für Inhaltstypen:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:84
|
||||||
|
msgid "Daily Archives: "
|
||||||
|
msgstr "Tägliche Archive:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:82
|
||||||
|
msgid "Monthly Archives: "
|
||||||
|
msgstr "Monatliche Archive:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:80
|
||||||
|
msgid "Yearly Archives: "
|
||||||
|
msgstr "Jährliche Archive:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:78
|
||||||
|
msgid "Author Archives: "
|
||||||
|
msgstr "Autor-Archive:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:76
|
||||||
|
msgid "Tag Archives: "
|
||||||
|
msgstr "Schlagwort-Archive:"
|
||||||
|
|
||||||
|
#: inc/template-functions.php:74
|
||||||
|
msgid "Category Archives: "
|
||||||
|
msgstr "Kategorie-Archive:"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post. Only visible to screen readers
|
||||||
|
#. translators: %s: Name of current post. Only visible to screen readers.
|
||||||
|
#: template-parts/content/content-page.php:41
|
||||||
|
#: template-parts/header/entry-header.php:32 inc/template-tags.php:120
|
||||||
|
msgid "Edit <span class=\"screen-reader-text\">%s</span>"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">%s</span> bearbeiten"
|
||||||
|
|
||||||
|
#: header.php:25
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Zum Inhalt springen"
|
||||||
|
|
||||||
|
#: functions.php:61 template-parts/header/site-branding.php:46
|
||||||
|
msgid "Social Links Menu"
|
||||||
|
msgstr "Social-Links-Menü"
|
||||||
|
|
||||||
|
#: functions.php:59 functions.php:146
|
||||||
|
msgid "Primary"
|
||||||
|
msgstr "Primär"
|
||||||
|
|
||||||
|
#. translators: %s: WordPress.
|
||||||
|
#: footer.php:28
|
||||||
|
msgid "Proudly powered by %s."
|
||||||
|
msgstr "Stolz präsentiert von %s."
|
||||||
|
|
||||||
|
#: comments.php:116
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#: comments.php:96
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Weiter"
|
||||||
|
|
||||||
|
#: comments.php:95
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Zurück"
|
||||||
|
|
||||||
|
#: comments.php:92 comments.php:95 comments.php:96
|
||||||
|
msgid "Comments"
|
||||||
|
msgstr "Kommentare"
|
||||||
|
|
||||||
|
#. translators: 1: number of comments, 2: post title
|
||||||
|
#: comments.php:44
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "%1$s reply on “%2$s”"
|
||||||
|
msgid_plural "%1$s replies on “%2$s”"
|
||||||
|
msgstr[0] "%1$s Antwort auf „%2$s“"
|
||||||
|
msgstr[1] "%1$s Antworten auf „%2$s“"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: comments.php:40
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "One reply on “%s”"
|
||||||
|
msgstr "Eine Antwort auf „%s“"
|
||||||
|
|
||||||
|
#: comments.php:35 comments.php:105 comments.php:107
|
||||||
|
msgid "Leave a comment"
|
||||||
|
msgstr "Schreib einen Kommentar"
|
||||||
|
|
||||||
|
#: comments.php:33
|
||||||
|
msgid "Join the Conversation"
|
||||||
|
msgstr "Beteilige dich an der Unterhaltung"
|
||||||
|
|
||||||
|
#: classes/class-twentynineteen-walker-comment.php:99
|
||||||
|
msgid "Your comment is awaiting moderation."
|
||||||
|
msgstr "Dein Kommentar wartet auf Freigabe."
|
||||||
|
|
||||||
|
#: classes/class-twentynineteen-walker-comment.php:94
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#. translators: 1: comment date, 2: comment time
|
||||||
|
#: classes/class-twentynineteen-walker-comment.php:86
|
||||||
|
msgid "%1$s at %2$s"
|
||||||
|
msgstr "%1$s um %2$s"
|
||||||
|
|
||||||
|
#: classes/class-twentynineteen-walker-comment.php:66
|
||||||
|
msgid "%s <span class=\"screen-reader-text says\">says:</span>"
|
||||||
|
msgstr "%s <span class=\"screen-reader-text says\">sagt:</span>"
|
||||||
|
|
||||||
|
#: 404.php:24
|
||||||
|
msgid "It looks like nothing was found at this location. Maybe try a search?"
|
||||||
|
msgstr "Wie es aussieht, wurde an dieser Stelle nichts gefunden. Möchtest du eine Suche starten?"
|
||||||
|
|
||||||
|
#: 404.php:20
|
||||||
|
msgid "Oops! That page can’t be found."
|
||||||
|
msgstr "Die Seite konnte leider nicht gefunden werden."
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentynineteen/"
|
||||||
|
msgstr "https://de.wordpress.org/themes/twentynineteen/"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "Das WordPress-Team"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:25
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
BIN
wp-content/languages/themes/twentyseventeen-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentyseventeen-de_DE.mo
Normal file
Binary file not shown.
331
wp-content/languages/themes/twentyseventeen-de_DE.po
Normal file
331
wp-content/languages/themes/twentyseventeen-de_DE.po
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
# Translation of Themes - Twenty Seventeen in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Seventeen package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-01-22 14:48:31+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Seventeen\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "Twenty Seventeen brings your site to life with header video and immersive featured images. With a focus on business sites, it features multiple sections on the front page as well as widgets, navigation and social menus, a logo, and more. Personalize its asymmetrical grid with a custom color scheme and showcase your multimedia content with post formats. Our default theme for 2017 works great in many languages, for any abilities, and on any device."
|
||||||
|
msgstr "Twenty Seventeen bringt Leben in deine Website durch ein Header-Video und beeindruckende Beitragsbilder. Mit einem Fokus auf Business-Websites zeichnet sich die Startseite durch mehrere Inhalts-Abschnitte aus, ebenso wie Widgets, Navigations- und Social-Menüs, einem Logo und vielem mehr. Gestalte das asymmetrische Raster des Themes in eigenen Farben und präsentiere deine multimedialen Inhalte in entsprechenden Beitragsformaten. Unser Standard-Theme für 2017 funktioniert großartig in vielen Sprachen, für jede Anwendergruppe und auf allen Geräten."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Seventeen"
|
||||||
|
msgstr "Twenty Seventeen"
|
||||||
|
|
||||||
|
#: template-parts/footer/footer-widgets.php:18
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Footer"
|
||||||
|
|
||||||
|
#: functions.php:338
|
||||||
|
msgid "Add widgets here to appear in your sidebar on blog posts and archive pages."
|
||||||
|
msgstr "Widgets hier hinzufügen, um sie in der Seitenleiste von Blogbeiträgen und Archivseiten anzuzeigen."
|
||||||
|
|
||||||
|
#: sidebar.php:18 functions.php:336
|
||||||
|
msgid "Blog Sidebar"
|
||||||
|
msgstr "Blog-Seitenleiste"
|
||||||
|
|
||||||
|
#: template-parts/navigation/navigation-top.php:31
|
||||||
|
#: template-parts/header/site-branding.php:34
|
||||||
|
msgid "Scroll down to content"
|
||||||
|
msgstr "Zum Inhalt nach unten scrollen"
|
||||||
|
|
||||||
|
#: functions.php:179
|
||||||
|
msgctxt "Theme starter content"
|
||||||
|
msgid "Coffee"
|
||||||
|
msgstr "Kaffee"
|
||||||
|
|
||||||
|
#: functions.php:175
|
||||||
|
msgctxt "Theme starter content"
|
||||||
|
msgid "Sandwich"
|
||||||
|
msgstr "Sandwich"
|
||||||
|
|
||||||
|
#: functions.php:171
|
||||||
|
msgctxt "Theme starter content"
|
||||||
|
msgid "Espresso"
|
||||||
|
msgstr "Espresso"
|
||||||
|
|
||||||
|
#: inc/custom-header.php:128
|
||||||
|
msgid "Pause background video"
|
||||||
|
msgstr "Hintergrund-Video pausieren"
|
||||||
|
|
||||||
|
#: inc/custom-header.php:127
|
||||||
|
msgid "Play background video"
|
||||||
|
msgstr "Hintergrund-Video abspielen"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:151
|
||||||
|
msgid "Front Page Section %1$s Placeholder"
|
||||||
|
msgstr "Platzhalter für Startseiten-Abschnitt %1$s"
|
||||||
|
|
||||||
|
#: inc/customizer.php:109
|
||||||
|
msgid "When the two-column layout is assigned, the page title is in one column and content is in the other."
|
||||||
|
msgstr "Wenn das Zwei-Spalten-Layout gewählt wird, erscheint der Seitentitel in einer Spalte und der Inhalt in der anderen."
|
||||||
|
|
||||||
|
#: single.php:34
|
||||||
|
msgid "Next Post"
|
||||||
|
msgstr "Nächster Beitrag"
|
||||||
|
|
||||||
|
#: index.php:27
|
||||||
|
msgid "Posts"
|
||||||
|
msgstr "Beiträge"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:89
|
||||||
|
msgid "Tags"
|
||||||
|
msgstr "Schlagwörter"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:85
|
||||||
|
msgid "Categories"
|
||||||
|
msgstr "Kategorien"
|
||||||
|
|
||||||
|
#. translators: used between list items, there is a space after the comma
|
||||||
|
#: inc/template-tags.php:66
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#. translators: %s: post date
|
||||||
|
#: inc/template-tags.php:52
|
||||||
|
msgid "<span class=\"screen-reader-text\">Posted on</span> %s"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">Veröffentlicht am</span> %s"
|
||||||
|
|
||||||
|
#. translators: %s: post author
|
||||||
|
#: inc/template-tags.php:21
|
||||||
|
msgid "by %s"
|
||||||
|
msgstr "von %s"
|
||||||
|
|
||||||
|
#: inc/icon-functions.php:44
|
||||||
|
msgid "Please define an SVG icon filename."
|
||||||
|
msgstr "Bitte definiere einen SVG-Icon-Dateinamen."
|
||||||
|
|
||||||
|
#: inc/icon-functions.php:39
|
||||||
|
msgid "Please define default parameters in the form of an array."
|
||||||
|
msgstr "Bitte definiere Standard-Parameter in Form eines Arrays."
|
||||||
|
|
||||||
|
#: inc/customizer.php:143
|
||||||
|
msgid "Select pages to feature in each area from the dropdowns. Add an image to a section by setting a featured image in the page editor. Empty sections will not be displayed."
|
||||||
|
msgstr "Wähle die Seiten für jeden Abschnitt über das Drop-down-Menü. Du kannst einem Abschnitt ein Bild hinzufügen, indem du im Editor für die Seite ein Beitragsbild festlegst. Leere Abschnitte werden nicht dargestellt."
|
||||||
|
|
||||||
|
#. translators: %d is the front page section number
|
||||||
|
#: inc/customizer.php:142
|
||||||
|
msgid "Front Page Section %d Content"
|
||||||
|
msgstr "Inhalt im Startseiten-Abschnitt %d"
|
||||||
|
|
||||||
|
#: inc/customizer.php:112 inc/customizer.php:171
|
||||||
|
msgid "Two Column"
|
||||||
|
msgstr "Zwei Spalten"
|
||||||
|
|
||||||
|
#: inc/customizer.php:111 inc/customizer.php:170
|
||||||
|
msgid "One Column"
|
||||||
|
msgstr "Eine Spalte"
|
||||||
|
|
||||||
|
#: inc/customizer.php:106
|
||||||
|
msgid "Page Layout"
|
||||||
|
msgstr "Seitenlayout"
|
||||||
|
|
||||||
|
#: inc/customizer.php:89
|
||||||
|
msgid "Theme Options"
|
||||||
|
msgstr "Theme-Optionen"
|
||||||
|
|
||||||
|
#: inc/customizer.php:64
|
||||||
|
msgid "Custom"
|
||||||
|
msgstr "Individuell"
|
||||||
|
|
||||||
|
#: inc/customizer.php:62
|
||||||
|
msgid "Light"
|
||||||
|
msgstr "Hell"
|
||||||
|
|
||||||
|
#: inc/customizer.php:60
|
||||||
|
msgid "Color Scheme"
|
||||||
|
msgstr "Farbschema"
|
||||||
|
|
||||||
|
#: inc/custom-header.php:56
|
||||||
|
msgid "Default Header Image"
|
||||||
|
msgstr "Standard Header-Bild"
|
||||||
|
|
||||||
|
#: functions.php:360
|
||||||
|
msgid "Footer 2"
|
||||||
|
msgstr "Footer 2"
|
||||||
|
|
||||||
|
#: functions.php:350 functions.php:362
|
||||||
|
msgid "Add widgets here to appear in your footer."
|
||||||
|
msgstr "Widgets hier hinzufügen, um sie im Footer anzuzeigen."
|
||||||
|
|
||||||
|
#: functions.php:348
|
||||||
|
msgid "Footer 1"
|
||||||
|
msgstr "Footer 1"
|
||||||
|
|
||||||
|
#: functions.php:289
|
||||||
|
msgctxt "Libre Franklin font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: template-parts/navigation/navigation-top.php:12 functions.php:64
|
||||||
|
#: functions.php:203
|
||||||
|
msgid "Top Menu"
|
||||||
|
msgstr "Oberes Menü"
|
||||||
|
|
||||||
|
#: comments.php:62
|
||||||
|
msgid "Reply"
|
||||||
|
msgstr "Antworten"
|
||||||
|
|
||||||
|
#: template-parts/post/content-none.php:28
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: search.php:54
|
||||||
|
msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords."
|
||||||
|
msgstr "Es gibt keine passenden Suchergebnisse. Bitte versuche es mit anderen Suchbegriffen."
|
||||||
|
|
||||||
|
#: template-parts/post/content-none.php:24
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%1$s\">Get started here</a>."
|
||||||
|
msgstr "Bereit, deinen ersten Beitrag zu veröffentlichen? <a href=\"%1$s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: template-parts/post/content-none.php:17 search.php:21
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Nichts gefunden"
|
||||||
|
|
||||||
|
#: single.php:33
|
||||||
|
msgid "Previous Post"
|
||||||
|
msgstr "Vorheriger Beitrag"
|
||||||
|
|
||||||
|
#: single.php:33 comments.php:71
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Zurück"
|
||||||
|
|
||||||
|
#: single.php:34 comments.php:72
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Weiter"
|
||||||
|
|
||||||
|
#: searchform.php:20
|
||||||
|
msgctxt "submit button"
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Suche"
|
||||||
|
|
||||||
|
#: searchform.php:19
|
||||||
|
msgctxt "placeholder"
|
||||||
|
msgid "Search …"
|
||||||
|
msgstr "Suche …"
|
||||||
|
|
||||||
|
#: searchform.php:17
|
||||||
|
msgctxt "label"
|
||||||
|
msgid "Search for:"
|
||||||
|
msgstr "Suche nach:"
|
||||||
|
|
||||||
|
#: search.php:19
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: template-parts/page/content-front-page-panels.php:45
|
||||||
|
#: template-parts/page/content-front-page.php:42
|
||||||
|
#: template-parts/post/content-audio.php:84 template-parts/post/content.php:57
|
||||||
|
#: template-parts/post/content-gallery.php:71
|
||||||
|
#: template-parts/post/content-video.php:83
|
||||||
|
#: template-parts/post/content-image.php:61 functions.php:390
|
||||||
|
msgid "Continue reading<span class=\"screen-reader-text\"> \"%s\"</span>"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">„%s“</span> weiterlesen"
|
||||||
|
|
||||||
|
#: inc/customizer.php:63
|
||||||
|
msgid "Dark"
|
||||||
|
msgstr "Dunkel"
|
||||||
|
|
||||||
|
#: inc/back-compat.php:39 inc/back-compat.php:52 inc/back-compat.php:70
|
||||||
|
msgid "Twenty Seventeen requires at least WordPress version 4.7. You are running version %s. Please upgrade and try again."
|
||||||
|
msgstr "Twenty Sixteen benötigt mindestens WordPress-Version 4.7. Du verwendest Version %s. Bitte aktualisiere und versuche es erneut."
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: inc/template-tags.php:117
|
||||||
|
msgid "Edit<span class=\"screen-reader-text\"> \"%s\"</span>"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">„%s“</span> bearbeiten"
|
||||||
|
|
||||||
|
#: template-parts/page/content-page.php:26
|
||||||
|
#: template-parts/post/content-audio.php:91 template-parts/post/content.php:64
|
||||||
|
#: template-parts/post/content-gallery.php:78
|
||||||
|
#: template-parts/post/content-video.php:90
|
||||||
|
#: template-parts/post/content-image.php:68
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#: template-parts/navigation/navigation-top.php:17
|
||||||
|
msgid "Menu"
|
||||||
|
msgstr "Menü"
|
||||||
|
|
||||||
|
#: header.php:27
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Zum Inhalt springen"
|
||||||
|
|
||||||
|
#: functions.php:482
|
||||||
|
msgid "Collapse child menu"
|
||||||
|
msgstr "Untermenü verbergen"
|
||||||
|
|
||||||
|
#: functions.php:481
|
||||||
|
msgid "Expand child menu"
|
||||||
|
msgstr "Untermenü anzeigen"
|
||||||
|
|
||||||
|
#: functions.php:65 functions.php:214
|
||||||
|
msgid "Social Links Menu"
|
||||||
|
msgstr "Social-Links-Menü"
|
||||||
|
|
||||||
|
#: template-parts/footer/site-info.php:19
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: footer.php:26
|
||||||
|
msgid "Footer Social Links Menu"
|
||||||
|
msgstr "Social-Links-Menü im Footer"
|
||||||
|
|
||||||
|
#: comments.php:82
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#. translators: 1: number of comments, 2: post title
|
||||||
|
#: comments.php:41
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "%1$s Reply to “%2$s”"
|
||||||
|
msgid_plural "%1$s Replies to “%2$s”"
|
||||||
|
msgstr[0] "%1$s Antwort auf „%2$s“"
|
||||||
|
msgstr[1] "%1$s Antworten auf „%2$s“"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: comments.php:37
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "One Reply to “%s”"
|
||||||
|
msgstr "Eine Antwort auf „%s“"
|
||||||
|
|
||||||
|
#: archive.php:50 search.php:47 index.php:54
|
||||||
|
msgid "Page"
|
||||||
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "Oops! That page can’t be found."
|
||||||
|
msgstr "Die Seite konnte leider nicht gefunden werden."
|
||||||
|
|
||||||
|
#: 404.php:24
|
||||||
|
msgid "It looks like nothing was found at this location. Maybe try a search?"
|
||||||
|
msgstr "Wie es aussieht, wurde an dieser Stelle nichts gefunden. Möchtest du eine Suche starten?"
|
||||||
|
|
||||||
|
#: archive.php:48 search.php:45 index.php:52
|
||||||
|
msgid "Previous page"
|
||||||
|
msgstr "Vorherige Seite"
|
||||||
|
|
||||||
|
#: archive.php:49 search.php:46 index.php:53
|
||||||
|
msgid "Next page"
|
||||||
|
msgstr "Nächste Seite"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentyseventeen/"
|
||||||
|
msgstr "https://de.wordpress.org/themes/twentyseventeen/"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: template-parts/footer/site-info.php:18
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
BIN
wp-content/languages/themes/twentysixteen-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentysixteen-de_DE.mo
Normal file
Binary file not shown.
329
wp-content/languages/themes/twentysixteen-de_DE.po
Normal file
329
wp-content/languages/themes/twentysixteen-de_DE.po
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
# Translation of Themes - Twenty Sixteen in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Sixteen package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2018-08-03 00:41:59+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Sixteen\n"
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Sixteen"
|
||||||
|
msgstr "Twenty Sixteen"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make your WordPress look beautiful everywhere."
|
||||||
|
msgstr "Twenty Sixteen ist die moderne Interpretation eines allzeit beliebten WordPress-Layouts – einer horizontalen Kopfzeile mit einer optionalen rechten Seitenleiste, die gleichermaßen bei Blogs wie klassischen Websites perfekt funktioniert. Das Theme bietet Einstellungsmöglichkeiten für individuelle Farben mit schönen Standard-Farbvorlagen, ein harmonisches, flexibles Raster mit einem Mobile-First-Ansatz und einem makellosen Schliff in jedem Detail. Twenty Sixteen sorgt für einen tollen Look bei all deinen WordPress-Websites."
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: inc/template-tags.php:194 template-parts/content.php:29
|
||||||
|
msgid "Continue reading<span class=\"screen-reader-text\"> \"%s\"</span>"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">„%s“ </span>weiterlesen"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: image.php:88 template-parts/content.php:53
|
||||||
|
#: template-parts/content-single.php:47 template-parts/content-search.php:28
|
||||||
|
#: template-parts/content-search.php:43 template-parts/content-page.php:39
|
||||||
|
msgid "Edit<span class=\"screen-reader-text\"> \"%s\"</span>"
|
||||||
|
msgstr "<span class=\"screen-reader-text\">„%s“</span> bearbeiten"
|
||||||
|
|
||||||
|
#: inc/customizer.php:345
|
||||||
|
msgid "Red"
|
||||||
|
msgstr "Rot"
|
||||||
|
|
||||||
|
#. translators: %s: post title
|
||||||
|
#: comments.php:31
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "One thought on “%s”"
|
||||||
|
msgstr "Ein Gedanke zu „%s“"
|
||||||
|
|
||||||
|
#: searchform.php:16
|
||||||
|
msgctxt "submit button"
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Suche"
|
||||||
|
|
||||||
|
#: searchform.php:14
|
||||||
|
msgctxt "placeholder"
|
||||||
|
msgid "Search …"
|
||||||
|
msgstr "Suche …"
|
||||||
|
|
||||||
|
#: searchform.php:13
|
||||||
|
msgctxt "label"
|
||||||
|
msgid "Search for:"
|
||||||
|
msgstr "Suche nach:"
|
||||||
|
|
||||||
|
#: footer.php:30
|
||||||
|
msgid "Footer Social Links Menu"
|
||||||
|
msgstr "Footer-Social-Links-Menü"
|
||||||
|
|
||||||
|
#: footer.php:17
|
||||||
|
msgid "Footer Primary Menu"
|
||||||
|
msgstr "Primäres Footer-Menü"
|
||||||
|
|
||||||
|
#: functions.php:267
|
||||||
|
msgid "Add widgets here to appear in your sidebar."
|
||||||
|
msgstr "Widgets hier hinzufügen, um sie in die Seitenleiste einzubauen."
|
||||||
|
|
||||||
|
#: template-parts/content.php:14
|
||||||
|
msgid "Featured"
|
||||||
|
msgstr "Empfohlen"
|
||||||
|
|
||||||
|
#: template-parts/content-none.php:28
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: template-parts/content-none.php:23
|
||||||
|
msgid "Sorry, but nothing matched your search terms. Please try again with some different keywords."
|
||||||
|
msgstr "Es gibt keine passenden Suchergebnisse. Bitte versuche es mit anderen Suchbegriffen."
|
||||||
|
|
||||||
|
#: template-parts/content-none.php:19
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%1$s\">Get started here</a>."
|
||||||
|
msgstr "Bereit, deinen ersten Beitrag zu veröffentlichen? <a href=\"%1$s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: template-parts/content-none.php:13
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Nichts gefunden"
|
||||||
|
|
||||||
|
#: template-parts/biography.php:33
|
||||||
|
msgid "View all posts by %s"
|
||||||
|
msgstr "Zeige alle Beiträge von %s"
|
||||||
|
|
||||||
|
#: template-parts/biography.php:28
|
||||||
|
msgid "Author:"
|
||||||
|
msgstr "Autor:"
|
||||||
|
|
||||||
|
#: single.php:42
|
||||||
|
msgid "Previous post:"
|
||||||
|
msgstr "Vorheriger Beitrag:"
|
||||||
|
|
||||||
|
#: single.php:39
|
||||||
|
msgid "Next post:"
|
||||||
|
msgstr "Nächster Beitrag:"
|
||||||
|
|
||||||
|
#: single.php:41
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Zurück"
|
||||||
|
|
||||||
|
#: single.php:38
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Weiter"
|
||||||
|
|
||||||
|
#: search.php:18
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:112
|
||||||
|
msgctxt "Used before tag names."
|
||||||
|
msgid "Tags"
|
||||||
|
msgstr "Schlagwörter"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:103
|
||||||
|
msgctxt "Used before category names."
|
||||||
|
msgid "Categories"
|
||||||
|
msgstr "Kategorien"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:99 inc/template-tags.php:108
|
||||||
|
msgctxt "Used between list items, there is a space after the comma."
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#: inc/template-tags.php:83
|
||||||
|
msgctxt "Used before publish date."
|
||||||
|
msgid "Posted on"
|
||||||
|
msgstr "Veröffentlicht am"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:40
|
||||||
|
msgctxt "Used before post format."
|
||||||
|
msgid "Format"
|
||||||
|
msgstr "Format"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:52
|
||||||
|
msgid "Leave a comment<span class=\"screen-reader-text\"> on %s</span>"
|
||||||
|
msgstr "Schreibe einen Kommentar<span class=\"screen-reader-text\"> zu %s</span>"
|
||||||
|
|
||||||
|
#: inc/template-tags.php:26
|
||||||
|
msgctxt "Used before post author name."
|
||||||
|
msgid "Author"
|
||||||
|
msgstr "Autor"
|
||||||
|
|
||||||
|
#: functions.php:207 inc/customizer.php:355
|
||||||
|
msgid "Yellow"
|
||||||
|
msgstr "Gelb"
|
||||||
|
|
||||||
|
#: inc/customizer.php:335
|
||||||
|
msgid "Gray"
|
||||||
|
msgstr "Grau"
|
||||||
|
|
||||||
|
#: inc/customizer.php:325
|
||||||
|
msgid "Dark"
|
||||||
|
msgstr "Dunkel"
|
||||||
|
|
||||||
|
#: inc/customizer.php:315
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Standard"
|
||||||
|
|
||||||
|
#: inc/customizer.php:242
|
||||||
|
msgid "Secondary Text Color"
|
||||||
|
msgstr "Sekundäre Textfarbe"
|
||||||
|
|
||||||
|
#: inc/customizer.php:221
|
||||||
|
msgid "Main Text Color"
|
||||||
|
msgstr "Primäre Textfarbe"
|
||||||
|
|
||||||
|
#: inc/customizer.php:200
|
||||||
|
msgid "Link Color"
|
||||||
|
msgstr "Linkfarbe"
|
||||||
|
|
||||||
|
#: inc/customizer.php:176
|
||||||
|
msgid "Page Background Color"
|
||||||
|
msgstr "Hintergrundfarbe des Inhalts"
|
||||||
|
|
||||||
|
#: single.php:31 image.php:107
|
||||||
|
msgctxt "Parent post link"
|
||||||
|
msgid "<span class=\"meta-nav\">Published in</span><span class=\"post-title\">%title</span>"
|
||||||
|
msgstr "<span class=\"meta-nav\">Veröffentlicht in</span><span class=\"post-title\">%title</span>"
|
||||||
|
|
||||||
|
#: inc/back-compat.php:41 inc/back-compat.php:54 inc/back-compat.php:72
|
||||||
|
msgid "Twenty Sixteen requires at least WordPress version 4.4. You are running version %s. Please upgrade and try again."
|
||||||
|
msgstr "Twenty Sixteen benötigt mindestens WordPress-Version 4.4. Du verwendest Version %s. Bitte aktualisiere und versuche es erneut."
|
||||||
|
|
||||||
|
#: inc/customizer.php:153
|
||||||
|
msgid "Base Color Scheme"
|
||||||
|
msgstr "Basis-Farbvorlage"
|
||||||
|
|
||||||
|
#: image.php:77
|
||||||
|
msgctxt "Used before full size attachment link."
|
||||||
|
msgid "Full size"
|
||||||
|
msgstr "Volle Größe"
|
||||||
|
|
||||||
|
#: image.php:58 template-parts/content.php:36
|
||||||
|
#: template-parts/content-single.php:26 template-parts/content-page.php:24
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#: image.php:26
|
||||||
|
msgid "Next Image"
|
||||||
|
msgstr "Nächstes Bild"
|
||||||
|
|
||||||
|
#: image.php:25
|
||||||
|
msgid "Previous Image"
|
||||||
|
msgstr "Vorheriges Bild"
|
||||||
|
|
||||||
|
#: header.php:49
|
||||||
|
msgid "Menu"
|
||||||
|
msgstr "Menü"
|
||||||
|
|
||||||
|
#: header.php:27
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Zum Inhalt springen"
|
||||||
|
|
||||||
|
#: functions.php:407
|
||||||
|
msgid "expand child menu"
|
||||||
|
msgstr "Untermenü anzeigen"
|
||||||
|
|
||||||
|
#: functions.php:408
|
||||||
|
msgid "collapse child menu"
|
||||||
|
msgstr "Untermenü verbergen"
|
||||||
|
|
||||||
|
#. translators: If there are characters in your language that are not supported
|
||||||
|
#. by Merriweather, translate this to 'off'. Do not translate into your own
|
||||||
|
#. language.
|
||||||
|
#: functions.php:317
|
||||||
|
msgctxt "Merriweather font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#. translators: If there are characters in your language that are not supported
|
||||||
|
#. by Montserrat, translate this to 'off'. Do not translate into your own
|
||||||
|
#. language.
|
||||||
|
#: functions.php:322
|
||||||
|
msgctxt "Montserrat font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#. translators: If there are characters in your language that are not supported
|
||||||
|
#. by Inconsolata, translate this to 'off'. Do not translate into your own
|
||||||
|
#. language.
|
||||||
|
#: functions.php:327
|
||||||
|
msgctxt "Inconsolata font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:277
|
||||||
|
msgid "Content Bottom 1"
|
||||||
|
msgstr "Unterhalb des Inhalts 1"
|
||||||
|
|
||||||
|
#: functions.php:289
|
||||||
|
msgid "Content Bottom 2"
|
||||||
|
msgstr "Unterhalb des Inhalts 2"
|
||||||
|
|
||||||
|
#: functions.php:279 functions.php:291
|
||||||
|
msgid "Appears at the bottom of the content on posts and pages."
|
||||||
|
msgstr "Erscheint unterhalb des Inhalts von Beiträgen und Seiten."
|
||||||
|
|
||||||
|
#: functions.php:265
|
||||||
|
msgid "Sidebar"
|
||||||
|
msgstr "Seitenleiste"
|
||||||
|
|
||||||
|
#: header.php:66 functions.php:93
|
||||||
|
msgid "Social Links Menu"
|
||||||
|
msgstr "Social-Links-Menü"
|
||||||
|
|
||||||
|
#: header.php:53 functions.php:92
|
||||||
|
msgid "Primary Menu"
|
||||||
|
msgstr "Primäres Menü"
|
||||||
|
|
||||||
|
#: footer.php:61
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: comments.php:71
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#. translators: 1: number of comments, 2: post title
|
||||||
|
#: comments.php:35
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "%1$s thought on “%2$s”"
|
||||||
|
msgid_plural "%1$s thoughts on “%2$s”"
|
||||||
|
msgstr[0] "Ein Gedanke zu „%2$s“"
|
||||||
|
msgstr[1] "%1$s Gedanken zu „%2$s“"
|
||||||
|
|
||||||
|
#: index.php:50 archive.php:53 search.php:41 image.php:62
|
||||||
|
#: template-parts/content.php:40 template-parts/content-single.php:30
|
||||||
|
#: template-parts/content-page.php:28
|
||||||
|
msgid "Page"
|
||||||
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#: index.php:49 archive.php:52 search.php:40
|
||||||
|
msgid "Next page"
|
||||||
|
msgstr "Nächste Seite"
|
||||||
|
|
||||||
|
#: index.php:48 archive.php:51 search.php:39
|
||||||
|
msgid "Previous page"
|
||||||
|
msgstr "Vorherige Seite"
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "It looks like nothing was found at this location. Maybe try a search?"
|
||||||
|
msgstr "Wie es aussieht, wurde an dieser Stelle nichts gefunden. Möchtest du eine Suche starten?"
|
||||||
|
|
||||||
|
#: 404.php:17
|
||||||
|
msgid "Oops! That page can’t be found."
|
||||||
|
msgstr "Die Seite konnte leider nicht gefunden werden."
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentysixteen/"
|
||||||
|
msgstr "https://de.wordpress.org/themes/twentysixteen/"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:60
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
BIN
wp-content/languages/themes/twentyten-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentyten-de_DE.mo
Normal file
Binary file not shown.
407
wp-content/languages/themes/twentyten-de_DE.po
Normal file
407
wp-content/languages/themes/twentyten-de_DE.po
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
# Translation of Themes - Twenty Ten in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Ten package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-07-24 21:40:44+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Ten\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the \"Asides\" and \"Gallery\" categories, and has an optional one-column page template that removes the sidebar."
|
||||||
|
msgstr "Das Theme 2010 für WordPress ist gut aussehend, anpassbar, einfach und gut zu lesen. Du kannst es nach deinen Wünschen anpassen, in dem du eigene Menüs kreierst oder ein eigenes Hintergrundbild oder Kopfzeilenbild verwendest. Das Theme hat sechs Widgetbereiche (zwei in der Sidebar, vier im Footer) und unterstützt Vorschaubilder für Artikel. "
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Ten"
|
||||||
|
msgstr "Twenty Ten"
|
||||||
|
|
||||||
|
#. translators: %s: The post title.
|
||||||
|
#: comments.php:40
|
||||||
|
msgid "One Response to %s"
|
||||||
|
msgstr "Eine Antwort zu %s"
|
||||||
|
|
||||||
|
#: functions.php:112
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:107
|
||||||
|
msgid "Light Gray"
|
||||||
|
msgstr "Hellgrau"
|
||||||
|
|
||||||
|
#: functions.php:102
|
||||||
|
msgid "Medium Gray"
|
||||||
|
msgstr "Mittelgrau"
|
||||||
|
|
||||||
|
#: functions.php:97
|
||||||
|
msgid "Black"
|
||||||
|
msgstr "Schwarz"
|
||||||
|
|
||||||
|
#: functions.php:92
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr "Blau"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "One column, no sidebar"
|
||||||
|
msgstr "Einspaltig, ohne Sidebar"
|
||||||
|
|
||||||
|
#: tag.php:17
|
||||||
|
msgid "Tag Archives: %s"
|
||||||
|
msgstr "Schlagwort-Archive: %s"
|
||||||
|
|
||||||
|
#: sidebar.php:36
|
||||||
|
msgid "Meta"
|
||||||
|
msgstr "Meta"
|
||||||
|
|
||||||
|
#: sidebar.php:29
|
||||||
|
msgid "Archives"
|
||||||
|
msgstr "Archive"
|
||||||
|
|
||||||
|
#: search.php:29
|
||||||
|
msgid "Sorry, but nothing matched your search criteria. Please try again with some different keywords."
|
||||||
|
msgstr "Leider gibt es keine Ergebnisse für deine Suchkriterien. Bitte versuche es noch einmal mit anderen Suchbegriffen."
|
||||||
|
|
||||||
|
#: search.php:27
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Es konnte nichts gefunden werden."
|
||||||
|
|
||||||
|
#: search.php:16
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: loop.php:176
|
||||||
|
msgid "<span class=\"%1$s\">Tagged</span> %2$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Verschlagwortet mit</span> %2$s"
|
||||||
|
|
||||||
|
#: loop.php:167
|
||||||
|
msgid "<span class=\"%1$s\">Posted in</span> %2$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Veröffentlicht unter</span> %2$s"
|
||||||
|
|
||||||
|
#: loop.php:115
|
||||||
|
msgctxt "asides category slug"
|
||||||
|
msgid "asides"
|
||||||
|
msgstr "Asides"
|
||||||
|
|
||||||
|
#: loop.php:108 loop.php:131 loop.php:180
|
||||||
|
msgid "% Comments"
|
||||||
|
msgstr "% Kommentare"
|
||||||
|
|
||||||
|
#: loop.php:108 loop.php:131 loop.php:180
|
||||||
|
msgid "1 Comment"
|
||||||
|
msgstr "1 Kommentar"
|
||||||
|
|
||||||
|
#: loop.php:108 loop.php:131 loop.php:180
|
||||||
|
msgid "Leave a comment"
|
||||||
|
msgstr "Hinterlasse einen Kommentar"
|
||||||
|
|
||||||
|
#: loop.php:105
|
||||||
|
msgid "View posts in the Gallery category"
|
||||||
|
msgstr "Zeige Beiträge aus der Galerie-Kategorie"
|
||||||
|
|
||||||
|
#: loop.php:102 loop.php:105
|
||||||
|
msgid "More Galleries"
|
||||||
|
msgstr "Weitere Galerien"
|
||||||
|
|
||||||
|
#: loop.php:102
|
||||||
|
msgid "View Galleries"
|
||||||
|
msgstr "Galerien ansehen"
|
||||||
|
|
||||||
|
#: loop.php:90
|
||||||
|
msgid "Permalink to %s"
|
||||||
|
msgstr "Permanentlink zu %s"
|
||||||
|
|
||||||
|
#: loop.php:89
|
||||||
|
msgid "This gallery contains <a %1$s>%2$s photo</a>."
|
||||||
|
msgid_plural "This gallery contains <a %1$s>%2$s photos</a>."
|
||||||
|
msgstr[0] "Diese Galerie enthält <a %1$s>%2$s Foto</a>."
|
||||||
|
msgstr[1] "Diese Galerie enthält <a %1$s>%2$s Fotos</a>."
|
||||||
|
|
||||||
|
#: loop.php:65 loop.php:104
|
||||||
|
msgctxt "gallery category slug"
|
||||||
|
msgid "gallery"
|
||||||
|
msgstr "Galerie"
|
||||||
|
|
||||||
|
#: loop.php:35
|
||||||
|
msgid "Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post."
|
||||||
|
msgstr "In diesem Archiv wurden keine Ergebnisse gefunden, vielleicht hilft die Suchfunktion weiter."
|
||||||
|
|
||||||
|
#: loop.php:26 loop.php:195
|
||||||
|
msgid "Newer posts <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Neuere Artikel <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: loop.php:25 loop.php:194
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Older posts"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Ältere Artikel"
|
||||||
|
|
||||||
|
#: loop-single.php:61
|
||||||
|
msgid "View all posts by %s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Zeige alle Beiträge von %s <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: loop-single.php:26 loop-single.php:76
|
||||||
|
msgctxt "Next post link"
|
||||||
|
msgid "→"
|
||||||
|
msgstr "→"
|
||||||
|
|
||||||
|
#: loop-single.php:25 loop-single.php:75
|
||||||
|
msgctxt "Previous post link"
|
||||||
|
msgid "←"
|
||||||
|
msgstr "←"
|
||||||
|
|
||||||
|
#: loop-attachment.php:155 loop.php:156 loop-page.php:36 loop-single.php:41
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#: loop-attachment.php:75 loop-attachment.php:165 loop.php:109 loop.php:132
|
||||||
|
#: loop.php:181 loop-page.php:41 loop-single.php:70
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#: loop-attachment.php:68
|
||||||
|
msgid "Link to full-size image"
|
||||||
|
msgstr "Link zum Bild in voller Grösse"
|
||||||
|
|
||||||
|
#: loop-attachment.php:64
|
||||||
|
msgid "Full size is %s pixels"
|
||||||
|
msgstr "Die gesamte Größe beträgt %s Pixel"
|
||||||
|
|
||||||
|
#: loop-attachment.php:52
|
||||||
|
msgid "<span class=\"%1$s\">Published</span> %2$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Publiziert</span> %2$s"
|
||||||
|
|
||||||
|
#: loop-attachment.php:39
|
||||||
|
msgid "<span class=\"%1$s\">By</span> %2$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Von</span> %2$s"
|
||||||
|
|
||||||
|
#. translators: %s - title of parent post
|
||||||
|
#: loop-attachment.php:28
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> %s"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> %s"
|
||||||
|
|
||||||
|
#: loop-attachment.php:25
|
||||||
|
msgid "Return to %s"
|
||||||
|
msgstr "Zurück zu %s"
|
||||||
|
|
||||||
|
#: header.php:111
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Springe zum Inhalt"
|
||||||
|
|
||||||
|
#: header.php:35
|
||||||
|
msgid "Page %s"
|
||||||
|
msgstr "Seite %s"
|
||||||
|
|
||||||
|
#: functions.php:623
|
||||||
|
msgid "Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Setze ein Lesezeichen auf den <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permalink</a>."
|
||||||
|
|
||||||
|
#: functions.php:621
|
||||||
|
msgid "This entry was posted in %1$s. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Beitrag wurde unter %1$s veröffentlicht. Setze ein Lesezeichen auf den <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permalink</a>."
|
||||||
|
|
||||||
|
#: functions.php:619
|
||||||
|
msgid "This entry was posted in %1$s and tagged %2$s. Bookmark the <a href=\"%3$s\" title=\"Permalink to %4$s\" rel=\"bookmark\">permalink</a>."
|
||||||
|
msgstr "Dieser Beitrag wurde unter %1$s abgelegt und mit %2$s verschlagwortet. Setze ein Lesezeichen auf den <a href=\"%3$s\" title=\"Permalink zu %4$s\" rel=\"bookmark\">Permalink</a>."
|
||||||
|
|
||||||
|
#: loop-attachment.php:44 functions.php:602
|
||||||
|
msgid "View all posts by %s"
|
||||||
|
msgstr "Zeige alle Artikel von %s"
|
||||||
|
|
||||||
|
#: functions.php:591
|
||||||
|
msgid "<span class=\"%1$s\">Posted on</span> %2$s <span class=\"meta-sep\">by</span> %3$s"
|
||||||
|
msgstr "<span class=\"%1$s\">Publiziert am</span> %2$s <span class=\"meta-sep\">von</span> %3$s"
|
||||||
|
|
||||||
|
#: functions.php:553
|
||||||
|
msgid "Fourth Footer Widget Area"
|
||||||
|
msgstr "Vierter Bereich des Footer-Widgets "
|
||||||
|
|
||||||
|
#: functions.php:540
|
||||||
|
msgid "Third Footer Widget Area"
|
||||||
|
msgstr "Dritter Bereich des Footer-Widgets "
|
||||||
|
|
||||||
|
#: functions.php:527
|
||||||
|
msgid "Second Footer Widget Area"
|
||||||
|
msgstr "Zweiter Bereich des Footer-Widgets"
|
||||||
|
|
||||||
|
#: functions.php:516 functions.php:529 functions.php:542 functions.php:555
|
||||||
|
msgid "An optional widget area for your site footer."
|
||||||
|
msgstr "Ein optionaler Widgetbereich für deine Fußzeile."
|
||||||
|
|
||||||
|
#: functions.php:514
|
||||||
|
msgid "First Footer Widget Area"
|
||||||
|
msgstr "Erster Bereich des Footer-Widgets"
|
||||||
|
|
||||||
|
#: functions.php:503
|
||||||
|
msgid "An optional secondary widget area, displays below the primary widget area in your sidebar."
|
||||||
|
msgstr "Ein optionaler, zweiter Widgetbereich, der unter dem ersten Widgetbereich in deiner Seitenleiste angezeigt wird."
|
||||||
|
|
||||||
|
#: functions.php:501
|
||||||
|
msgid "Secondary Widget Area"
|
||||||
|
msgstr "Sekundärer Widget-Bereich"
|
||||||
|
|
||||||
|
#: functions.php:490
|
||||||
|
msgid "Add widgets here to appear in your sidebar."
|
||||||
|
msgstr "Füge hier Widgets hinzu, die in deiner Seitenleiste erscheinen sollen."
|
||||||
|
|
||||||
|
#: functions.php:488
|
||||||
|
msgid "Primary Widget Area"
|
||||||
|
msgstr "Primärer Widget-Bereich"
|
||||||
|
|
||||||
|
#: functions.php:467
|
||||||
|
msgid "Pingback:"
|
||||||
|
msgstr "Pingback:"
|
||||||
|
|
||||||
|
#: functions.php:440 functions.php:467
|
||||||
|
msgid "(Edit)"
|
||||||
|
msgstr "(Bearbeiten)"
|
||||||
|
|
||||||
|
#. translators: 1: date, 2: time
|
||||||
|
#: functions.php:436
|
||||||
|
msgid "%1$s at %2$s"
|
||||||
|
msgstr "%1$s um %2$s"
|
||||||
|
|
||||||
|
#: functions.php:429
|
||||||
|
msgid "Your comment is awaiting moderation."
|
||||||
|
msgstr "Dein Kommentar wartet auf Freischaltung."
|
||||||
|
|
||||||
|
#: functions.php:426
|
||||||
|
msgid "%s <span class=\"says\">says:</span>"
|
||||||
|
msgstr "%s <span class=\"says\">sagt:</span>"
|
||||||
|
|
||||||
|
#: loop-attachment.php:151 loop.php:124 loop.php:152 functions.php:329
|
||||||
|
msgid "Continue reading <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Weiterlesen <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:254
|
||||||
|
msgid "Sunset"
|
||||||
|
msgstr "Sonnenuntergang"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:248
|
||||||
|
msgid "Path"
|
||||||
|
msgstr "Pfad"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:242
|
||||||
|
msgid "Inkwell"
|
||||||
|
msgstr "Tintenfass"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:236
|
||||||
|
msgid "Forest Floor"
|
||||||
|
msgstr "Waldboden"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:230
|
||||||
|
msgid "Fern"
|
||||||
|
msgstr "Farn"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:224
|
||||||
|
msgid "Concave"
|
||||||
|
msgstr "Konkav"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:218
|
||||||
|
msgid "Cherry Blossoms"
|
||||||
|
msgstr "Kirschblüten"
|
||||||
|
|
||||||
|
#. translators: header image description
|
||||||
|
#: functions.php:212
|
||||||
|
msgid "Berries"
|
||||||
|
msgstr "Beeren"
|
||||||
|
|
||||||
|
#: functions.php:137
|
||||||
|
msgid "Primary Navigation"
|
||||||
|
msgstr "Primäre Navigation"
|
||||||
|
|
||||||
|
#: footer.php:47
|
||||||
|
msgid "Proudly powered by %s."
|
||||||
|
msgstr "Proudly powered by %s."
|
||||||
|
|
||||||
|
#: footer.php:46
|
||||||
|
msgid "Semantic Personal Publishing Platform"
|
||||||
|
msgstr "Semantic Personal Publishing Platform"
|
||||||
|
|
||||||
|
#: comments.php:88
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#: comments.php:57 comments.php:77
|
||||||
|
msgid "Newer Comments <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Neuere Kommentare <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: comments.php:56 comments.php:76
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Older Comments"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Ältere Kommentare"
|
||||||
|
|
||||||
|
#: comments.php:46
|
||||||
|
msgid "%1$s Response to %2$s"
|
||||||
|
msgid_plural "%1$s Responses to %2$s"
|
||||||
|
msgstr[0] "%1$s Antwort zu %2$s"
|
||||||
|
msgstr[1] "%1$s Antworten zu %2$s"
|
||||||
|
|
||||||
|
#: comments.php:18
|
||||||
|
msgid "This post is password protected. Enter the password to view any comments."
|
||||||
|
msgstr "Dieser Beitrag ist passwortgeschützt. Um Kommentare anschauen zu können musst du das Passwort angeben."
|
||||||
|
|
||||||
|
#: category.php:17
|
||||||
|
msgid "Category Archives: %s"
|
||||||
|
msgstr "Archiv der Kategorie: %s"
|
||||||
|
|
||||||
|
#: loop-single.php:57 author.php:49
|
||||||
|
msgid "About %s"
|
||||||
|
msgstr "Über %s"
|
||||||
|
|
||||||
|
#: author.php:29
|
||||||
|
msgid "Author Archives: %s"
|
||||||
|
msgstr "Archiv des Autors: %s"
|
||||||
|
|
||||||
|
#: archive.php:41
|
||||||
|
msgid "Blog Archives"
|
||||||
|
msgstr "Blog-Archive"
|
||||||
|
|
||||||
|
#: archive.php:39
|
||||||
|
msgctxt "yearly archives date format"
|
||||||
|
msgid "Y"
|
||||||
|
msgstr "Y"
|
||||||
|
|
||||||
|
#: archive.php:39
|
||||||
|
msgid "Yearly Archives: <span>%s</span>"
|
||||||
|
msgstr "Jahresarchive: <span>%s</span>"
|
||||||
|
|
||||||
|
#: archive.php:37
|
||||||
|
msgctxt "monthly archives date format"
|
||||||
|
msgid "F Y"
|
||||||
|
msgstr "F Y"
|
||||||
|
|
||||||
|
#: archive.php:37
|
||||||
|
msgid "Monthly Archives: <span>%s</span>"
|
||||||
|
msgstr "Monatsarchive: <span>%s</span>"
|
||||||
|
|
||||||
|
#: archive.php:35
|
||||||
|
msgid "Daily Archives: <span>%s</span>"
|
||||||
|
msgstr "Tagesarchive: <span>%s</span>"
|
||||||
|
|
||||||
|
#: 404.php:18
|
||||||
|
msgid "Apologies, but the page you requested could not be found. Perhaps searching will help."
|
||||||
|
msgstr "Die Seite konnte nicht gefunden werden, vielleicht hilft die Suchfunktion weiter."
|
||||||
|
|
||||||
|
#: loop.php:33 404.php:16
|
||||||
|
msgid "Not Found"
|
||||||
|
msgstr "Seite nicht gefunden"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:46
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentyten/"
|
||||||
|
msgstr "https://wordpress.org/themes/twentyten/"
|
||||||
BIN
wp-content/languages/themes/twentythirteen-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentythirteen-de_DE.mo
Normal file
Binary file not shown.
365
wp-content/languages/themes/twentythirteen-de_DE.po
Normal file
365
wp-content/languages/themes/twentythirteen-de_DE.po
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
# Translation of Themes - Twenty Thirteen in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Thirteen package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-07-24 21:43:14+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Thirteen\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small."
|
||||||
|
msgstr "Das 2013 Theme für WordPress bringt uns zurück zum Blog. Es wird eine Bandbreite an Beitragsformaten unterstützt. Jedes Beitragsformat wird auf einzigartige Weise angezeigt. Viele kleine Details im Design runden das Aussehen der Website ab. Verschiedene Farbvariationen und passende Kopfgrafiken, schöne Schriften und Icons. Das flexible Layout passt sich optimal an die verschiedenen Endgeräte an. Egal ob kleiner Bildschirm auf dem Smartphone oder Tablet-PC."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Thirteen"
|
||||||
|
msgstr "Twenty Thirteen"
|
||||||
|
|
||||||
|
#. translators: %s: The post title.
|
||||||
|
#: comments.php:29
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "One thought on “%s”"
|
||||||
|
msgstr "Ein Gedanke zu “%s”"
|
||||||
|
|
||||||
|
#: functions.php:147
|
||||||
|
msgid "Off-white"
|
||||||
|
msgstr "Gebrochenes Weiß"
|
||||||
|
|
||||||
|
#: functions.php:142
|
||||||
|
msgid "Beige"
|
||||||
|
msgstr "Beige"
|
||||||
|
|
||||||
|
#: functions.php:137
|
||||||
|
msgid "Light Brown"
|
||||||
|
msgstr "Hellbraun"
|
||||||
|
|
||||||
|
#: functions.php:132
|
||||||
|
msgid "Medium Brown"
|
||||||
|
msgstr "Mittelbraun"
|
||||||
|
|
||||||
|
#: functions.php:127
|
||||||
|
msgid "Dark Brown"
|
||||||
|
msgstr "Dunkelbraun"
|
||||||
|
|
||||||
|
#: functions.php:122
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:117
|
||||||
|
msgid "Yellow"
|
||||||
|
msgstr "Gelb"
|
||||||
|
|
||||||
|
#: functions.php:112
|
||||||
|
msgid "Light Orange"
|
||||||
|
msgstr "Hellorange"
|
||||||
|
|
||||||
|
#: functions.php:107
|
||||||
|
msgid "Medium Orange"
|
||||||
|
msgstr "Mittelorange"
|
||||||
|
|
||||||
|
#: functions.php:102
|
||||||
|
msgid "Red"
|
||||||
|
msgstr "Rot"
|
||||||
|
|
||||||
|
#: functions.php:97
|
||||||
|
msgid "Dark Gray"
|
||||||
|
msgstr "Dunkelgrau"
|
||||||
|
|
||||||
|
#: taxonomy-post_format.php:23
|
||||||
|
msgid "%s Archives"
|
||||||
|
msgstr "%s Archiv"
|
||||||
|
|
||||||
|
#: tag.php:21
|
||||||
|
msgid "Tag Archives: %s"
|
||||||
|
msgstr "Schlagwort-Archive: %s"
|
||||||
|
|
||||||
|
#: search.php:18
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: inc/custom-header.php:60
|
||||||
|
msgctxt "header image description"
|
||||||
|
msgid "Star"
|
||||||
|
msgstr "Sterne"
|
||||||
|
|
||||||
|
#: inc/custom-header.php:55
|
||||||
|
msgctxt "header image description"
|
||||||
|
msgid "Diamond"
|
||||||
|
msgstr "Diamanten"
|
||||||
|
|
||||||
|
#: inc/custom-header.php:50
|
||||||
|
msgctxt "header image description"
|
||||||
|
msgid "Circle"
|
||||||
|
msgstr "Kreise"
|
||||||
|
|
||||||
|
#: inc/back-compat.php:37 inc/back-compat.php:48 inc/back-compat.php:64
|
||||||
|
msgid "Twenty Thirteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again."
|
||||||
|
msgstr "Twenty Thirteen benötigt mindestens WordPress Version 3.6. Du benutzt Version %s. Bitte aktualisieren und erneut versuchen."
|
||||||
|
|
||||||
|
#: image.php:62
|
||||||
|
msgid "Next <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Weiter <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: image.php:61
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Previous"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Vorherige"
|
||||||
|
|
||||||
|
#: image.php:49
|
||||||
|
msgid "Full resolution"
|
||||||
|
msgstr "Volle Auflösung"
|
||||||
|
|
||||||
|
#: image.php:48
|
||||||
|
msgid "Link to full-size image"
|
||||||
|
msgstr "Link zum Bild in voller Grösse"
|
||||||
|
|
||||||
|
#: image.php:29
|
||||||
|
msgid "<span class=\"attachment-meta\">Published on <time class=\"entry-date\" datetime=\"%1$s\">%2$s</time> in <a href=\"%3$s\" title=\"Return to %4$s\" rel=\"gallery\">%5$s</a></span>"
|
||||||
|
msgstr "<span class=\"attachment-meta\">Veröffentlicht am <time class=\"entry-date\" datetime=\"%1$s\">%2$s</time> in <a href=\"%3$s\" title=\"Zurück zu %4$s\" rel=\"gallery\">%5$s</a>.</span>"
|
||||||
|
|
||||||
|
#: header.php:45
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Springe zum Inhalt"
|
||||||
|
|
||||||
|
#: header.php:44
|
||||||
|
msgid "Menu"
|
||||||
|
msgstr "Menü"
|
||||||
|
|
||||||
|
#: functions.php:526
|
||||||
|
msgid "Permalink to %s"
|
||||||
|
msgstr "Permanentlink zu %s"
|
||||||
|
|
||||||
|
#: functions.php:518
|
||||||
|
msgctxt "1: post format name. 2: date"
|
||||||
|
msgid "%1$s on %2$s"
|
||||||
|
msgstr "%1$s um %2$s"
|
||||||
|
|
||||||
|
#: functions.php:498
|
||||||
|
msgid "View all posts by %s"
|
||||||
|
msgstr "Zeige alle Artikel von %s"
|
||||||
|
|
||||||
|
#. Translators: used between list items, there is a space after the comma.
|
||||||
|
#: functions.php:482 functions.php:488
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#: functions.php:474
|
||||||
|
msgid "Sticky"
|
||||||
|
msgstr "Oben halten"
|
||||||
|
|
||||||
|
#: functions.php:456
|
||||||
|
msgctxt "Next post link"
|
||||||
|
msgid "%title <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "%title <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: functions.php:455
|
||||||
|
msgctxt "Previous post link"
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> %title"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> %title"
|
||||||
|
|
||||||
|
#: functions.php:452
|
||||||
|
msgid "Post navigation"
|
||||||
|
msgstr "Beitrags-Navigation"
|
||||||
|
|
||||||
|
#: functions.php:425
|
||||||
|
msgid "Newer posts <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Neuere Beiträge <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: functions.php:421
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Older posts"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Ältere Beiträge"
|
||||||
|
|
||||||
|
#: functions.php:417
|
||||||
|
msgid "Posts navigation"
|
||||||
|
msgstr "Beitrags-Navigation"
|
||||||
|
|
||||||
|
#: functions.php:392
|
||||||
|
msgid "Appears on posts and pages in the sidebar."
|
||||||
|
msgstr "Erscheint bei Beiträgen und Seiten in der Seitenleiste."
|
||||||
|
|
||||||
|
#: functions.php:390
|
||||||
|
msgid "Secondary Widget Area"
|
||||||
|
msgstr "Sekundärer Widget-Bereich"
|
||||||
|
|
||||||
|
#: functions.php:380
|
||||||
|
msgid "Appears in the footer section of the site."
|
||||||
|
msgstr "Erscheint im Footer-Bereich der Website."
|
||||||
|
|
||||||
|
#: functions.php:378
|
||||||
|
msgid "Main Widget Area"
|
||||||
|
msgstr "Haupt-Widgetbereich"
|
||||||
|
|
||||||
|
#: functions.php:363
|
||||||
|
msgid "Page %s"
|
||||||
|
msgstr "Seite %s"
|
||||||
|
|
||||||
|
#. Translators: If there are characters in your language that are not *
|
||||||
|
#. supported by Bitter, translate this to 'off'. Do not translate into your *
|
||||||
|
#. own language.
|
||||||
|
#: functions.php:232
|
||||||
|
msgctxt "Bitter font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#. Translators: If there are characters in your language that are not *
|
||||||
|
#. supported by Source Sans Pro, translate this to 'off'. Do not translate *
|
||||||
|
#. into your own language.
|
||||||
|
#: functions.php:226
|
||||||
|
msgctxt "Source Sans Pro font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:192
|
||||||
|
msgid "Navigation Menu"
|
||||||
|
msgstr "Individuelles Menü"
|
||||||
|
|
||||||
|
#: footer.php:25
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: content-none.php:27
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: content-none.php:22
|
||||||
|
msgid "Sorry, but nothing matched your search terms. Please try again with different keywords."
|
||||||
|
msgstr "Entschuldige, aber es konnte nichts gefunden werden. Versuche es mit anderen Suchbegriffen erneut."
|
||||||
|
|
||||||
|
#: content-none.php:18
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%1$s\">Get started here</a>."
|
||||||
|
msgstr "Bereit, um deinen ersten Beitrag zu veröffentlichen? <a href=\"%1$s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: content-none.php:12
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Es konnte nichts gefunden werden."
|
||||||
|
|
||||||
|
#: content-gallery.php:52 content.php:65 content-image.php:48
|
||||||
|
#: content-video.php:48 content-quote.php:38
|
||||||
|
msgid "View all % comments"
|
||||||
|
msgstr "Zeige alle % Kommentare"
|
||||||
|
|
||||||
|
#: content-gallery.php:52 content.php:65 content-image.php:48
|
||||||
|
#: content-video.php:48 content-quote.php:38
|
||||||
|
msgid "One comment so far"
|
||||||
|
msgstr "Bisher ein Kommentar"
|
||||||
|
|
||||||
|
#: content-gallery.php:52 content.php:65 content-image.php:48
|
||||||
|
#: content-video.php:48 content-quote.php:38
|
||||||
|
msgid "Leave a comment"
|
||||||
|
msgstr "Schreibe einen Kommentar"
|
||||||
|
|
||||||
|
#: content-link.php:19 content-chat.php:45 content-gallery.php:55
|
||||||
|
#: content.php:31 content-image.php:51 content-audio.php:47 page.php:51
|
||||||
|
#: content-video.php:51 content-quote.php:41 content-status.php:35 image.php:54
|
||||||
|
#: content-aside.php:36 content-aside.php:44
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#: content-link.php:35 content-chat.php:34 content-gallery.php:35
|
||||||
|
#: content.php:52 content-image.php:34 content-audio.php:35 page.php:41
|
||||||
|
#: content-video.php:34 content-quote.php:24 content-status.php:24 image.php:83
|
||||||
|
#: content-aside.php:24
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#. translators: %s: Name of current post
|
||||||
|
#: content-link.php:28 content-chat.php:27 content-gallery.php:28
|
||||||
|
#: content.php:45 functions.php:640 content-image.php:27 content-audio.php:28
|
||||||
|
#: content-video.php:27 content-quote.php:17 content-status.php:17
|
||||||
|
#: content-aside.php:17
|
||||||
|
msgid "Continue reading %s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "%s weiterlesen <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: comments.php:67
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#: comments.php:62
|
||||||
|
msgid "Newer Comments →"
|
||||||
|
msgstr "Neuere Kommentare →"
|
||||||
|
|
||||||
|
#: comments.php:61
|
||||||
|
msgid "← Older Comments"
|
||||||
|
msgstr "← Ältere Kommentare"
|
||||||
|
|
||||||
|
#: comments.php:60
|
||||||
|
msgid "Comment navigation"
|
||||||
|
msgstr "Kommentar-Navigation"
|
||||||
|
|
||||||
|
#. translators: %1$s: The number of comments. %2$s: The post title.
|
||||||
|
#: comments.php:35
|
||||||
|
msgctxt "comments title"
|
||||||
|
msgid "%1$s thought on “%2$s”"
|
||||||
|
msgid_plural "%1$s thoughts on “%2$s”"
|
||||||
|
msgstr[0] "%1$s Gedanke zu „%2$s“"
|
||||||
|
msgstr[1] "%1$s Gedanken zu „%2$s“"
|
||||||
|
|
||||||
|
#: category.php:19
|
||||||
|
msgid "Category Archives: %s"
|
||||||
|
msgstr "Archiv der Kategorie: %s"
|
||||||
|
|
||||||
|
#: author.php:31
|
||||||
|
msgid "All posts by %s"
|
||||||
|
msgstr "Alle Beiträge von %s"
|
||||||
|
|
||||||
|
#: author-bio.php:30
|
||||||
|
msgid "View all posts by %s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Zeige alle Beiträge von %s <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: author-bio.php:26
|
||||||
|
msgid "About %s"
|
||||||
|
msgstr "Über %s"
|
||||||
|
|
||||||
|
#: archive.php:36
|
||||||
|
msgid "Archives"
|
||||||
|
msgstr "Archive"
|
||||||
|
|
||||||
|
#: archive.php:34
|
||||||
|
msgctxt "yearly archives date format"
|
||||||
|
msgid "Y"
|
||||||
|
msgstr "Y"
|
||||||
|
|
||||||
|
#: archive.php:34
|
||||||
|
msgid "Yearly Archives: %s"
|
||||||
|
msgstr "Archiv für das Jahr: %s"
|
||||||
|
|
||||||
|
#: archive.php:32
|
||||||
|
msgctxt "monthly archives date format"
|
||||||
|
msgid "F Y"
|
||||||
|
msgstr "F Y"
|
||||||
|
|
||||||
|
#: archive.php:32
|
||||||
|
msgid "Monthly Archives: %s"
|
||||||
|
msgstr "Archiv für den Monat: %s"
|
||||||
|
|
||||||
|
#: archive.php:30
|
||||||
|
msgid "Daily Archives: %s"
|
||||||
|
msgstr "Archiv für den Tag: %s"
|
||||||
|
|
||||||
|
#: 404.php:22
|
||||||
|
msgid "It looks like nothing was found at this location. Maybe try a search?"
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "This is somewhat embarrassing, isn’t it?"
|
||||||
|
msgstr "Ups, diesen Inhalt gibt es wohl nicht."
|
||||||
|
|
||||||
|
#: 404.php:16
|
||||||
|
msgid "Not Found"
|
||||||
|
msgstr "Seite nicht gefunden"
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:24
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentythirteen/"
|
||||||
|
msgstr "https://wordpress.org/themes/twentythirteen/"
|
||||||
BIN
wp-content/languages/themes/twentytwelve-de_DE.mo
Normal file
BIN
wp-content/languages/themes/twentytwelve-de_DE.mo
Normal file
Binary file not shown.
352
wp-content/languages/themes/twentytwelve-de_DE.po
Normal file
352
wp-content/languages/themes/twentytwelve-de_DE.po
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
# Translation of Themes - Twenty Twelve in German
|
||||||
|
# This file is distributed under the same license as the Themes - Twenty Twelve package.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"PO-Revision-Date: 2019-05-12 15:11:31+0000\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
"X-Generator: GlotPress/2.4.0-alpha\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Project-Id-Version: Themes - Twenty Twelve\n"
|
||||||
|
|
||||||
|
#. Description of the theme
|
||||||
|
msgid "The 2012 theme for WordPress is a fully responsive theme that looks great on any device. Features include a front page template with its own widgets, an optional display font, styling for post formats on both index and single views, and an optional no-sidebar page template. Make it yours with a custom menu, header image, and background."
|
||||||
|
msgstr "Das 2012 Theme für WordPress ist ein komplett adaptives Theme (responsive theme), das auf jedem Ausgabegerät gut aussieht. Zu den Merkmalen gehören eine Startseiten-Vorlage mit eigenen Widgets, eine optionale Display-Schrift, Styling für Beitrags-Formate auf der Übersichts- und der Beitrags-Ansicht und eine optionale Seiten-Vorlage ohne Sidebar. Passe Menü, Header-Bild und Hintergrund deinen Vorstellungen an."
|
||||||
|
|
||||||
|
#. Theme Name of the theme
|
||||||
|
msgid "Twenty Twelve"
|
||||||
|
msgstr "Twenty Twelve"
|
||||||
|
|
||||||
|
#. translators: %s: The post title.
|
||||||
|
#: comments.php:35
|
||||||
|
msgid "One thought on “%s”"
|
||||||
|
msgstr "Ein Gedanke zu „%s“"
|
||||||
|
|
||||||
|
#: functions.php:94
|
||||||
|
msgid "White"
|
||||||
|
msgstr "Weiß"
|
||||||
|
|
||||||
|
#: functions.php:89
|
||||||
|
msgid "Light Gray"
|
||||||
|
msgstr "Hellgrau"
|
||||||
|
|
||||||
|
#: functions.php:84
|
||||||
|
msgid "Medium Gray"
|
||||||
|
msgstr "Mittelgrau"
|
||||||
|
|
||||||
|
#: functions.php:79
|
||||||
|
msgid "Dark Gray"
|
||||||
|
msgstr "Dunkelgrau"
|
||||||
|
|
||||||
|
#: functions.php:74
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr "Blau"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "Full-width Page Template, No Sidebar"
|
||||||
|
msgstr "Seitentemplate mit voller Breite, keine Sidebar"
|
||||||
|
|
||||||
|
#. Template Name of the theme
|
||||||
|
msgid "Front Page Template"
|
||||||
|
msgstr "Startseiten Template"
|
||||||
|
|
||||||
|
#: tag.php:21
|
||||||
|
msgid "Tag Archives: %s"
|
||||||
|
msgstr "Schlagwort-Archive: %s"
|
||||||
|
|
||||||
|
#: single.php:25
|
||||||
|
msgctxt "Next post link"
|
||||||
|
msgid "→"
|
||||||
|
msgstr "→"
|
||||||
|
|
||||||
|
#: single.php:24
|
||||||
|
msgctxt "Previous post link"
|
||||||
|
msgid "←"
|
||||||
|
msgstr "←"
|
||||||
|
|
||||||
|
#: search.php:41
|
||||||
|
msgid "Sorry, but nothing matched your search criteria. Please try again with some different keywords."
|
||||||
|
msgstr "Entschuldige, aber es konnte nichts gefunden werden. Versuche es mit anderen Suchbegriffen erneut."
|
||||||
|
|
||||||
|
#: search.php:18
|
||||||
|
msgid "Search Results for: %s"
|
||||||
|
msgstr "Suchergebnisse für: %s"
|
||||||
|
|
||||||
|
#: index.php:46
|
||||||
|
msgid "Ready to publish your first post? <a href=\"%s\">Get started here</a>."
|
||||||
|
msgstr "Bereit den ersten Beitrag zu veröffentlichen? <a href=\"%s\">Starte hier</a>."
|
||||||
|
|
||||||
|
#: index.php:42
|
||||||
|
msgid "No posts to display"
|
||||||
|
msgstr "Keine Beiträge zum Anzeigen"
|
||||||
|
|
||||||
|
#: image.php:46
|
||||||
|
msgid "Next →"
|
||||||
|
msgstr "Weiter →"
|
||||||
|
|
||||||
|
#: image.php:45
|
||||||
|
msgid "← Previous"
|
||||||
|
msgstr "← Zurück"
|
||||||
|
|
||||||
|
#: image.php:30
|
||||||
|
msgid "<span class=\"meta-prep meta-prep-entry-date\">Published </span> <span class=\"entry-date\"><time class=\"entry-date\" datetime=\"%1$s\">%2$s</time></span> at <a href=\"%3$s\" title=\"Link to full-size image\">%4$s × %5$s</a> in <a href=\"%6$s\" title=\"Return to %7$s\" rel=\"gallery\">%8$s</a>."
|
||||||
|
msgstr "<span class=\"meta-prep meta-prep-entry-date\">Veröffentlicht am </span> <span class=\"entry-date\"><time class=\"entry-date\" datetime=\"%1$s\">%2$s</time></span> bei <a href=\"%3$s\" title=\"Originalgrösse anzeigen\">%4$s × %5$s</a> in <a href=\"%6$s\" title=\"Zurück zu %7$s\" rel=\"gallery\">%8$s</a>."
|
||||||
|
|
||||||
|
#: header.php:45
|
||||||
|
msgid "Skip to content"
|
||||||
|
msgstr "Springe zum Inhalt"
|
||||||
|
|
||||||
|
#: header.php:44
|
||||||
|
msgid "Menu"
|
||||||
|
msgstr "Menü"
|
||||||
|
|
||||||
|
#: functions.php:514
|
||||||
|
msgid "This entry was posted on %3$s<span class=\"by-author\"> by %4$s</span>."
|
||||||
|
msgstr "Dieser Beitrag wurde <span class=\"by-author\"> von %4$s</span> am %3$s veröffentlicht. "
|
||||||
|
|
||||||
|
#: functions.php:512
|
||||||
|
msgid "This entry was posted in %1$s on %3$s<span class=\"by-author\"> by %4$s</span>."
|
||||||
|
msgstr "Dieser Beitrag wurde unter %1$s abgelegt am %3$s<span class=\"by-author\"> von %4$s</span>. "
|
||||||
|
|
||||||
|
#. Translators: 1 is category, 2 is tag, 3 is the date and 4 is the author's
|
||||||
|
#. name.
|
||||||
|
#: functions.php:510
|
||||||
|
msgid "This entry was posted in %1$s and tagged %2$s on %3$s<span class=\"by-author\"> by %4$s</span>."
|
||||||
|
msgstr "Dieser Beitrag wurde am %3$s<span class=\"by-author\"> von %4$s</span> in %1$s veröffentlicht. Schlagworte: %2$s."
|
||||||
|
|
||||||
|
#: functions.php:504
|
||||||
|
msgid "View all posts by %s"
|
||||||
|
msgstr "Zeige alle Beiträge von %s"
|
||||||
|
|
||||||
|
#. Translators: used between list items, there is a space after the comma.
|
||||||
|
#: functions.php:488 functions.php:491
|
||||||
|
msgid ", "
|
||||||
|
msgstr ", "
|
||||||
|
|
||||||
|
#: functions.php:460
|
||||||
|
msgid "Reply"
|
||||||
|
msgstr "Antworten"
|
||||||
|
|
||||||
|
#: functions.php:446
|
||||||
|
msgid "Your comment is awaiting moderation."
|
||||||
|
msgstr "Dein Kommentar wartet auf Freischaltung."
|
||||||
|
|
||||||
|
#. translators: 1: date, 2: time
|
||||||
|
#: functions.php:440
|
||||||
|
msgid "%1$s at %2$s"
|
||||||
|
msgstr "%1$s um %2$s"
|
||||||
|
|
||||||
|
#: functions.php:433
|
||||||
|
msgid "Post author"
|
||||||
|
msgstr "Beitragsautor"
|
||||||
|
|
||||||
|
#: functions.php:417
|
||||||
|
msgid "(Edit)"
|
||||||
|
msgstr "(Bearbeiten)"
|
||||||
|
|
||||||
|
#: functions.php:417
|
||||||
|
msgid "Pingback:"
|
||||||
|
msgstr "Pingback:"
|
||||||
|
|
||||||
|
#: functions.php:391
|
||||||
|
msgid "Newer posts <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Neuere Beiträge <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: functions.php:390
|
||||||
|
msgid "<span class=\"meta-nav\">←</span> Older posts"
|
||||||
|
msgstr "<span class=\"meta-nav\">←</span> Ältere Beiträge"
|
||||||
|
|
||||||
|
#: single.php:23 functions.php:389
|
||||||
|
msgid "Post navigation"
|
||||||
|
msgstr "Beitrags-Navigation"
|
||||||
|
|
||||||
|
#: functions.php:366
|
||||||
|
msgid "Second Front Page Widget Area"
|
||||||
|
msgstr "Zweiter Startseiten Widget Bereich"
|
||||||
|
|
||||||
|
#: functions.php:356 functions.php:368
|
||||||
|
msgid "Appears when using the optional Front Page template with a page set as Static Front Page"
|
||||||
|
msgstr "Erscheint, wenn das optionale Startseiten Template verwendet wird und die Seite als statische Startseite definiert wurde."
|
||||||
|
|
||||||
|
#: functions.php:354
|
||||||
|
msgid "First Front Page Widget Area"
|
||||||
|
msgstr "Erster Startseiten Widget Bereich"
|
||||||
|
|
||||||
|
#: functions.php:344
|
||||||
|
msgid "Appears on posts and pages except the optional Front Page template, which has its own widgets"
|
||||||
|
msgstr "Erscheint auf allen Beitragsseiten und statischen Seiten außer dem optionalen Startseitetemplate, welches eigene Widgets hat."
|
||||||
|
|
||||||
|
#: functions.php:342
|
||||||
|
msgid "Main Sidebar"
|
||||||
|
msgstr "Haupt-Seitenleiste"
|
||||||
|
|
||||||
|
#: functions.php:310
|
||||||
|
msgid "Page %s"
|
||||||
|
msgstr "Seite %s"
|
||||||
|
|
||||||
|
#. translators: To add an additional Open Sans character subset specific to
|
||||||
|
#. your language, * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do
|
||||||
|
#. not translate into your own language.
|
||||||
|
#: functions.php:157
|
||||||
|
msgctxt "Open Sans font: add new subset (greek, cyrillic, vietnamese)"
|
||||||
|
msgid "no-subset"
|
||||||
|
msgstr "no-subset"
|
||||||
|
|
||||||
|
#. translators: If there are characters in your language that are not supported
|
||||||
|
#. * by Open Sans, translate this to 'off'. Do not translate into your own
|
||||||
|
#. language.
|
||||||
|
#: functions.php:151
|
||||||
|
msgctxt "Open Sans font: on or off"
|
||||||
|
msgid "on"
|
||||||
|
msgstr "on"
|
||||||
|
|
||||||
|
#: functions.php:108
|
||||||
|
msgid "Primary Menu"
|
||||||
|
msgstr "Primäres Menü"
|
||||||
|
|
||||||
|
#: footer.php:22
|
||||||
|
msgid "Proudly powered by %s"
|
||||||
|
msgstr "Stolz präsentiert von %s"
|
||||||
|
|
||||||
|
#: footer.php:21
|
||||||
|
msgid "Semantic Personal Publishing Platform"
|
||||||
|
msgstr "Semantic Personal Publishing Platform"
|
||||||
|
|
||||||
|
#: content.php:75
|
||||||
|
msgid "View all posts by %s <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Zeige alle Beiträge von %s <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: content.php:16
|
||||||
|
msgid "Featured post"
|
||||||
|
msgstr "Hervorgehobener Beitrag"
|
||||||
|
|
||||||
|
#: content-page.php:24 image.php:123 content.php:50
|
||||||
|
msgid "Pages:"
|
||||||
|
msgstr "Seiten:"
|
||||||
|
|
||||||
|
#: index.php:58 content-none.php:17
|
||||||
|
msgid "Apologies, but no results were found. Perhaps searching will help find a related post."
|
||||||
|
msgstr "Bedaure, aber es wurden keine Ergebnisse gefunden. Möglicherweise hilft die Suchfunktion passende Beiträge zu finden."
|
||||||
|
|
||||||
|
#: index.php:54 search.php:37 content-none.php:13
|
||||||
|
msgid "Nothing Found"
|
||||||
|
msgstr "Es konnte nichts gefunden werden."
|
||||||
|
|
||||||
|
#: content-link.php:12
|
||||||
|
msgid "Link"
|
||||||
|
msgstr "Link"
|
||||||
|
|
||||||
|
#: content-aside.php:26 content-status.php:40 content-image.php:26
|
||||||
|
#: content-link.php:24 content-page.php:31 content-quote.php:23 image.php:41
|
||||||
|
#: functions.php:451 content.php:60
|
||||||
|
msgid "Edit"
|
||||||
|
msgstr "Bearbeiten"
|
||||||
|
|
||||||
|
#: content-aside.php:23 content-status.php:37 content-image.php:23
|
||||||
|
#: content-link.php:21 content-quote.php:20 content.php:35
|
||||||
|
msgid "% Replies"
|
||||||
|
msgstr "% Antworten"
|
||||||
|
|
||||||
|
#: content-aside.php:23 content-status.php:37 content-image.php:23
|
||||||
|
#: content-link.php:21 content-quote.php:20 content.php:35
|
||||||
|
msgid "1 Reply"
|
||||||
|
msgstr "1 Antwort"
|
||||||
|
|
||||||
|
#: content-aside.php:23 content-status.php:37 content-image.php:23
|
||||||
|
#: content-link.php:21 content-quote.php:20 content.php:35
|
||||||
|
msgid "Leave a reply"
|
||||||
|
msgstr "Schreibe eine Antwort"
|
||||||
|
|
||||||
|
#: content-aside.php:20 content-status.php:15 content-link.php:18
|
||||||
|
#: content-quote.php:17
|
||||||
|
msgid "Permalink to %s"
|
||||||
|
msgstr "Permanentlink zu %s"
|
||||||
|
|
||||||
|
#: content-aside.php:15 content-status.php:31 content-image.php:13
|
||||||
|
#: content-link.php:14 content-quote.php:13 content.php:46
|
||||||
|
msgid "Continue reading <span class=\"meta-nav\">→</span>"
|
||||||
|
msgstr "Weiterlesen <span class=\"meta-nav\">→</span>"
|
||||||
|
|
||||||
|
#: comments.php:74
|
||||||
|
msgid "Comments are closed."
|
||||||
|
msgstr "Kommentare sind geschlossen."
|
||||||
|
|
||||||
|
#: comments.php:64
|
||||||
|
msgid "Newer Comments →"
|
||||||
|
msgstr "Neuere Kommentare →"
|
||||||
|
|
||||||
|
#: comments.php:63
|
||||||
|
msgid "← Older Comments"
|
||||||
|
msgstr "← Ältere Kommentare"
|
||||||
|
|
||||||
|
#: comments.php:62
|
||||||
|
msgid "Comment navigation"
|
||||||
|
msgstr "Kommentar-Navigation"
|
||||||
|
|
||||||
|
#. translators: %1$s: The number of comments. %2$s: The post title.
|
||||||
|
#: comments.php:41
|
||||||
|
msgid "%1$s thought on “%2$s”"
|
||||||
|
msgid_plural "%1$s thoughts on “%2$s”"
|
||||||
|
msgstr[0] "Ein Gedanke zu „%2$s“"
|
||||||
|
msgstr[1] "%1$s Gedanken zu „%2$s“"
|
||||||
|
|
||||||
|
#: category.php:21
|
||||||
|
msgid "Category Archives: %s"
|
||||||
|
msgstr "Archiv der Kategorie: %s"
|
||||||
|
|
||||||
|
#: content.php:71 author.php:64
|
||||||
|
msgid "About %s"
|
||||||
|
msgstr "Über %s"
|
||||||
|
|
||||||
|
#: author.php:32
|
||||||
|
msgid "Author Archives: %s"
|
||||||
|
msgstr "Archiv des Autors: %s"
|
||||||
|
|
||||||
|
#: archive.php:36
|
||||||
|
msgid "Archives"
|
||||||
|
msgstr "Archive"
|
||||||
|
|
||||||
|
#: archive.php:34
|
||||||
|
msgctxt "yearly archives date format"
|
||||||
|
msgid "Y"
|
||||||
|
msgstr "Y"
|
||||||
|
|
||||||
|
#: archive.php:34
|
||||||
|
msgid "Yearly Archives: %s"
|
||||||
|
msgstr "Archiv für das Jahr: %s"
|
||||||
|
|
||||||
|
#: archive.php:32
|
||||||
|
msgctxt "monthly archives date format"
|
||||||
|
msgid "F Y"
|
||||||
|
msgstr "F Y"
|
||||||
|
|
||||||
|
#: archive.php:32
|
||||||
|
msgid "Monthly Archives: %s"
|
||||||
|
msgstr "Archiv für den Monat: %s"
|
||||||
|
|
||||||
|
#: archive.php:30
|
||||||
|
msgid "Daily Archives: %s"
|
||||||
|
msgstr "Archiv für den Tag: %s"
|
||||||
|
|
||||||
|
#: 404.php:21
|
||||||
|
msgid "It seems we can’t find what you’re looking for. Perhaps searching can help."
|
||||||
|
msgstr "Es sieht so aus, als ob wir nicht das finden konnten, wonach du gesucht hast. Möglicherweise hilft eine Suche."
|
||||||
|
|
||||||
|
#: 404.php:17
|
||||||
|
msgid "This is somewhat embarrassing, isn’t it?"
|
||||||
|
msgstr "Ups, diesen Inhalt gibt es wohl nicht."
|
||||||
|
|
||||||
|
#. Author URI of the theme
|
||||||
|
#: footer.php:21
|
||||||
|
msgid "https://wordpress.org/"
|
||||||
|
msgstr "https://de.wordpress.org/"
|
||||||
|
|
||||||
|
#. Author of the theme
|
||||||
|
msgid "the WordPress team"
|
||||||
|
msgstr "dem WordPress-Team"
|
||||||
|
|
||||||
|
#. Theme URI of the theme
|
||||||
|
msgid "https://wordpress.org/themes/twentytwelve/"
|
||||||
|
msgstr "https://wordpress.org/themes/twentytwelve/"
|
||||||
@@ -1,339 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
All-in-One Event Calendar 2.0
|
|
||||||
Copyright (C) 2013 Timely Network Inc.
|
|
||||||
|
|
||||||
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
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
{signature of Ty Coon}, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
all-in-one-event-calendar
|
|
||||||
=========================
|
|
||||||
|
|
||||||
All-in-One Event Calendar 2.0
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Plugin Name: All-in-One Event Calendar by Time.ly
|
|
||||||
* Plugin URI: https://wordpress.org/plugins/all-in-one-event-calendar/
|
|
||||||
* Description: A calendar system with month, week, day, agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds.
|
|
||||||
* Author: Time.ly Network Inc.
|
|
||||||
* Author URI: https://time.ly/
|
|
||||||
* Version: 2.5.44
|
|
||||||
* Text Domain: all-in-one-event-calendar
|
|
||||||
* Domain Path: /language
|
|
||||||
*/
|
|
||||||
$ai1ec_base_dir = dirname( __FILE__ );
|
|
||||||
$ai1ec_base_url = plugins_url( '', __FILE__ );
|
|
||||||
|
|
||||||
$ai1ec_config_path = $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'app' .
|
|
||||||
DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR;
|
|
||||||
|
|
||||||
// Include configuration files and initiate global constants as they are used
|
|
||||||
// By the error/exception handler too.
|
|
||||||
foreach ( array( 'constants-local.php', 'constants.php' ) as $file ) {
|
|
||||||
if ( is_file( $ai1ec_config_path . $file ) ) {
|
|
||||||
require_once $ai1ec_config_path . $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! function_exists( 'ai1ec_initiate_constants' ) ) {
|
|
||||||
throw new Ai1ec_Exception(
|
|
||||||
'No constant file was found.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
ai1ec_initiate_constants( $ai1ec_base_dir, $ai1ec_base_url );
|
|
||||||
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'exception' . DIRECTORY_SEPARATOR . 'ai1ec.php';
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'exception' . DIRECTORY_SEPARATOR . 'error.php';
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'exception' . DIRECTORY_SEPARATOR . 'handler.php';
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'http' . DIRECTORY_SEPARATOR . 'response' .
|
|
||||||
DIRECTORY_SEPARATOR . 'helper.php';
|
|
||||||
$ai1ec_exception_handler = new Ai1ec_Exception_Handler(
|
|
||||||
'Ai1ec_Exception',
|
|
||||||
'Ai1ec_Error_Exception'
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// if the user clicked the link to reactivate the plugin
|
|
||||||
if ( isset( $_GET[Ai1ec_Exception_Handler::DB_REACTIVATE_PLUGIN] ) ) {
|
|
||||||
$ai1ec_exception_handler->reactivate_plugin();
|
|
||||||
}
|
|
||||||
$soft_disable_message = $ai1ec_exception_handler->get_disabled_message();
|
|
||||||
if ( false !== $soft_disable_message ) {
|
|
||||||
return $ai1ec_exception_handler->show_notices( $soft_disable_message );
|
|
||||||
}
|
|
||||||
|
|
||||||
$prev_er_handler = set_error_handler(
|
|
||||||
array( $ai1ec_exception_handler, 'handle_error' )
|
|
||||||
);
|
|
||||||
$prev_ex_handler = set_exception_handler(
|
|
||||||
array( $ai1ec_exception_handler, 'handle_exception' )
|
|
||||||
);
|
|
||||||
$ai1ec_exception_handler->set_prev_er_handler( $prev_er_handler );
|
|
||||||
$ai1ec_exception_handler->set_prev_ex_handler( $prev_ex_handler );
|
|
||||||
|
|
||||||
// Regular startup sequence starts here
|
|
||||||
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'bootstrap' . DIRECTORY_SEPARATOR . 'loader.php';
|
|
||||||
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'global-functions.php';
|
|
||||||
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'lib' .
|
|
||||||
DIRECTORY_SEPARATOR . 'iCal' . DIRECTORY_SEPARATOR . 'iCalcreator-2.26.9' . DIRECTORY_SEPARATOR . 'autoload.php';
|
|
||||||
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'app' .
|
|
||||||
DIRECTORY_SEPARATOR . 'controller' . DIRECTORY_SEPARATOR . 'extension.php';
|
|
||||||
|
|
||||||
require $ai1ec_base_dir . DIRECTORY_SEPARATOR . 'app' .
|
|
||||||
DIRECTORY_SEPARATOR . 'controller' . DIRECTORY_SEPARATOR . 'extension-license.php';
|
|
||||||
|
|
||||||
$ai1ec_loader = new Ai1ec_Loader( $ai1ec_base_dir );
|
|
||||||
@ini_set( 'unserialize_callback_func', 'spl_autoload_call' );
|
|
||||||
spl_autoload_register( array( $ai1ec_loader, 'load' ) );
|
|
||||||
|
|
||||||
$ai1ec_front_controller = new Ai1ec_Front_Controller();
|
|
||||||
$ai1ec_front_controller->initialize( $ai1ec_loader );
|
|
||||||
@@ -1,493 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define required constants, if these have not been defined already.
|
|
||||||
*
|
|
||||||
* @param string $ai1ec_base_dir Sanitized, absolute, path to Ai1EC base dir
|
|
||||||
*
|
|
||||||
* @uses plugin_basename To determine plug-in folder+file name
|
|
||||||
* @uses plugins_url To determine absolute URI to plug-ins' folder
|
|
||||||
* @uses get_option To fetch 'home' URI value
|
|
||||||
*
|
|
||||||
* @return void Method does not return
|
|
||||||
*/
|
|
||||||
function ai1ec_initiate_constants( $ai1ec_base_dir, $ai1ec_base_url ) {
|
|
||||||
|
|
||||||
// ===============
|
|
||||||
// = Plugin Path =
|
|
||||||
// ===============
|
|
||||||
if ( ! defined( 'AI1EC_PATH' ) ) {
|
|
||||||
define( 'AI1EC_PATH', $ai1ec_base_dir );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =======================
|
|
||||||
// = Extensions base dir =
|
|
||||||
// =======================
|
|
||||||
if ( ! defined( 'AI1EC_EXTENSIONS_BASEDIR' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_EXTENSIONS_BASEDIR',
|
|
||||||
dirname( $ai1ec_base_dir ) . DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===============
|
|
||||||
// = Plugin Name =
|
|
||||||
// ===============
|
|
||||||
if ( ! defined( 'AI1EC_PLUGIN_NAME' ) ) {
|
|
||||||
define( 'AI1EC_PLUGIN_NAME', 'all-in-one-event-calendar' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================
|
|
||||||
// = Plugin Basename =
|
|
||||||
// ===================
|
|
||||||
if ( ! defined( 'AI1EC_PLUGIN_BASENAME' ) ) {
|
|
||||||
$plugin = AI1EC_PATH . DIRECTORY_SEPARATOR . AI1EC_PLUGIN_NAME . '.php';
|
|
||||||
define( 'AI1EC_PLUGIN_BASENAME', plugin_basename( $plugin ) );
|
|
||||||
unset( $plugin );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================
|
|
||||||
// = Plugin Version =
|
|
||||||
// ==================
|
|
||||||
if ( ! defined( 'AI1EC_VERSION' ) ) {
|
|
||||||
define( 'AI1EC_VERSION', '2.5.44' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================
|
|
||||||
// = RSS FEED URL =
|
|
||||||
// ================
|
|
||||||
if ( ! defined( 'AI1EC_RSS_FEED' ) ) {
|
|
||||||
define( 'AI1EC_RSS_FEED', 'https://time.ly/blog/feed/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================
|
|
||||||
// = Language Path =
|
|
||||||
// =================
|
|
||||||
if ( ! defined( 'AI1EC_LANGUAGE_PATH' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_LANGUAGE_PATH',
|
|
||||||
AI1EC_PLUGIN_NAME . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// ================
|
|
||||||
// = Cron Version =
|
|
||||||
// ================
|
|
||||||
if ( ! defined( 'AI1EC_CRON_VERSION' ) ) {
|
|
||||||
define( 'AI1EC_CRON_VERSION', AI1EC_VERSION );
|
|
||||||
}
|
|
||||||
if ( ! defined( 'AI1EC_U_CRON_VERSION' ) ) {
|
|
||||||
define( 'AI1EC_U_CRON_VERSION', AI1EC_VERSION );
|
|
||||||
}
|
|
||||||
if ( ! defined( 'AI1EC_U_CRON_FREQ' ) ) {
|
|
||||||
define( 'AI1EC_U_CRON_FREQ', 'hourly' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============
|
|
||||||
// = Plugin Url =
|
|
||||||
// ==============
|
|
||||||
if ( ! defined( 'AI1EC_URL' ) ) {
|
|
||||||
define( 'AI1EC_URL', $ai1ec_base_url );
|
|
||||||
}
|
|
||||||
// ===============
|
|
||||||
// = VENDOR PATH =
|
|
||||||
// ===============
|
|
||||||
if ( ! defined( 'AI1EC_VENDOR_PATH' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_VENDOR_PATH',
|
|
||||||
AI1EC_PATH . DIRECTORY_SEPARATOR . 'vendor' .
|
|
||||||
DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===============
|
|
||||||
// = ADMIN PATH =
|
|
||||||
// ===============
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_PATH' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_ADMIN_PATH',
|
|
||||||
AI1EC_PATH . DIRECTORY_SEPARATOR . 'public' .
|
|
||||||
DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===============
|
|
||||||
// = ADMIN URL =
|
|
||||||
// ===============
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_ADMIN_URL',
|
|
||||||
AI1EC_URL . '/public/admin/'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============
|
|
||||||
// = CACHE PATH =
|
|
||||||
// ==============
|
|
||||||
if ( ! defined( 'AI1EC_CACHE_PATH' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_CACHE_PATH',
|
|
||||||
AI1EC_PATH . DIRECTORY_SEPARATOR . 'cache' .
|
|
||||||
DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============
|
|
||||||
// = CACHE URL =
|
|
||||||
// ==============
|
|
||||||
if ( ! defined( 'AI1EC_CACHE_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_CACHE_URL',
|
|
||||||
AI1EC_URL . '/cache/'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============
|
|
||||||
// = TWIG CACHE PATH =
|
|
||||||
// ==============
|
|
||||||
if ( ! defined( 'AI1EC_TWIG_CACHE_PATH' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_TWIG_CACHE_PATH',
|
|
||||||
AI1EC_CACHE_PATH . 'twig' .
|
|
||||||
DIRECTORY_SEPARATOR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ======================
|
|
||||||
// = Default theme name =
|
|
||||||
// ======================
|
|
||||||
if ( ! defined( 'AI1EC_DEFAULT_THEME_NAME' ) ) {
|
|
||||||
define( 'AI1EC_DEFAULT_THEME_NAME', 'vortex' );
|
|
||||||
}
|
|
||||||
// ================
|
|
||||||
// = THEME FOLDER =
|
|
||||||
// ================
|
|
||||||
if ( ! defined( 'AI1EC_THEME_FOLDER' ) ) {
|
|
||||||
define( 'AI1EC_THEME_FOLDER', 'themes-ai1ec' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =======================
|
|
||||||
// = DEFAULT THEME PATH =
|
|
||||||
// =======================
|
|
||||||
if ( ! defined( 'AI1EC_DEFAULT_THEME_ROOT' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_DEFAULT_THEME_ROOT',
|
|
||||||
AI1EC_PATH . DIRECTORY_SEPARATOR . 'public' .
|
|
||||||
DIRECTORY_SEPARATOR . AI1EC_THEME_FOLDER
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// =======================
|
|
||||||
// = DEFAULT THEME PATH =
|
|
||||||
// =======================
|
|
||||||
if ( ! defined( 'AI1EC_DEFAULT_THEME_PATH' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_DEFAULT_THEME_PATH',
|
|
||||||
AI1EC_DEFAULT_THEME_ROOT . DIRECTORY_SEPARATOR .
|
|
||||||
AI1EC_DEFAULT_THEME_NAME
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================
|
|
||||||
// = AI1EC Theme URL =
|
|
||||||
// ===================
|
|
||||||
if ( ! defined( 'AI1EC_THEMES_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_THEMES_URL',
|
|
||||||
AI1EC_URL . '/public/' . AI1EC_THEME_FOLDER
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// =====================
|
|
||||||
// = AI1EC Core themes =
|
|
||||||
// =====================
|
|
||||||
if ( ! defined( 'AI1EC_CORE_THEMES' ) ) {
|
|
||||||
define( 'AI1EC_CORE_THEMES', 'vortex,umbra,gamma,plana' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================
|
|
||||||
// = AI1EC Theme URL =
|
|
||||||
// ===================
|
|
||||||
if ( ! defined( 'AI1EC_THEMES_URL' ) ) {
|
|
||||||
define( 'AI1EC_THEMES_URL', AI1EC_URL . '/public/' . AI1EC_THEME_FOLDER . '/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================
|
|
||||||
// = Admin CSS URL =
|
|
||||||
// =================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_THEME_CSS_URL' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_THEME_CSS_URL', AI1EC_URL .'/public/admin/css/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================
|
|
||||||
// = Admin Font URL =
|
|
||||||
// =================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_THEME_FONT_URL' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_THEME_FONT_URL', AI1EC_URL .'/public/admin/font/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================
|
|
||||||
// = Admin Js URL =
|
|
||||||
// =================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_THEME_JS_URL' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_THEME_JS_URL', AI1EC_URL .'/public/js/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============
|
|
||||||
// = POST TYPE =
|
|
||||||
// =============
|
|
||||||
if ( ! defined( 'AI1EC_POST_TYPE' ) ) {
|
|
||||||
define( 'AI1EC_POST_TYPE', 'ai1ec_event' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============
|
|
||||||
// = SCRIPT URL =
|
|
||||||
// ==============
|
|
||||||
if ( ! defined( 'AI1EC_SCRIPT_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_SCRIPT_URL',
|
|
||||||
get_option( 'home' ) . '/?plugin=' . AI1EC_PLUGIN_NAME
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// =========================================
|
|
||||||
// = BASE URL FOR ALL CALENDAR ADMIN PAGES =
|
|
||||||
// =========================================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_BASE_URL' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_BASE_URL', 'edit.php?post_type=' . AI1EC_POST_TYPE );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// =====================================================
|
|
||||||
// = THEME OPTIONS PAGE BASE URL (wrap in admin_url()) =
|
|
||||||
// =====================================================
|
|
||||||
if ( ! defined( 'AI1EC_THEME_OPTIONS_BASE_URL' ) ) {
|
|
||||||
define( 'AI1EC_THEME_OPTIONS_BASE_URL', AI1EC_ADMIN_BASE_URL . '&page=' . AI1EC_PLUGIN_NAME . '-edit-css' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =======================================================
|
|
||||||
// = THEME SELECTION PAGE BASE URL (wrap in admin_url()) =
|
|
||||||
// =======================================================
|
|
||||||
if ( ! defined( 'AI1EC_THEME_SELECTION_BASE_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_THEME_SELECTION_BASE_URL',
|
|
||||||
AI1EC_ADMIN_BASE_URL . '&page=' . AI1EC_PLUGIN_NAME . '-themes'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// =====================================================
|
|
||||||
// = FEED SETTINGS PAGE BASE URL (wrap in admin_url()) =
|
|
||||||
// =====================================================
|
|
||||||
if ( ! defined( 'AI1EC_FEED_SETTINGS_BASE_URL' ) ) {
|
|
||||||
define( 'AI1EC_FEED_SETTINGS_BASE_URL', AI1EC_ADMIN_BASE_URL . '&page=' . AI1EC_PLUGIN_NAME . '-feeds' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================================================
|
|
||||||
// = SETTINGS PAGE BASE URL (wrap in admin_url()) =
|
|
||||||
// ================================================
|
|
||||||
if ( ! defined( 'AI1EC_SETTINGS_BASE_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_SETTINGS_BASE_URL',
|
|
||||||
AI1EC_ADMIN_BASE_URL . '&page=' . AI1EC_PLUGIN_NAME . '-settings'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==============
|
|
||||||
// = EXPORT URL =
|
|
||||||
// ==============
|
|
||||||
if ( ! defined( 'AI1EC_EXPORT_URL' ) ) {
|
|
||||||
// ====================================================
|
|
||||||
// = Convert http:// to webcal:// in AI1EC_SCRIPT_URL =
|
|
||||||
// = (webcal:// protocol does not support https://) =
|
|
||||||
// ====================================================
|
|
||||||
$webcal_url = preg_replace( '/^https?:\/\//', 'webcal://', AI1EC_SCRIPT_URL );
|
|
||||||
define(
|
|
||||||
'AI1EC_EXPORT_URL',
|
|
||||||
$webcal_url . '&controller=ai1ec_exporter_controller' .
|
|
||||||
'&action=export_events'
|
|
||||||
);
|
|
||||||
unset( $webcal_url );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! defined( 'AI1EC_CA_ROOT_PEM' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_CA_ROOT_PEM',
|
|
||||||
AI1EC_PATH . DIRECTORY_SEPARATOR . 'ca_cert' .
|
|
||||||
DIRECTORY_SEPARATOR . 'ca_cert.pem'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ====================
|
|
||||||
// = SPECIAL SETTINGS =
|
|
||||||
// ====================
|
|
||||||
|
|
||||||
// Set AI1EC_EVENT_PLATFORM to TRUE to turn WordPress into an events-only
|
|
||||||
// platform. For a multi-site install, setting this to TRUE is equivalent to a
|
|
||||||
// super-administrator selecting the
|
|
||||||
// "Turn this blog into an events-only platform" checkbox
|
|
||||||
// on the Calendar Settings page of every blog on the network.
|
|
||||||
// This mode, when enabled on blogs where this plugin is active, hides all
|
|
||||||
// administrative functions unrelated to events and the calendar (except to
|
|
||||||
// super-administrators), and sets default WordPress settings appropriate for
|
|
||||||
// pure event management.
|
|
||||||
if ( ! defined( 'AI1EC_EVENT_PLATFORM' ) ) {
|
|
||||||
define( 'AI1EC_EVENT_PLATFORM', false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// If i choose to use the calendar url as the base for events permalinks,
|
|
||||||
// i must specify another name for the events archive.
|
|
||||||
if ( ! defined( 'AI1EC_ALTERNATIVE_ARCHIVE_URL' ) ) {
|
|
||||||
define( 'AI1EC_ALTERNATIVE_ARCHIVE_URL', 'ai1ec_events_archive' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================
|
|
||||||
// = AI1EC Theme URL =
|
|
||||||
// ===================
|
|
||||||
if ( ! defined( 'AI1EC_THEMES_URL_LEGACY' ) ) {
|
|
||||||
define( 'AI1EC_THEMES_URL_LEGACY', WP_CONTENT_URL . '/' . AI1EC_THEME_FOLDER );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================
|
|
||||||
// = Default theme url legacy=
|
|
||||||
// =====================
|
|
||||||
if ( ! defined( 'AI1EC_DEFAULT_THEME_URL_LEGACY' ) ) {
|
|
||||||
define( 'AI1EC_DEFAULT_THEME_URL_LEGACY', AI1EC_THEMES_URL . '/' . AI1EC_DEFAULT_THEME_NAME . '/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================
|
|
||||||
// = Default theme url =
|
|
||||||
// =====================
|
|
||||||
if ( ! defined( 'AI1EC_DEFAULT_THEME_URL' ) ) {
|
|
||||||
define( 'AI1EC_DEFAULT_THEME_URL', AI1EC_THEMES_URL . '/' . AI1EC_DEFAULT_THEME_NAME . '/' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===================
|
|
||||||
// = CSS Folder name =
|
|
||||||
// ===================
|
|
||||||
if ( ! defined( 'AI1EC_CSS_FOLDER' ) ) {
|
|
||||||
define( 'AI1EC_CSS_FOLDER', 'css' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==================
|
|
||||||
// = JS Folder name =
|
|
||||||
// ==================
|
|
||||||
if ( ! defined( 'AI1EC_JS_FOLDER' ) ) {
|
|
||||||
define( 'AI1EC_JS_FOLDER', 'js' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =====================
|
|
||||||
// = Image folder name =
|
|
||||||
// =====================
|
|
||||||
if ( ! defined( 'AI1EC_IMG_FOLDER' ) ) {
|
|
||||||
define( 'AI1EC_IMG_FOLDER', 'img' );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ========================
|
|
||||||
// = Admin theme CSS path =
|
|
||||||
// ========================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_THEME_CSS_PATH' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_THEME_CSS_PATH', AI1EC_ADMIN_PATH . AI1EC_CSS_FOLDER );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =======================
|
|
||||||
// = Admin theme JS path =
|
|
||||||
// =======================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_THEME_JS_PATH' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_THEME_JS_PATH', AI1EC_PATH . DIRECTORY_SEPARATOR . 'public' .
|
|
||||||
DIRECTORY_SEPARATOR . AI1EC_JS_FOLDER );
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================
|
|
||||||
// = Admin IMG URL =
|
|
||||||
// =================
|
|
||||||
if ( ! defined( 'AI1EC_ADMIN_THEME_IMG_URL' ) ) {
|
|
||||||
define( 'AI1EC_ADMIN_THEME_IMG_URL', AI1EC_URL . '/public/admin/' . AI1EC_IMG_FOLDER );
|
|
||||||
}
|
|
||||||
|
|
||||||
// ====================
|
|
||||||
// = Add-ons list URL =
|
|
||||||
// ====================
|
|
||||||
if ( ! defined( 'AI1EC_TIMELY_ADDONS_URI' ) ) {
|
|
||||||
define( 'AI1EC_TIMELY_ADDONS_URI', 'https://time.ly/?action=addons_list' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable All-in-One-Event-Calendar to work in debug mode, which means,
|
|
||||||
// that cache is ignored, extra output may appear at places, etc.
|
|
||||||
// Do not set this to any other value than `false` on production even if
|
|
||||||
// you know what you are doing, because you will waste valuable
|
|
||||||
// resources - save the Earth, at least.
|
|
||||||
if ( ! defined( 'AI1EC_DEBUG' ) ) {
|
|
||||||
define( 'AI1EC_DEBUG', false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable Ai1EC cache functionality. If you set this to false, only cache
|
|
||||||
// that is based on request, will remain active.
|
|
||||||
// This is pointless in any case other than development, where literary
|
|
||||||
// every second refresh needs to take fresh copy of everything.
|
|
||||||
if ( ! defined( 'AI1EC_CACHE' ) ) {
|
|
||||||
define( 'AI1EC_CACHE', true );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! defined( 'AI1EC_DISABLE_FILE_CACHE' ) ) {
|
|
||||||
define( 'AI1EC_DISABLE_FILE_CACHE', false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// A value identifying that cache is not available.
|
|
||||||
// Used in place of actual path for cache to use.
|
|
||||||
// Named constant allows reuse of a single typed variable.
|
|
||||||
if ( ! defined( 'AI1EC_CACHE_UNAVAILABLE' ) ) {
|
|
||||||
define( 'AI1EC_CACHE_UNAVAILABLE', 'AI1EC_CACHE_UNAVAILABLE' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines if backward (<= 2.1.5) theme compatibility is enabled or not.
|
|
||||||
if ( ! defined( 'AI1EC_THEME_COMPATIBILITY_FER' ) ) {
|
|
||||||
define( 'AI1EC_THEME_COMPATIBILITY_FER', true );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines amount of needed free memory to compile LESS files.
|
|
||||||
if ( ! defined( 'AI1EC_LESS_MIN_AVAIL_MEMORY' ) ) {
|
|
||||||
define( 'AI1EC_LESS_MIN_AVAIL_MEMORY', '24M' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines if LESS files are parsed at every request
|
|
||||||
if ( ! defined( 'AI1EC_PARSE_LESS_FILES_AT_EVERY_REQUEST' ) ) {
|
|
||||||
define( 'AI1EC_PARSE_LESS_FILES_AT_EVERY_REQUEST', false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines a list of FER-enabled templates.
|
|
||||||
if ( ! defined( 'AI1EC_FER_ENABLED_TEMPLATES_LIST' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_FER_ENABLED_TEMPLATES_LIST',
|
|
||||||
'agenda,oneday,week,month,posterboard,stream'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines API URL.
|
|
||||||
if ( ! defined( 'AI1EC_API_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_API_URL',
|
|
||||||
'https://api.time.ly/api/'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines Tickets checkout URL.
|
|
||||||
if ( ! defined( 'AI1EC_TICKETS_CHECKOUT_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_TICKETS_CHECKOUT_URL',
|
|
||||||
'https://api.time.ly/events/{event_id}/checkout'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ================================================
|
|
||||||
// = Force WordPress updates command link =
|
|
||||||
// ================================================
|
|
||||||
if ( ! defined( 'AI1EC_FORCE_UPDATES_URL' ) ) {
|
|
||||||
define(
|
|
||||||
'AI1EC_FORCE_UPDATES_URL',
|
|
||||||
AI1EC_ADMIN_BASE_URL . '&ai1ec_force_updates=true'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* This exception is thrown when no constant function is found.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Config
|
|
||||||
*/
|
|
||||||
class Ai1ec_Constants_Not_Set_Exception extends Ai1ec_Exception {
|
|
||||||
}
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Feeds (import and export streams) mediator.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
class Ai1ec_Controller_Calendar_Feeds extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Holds the instances of registered plugins.
|
|
||||||
*/
|
|
||||||
protected $_plugins = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add plugin to the internal array.
|
|
||||||
*
|
|
||||||
* This assure us that the plugins extends our base abstract class.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Connector_Plugin $plugin Plugin to add.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function add_plugin( Ai1ec_Connector_Plugin $plugin ) {
|
|
||||||
$plugin->initialize_settings_if_not_set();
|
|
||||||
$this->_plugins[] = $plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an instance of a plugin class
|
|
||||||
*
|
|
||||||
* @param string $class
|
|
||||||
* @throws Exception
|
|
||||||
* @return Ai1ec_Connector_Plugin
|
|
||||||
*/
|
|
||||||
public function get_plugin_instance( $class ) {
|
|
||||||
foreach ( $this->_plugins as $plugin ) {
|
|
||||||
if( get_class( $plugin ) === $class ) {
|
|
||||||
return $plugin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new Exception( "Class not found" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Give the plugins the possibility to handle data posted in the calendar feeds page
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function handle_feeds_page_post() {
|
|
||||||
// Iterate over the plugins and call the methods
|
|
||||||
foreach ( $this->_plugins as $plugin ) {
|
|
||||||
$plugin->handle_feeds_page_post();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render the tab header for each plugin
|
|
||||||
*
|
|
||||||
* @param $active_feed
|
|
||||||
* The tab that should be visualized
|
|
||||||
*/
|
|
||||||
public function render_tab_headers() {
|
|
||||||
foreach ( $this->_plugins as $plugin ) {
|
|
||||||
$plugin->render_tab_header();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Render the tab body for each plugin
|
|
||||||
*
|
|
||||||
* @param $active_feed
|
|
||||||
* The tab that should be visualized
|
|
||||||
*/
|
|
||||||
public function render_tab_contents() {
|
|
||||||
foreach ( $this->_plugins as $plugin ) {
|
|
||||||
$plugin->render_tab_content();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles strict_compatibility_content_filtering.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.1
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
class Ai1ec_Controller_Content_Filter extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Content filters lib.
|
|
||||||
* @var Ai1ec_Content_Filters
|
|
||||||
*/
|
|
||||||
protected $_content_filter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setting _strict_compatibility_content_filtering.
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
protected $_strict_compatibility_content_filtering;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Registry object.
|
|
||||||
*
|
|
||||||
* @return void Method does not return.
|
|
||||||
*/
|
|
||||||
public function __construct( Ai1ec_Registry_Object $registry ) {
|
|
||||||
parent::__construct( $registry );
|
|
||||||
$this->_content_filter = $registry->get( 'content.filter' );
|
|
||||||
$this->_strict_compatibility_content_filtering =
|
|
||||||
$registry->get( 'model.settings' )
|
|
||||||
->get( 'strict_compatibility_content_filtering' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears all the_content filters excluding few defaults.
|
|
||||||
*
|
|
||||||
* @return void Method does not return.
|
|
||||||
*/
|
|
||||||
public function clear_the_content_filters() {
|
|
||||||
if ( $this->_strict_compatibility_content_filtering ) {
|
|
||||||
$this->_content_filter->clear_the_content_filters();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restores the_content filters.
|
|
||||||
*
|
|
||||||
* @return void Method does not return.
|
|
||||||
*/
|
|
||||||
public function restore_the_content_filters() {
|
|
||||||
if ( $this->_strict_compatibility_content_filtering ) {
|
|
||||||
$this->_content_filter->restore_the_content_filters();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The exception thrown when an engine is not set..
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller.Exception
|
|
||||||
*/
|
|
||||||
class Ai1ec_Engine_Not_Set_Exception extends Ai1ec_Exception {
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The exception thrown when an engine is not set..
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller.Exception
|
|
||||||
*/
|
|
||||||
class Ai1ec_File_Not_Found_Exception extends Ai1ec_Exception {
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class for extensions which are sold.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
abstract class Ai1ec_Base_License_Controller extends Ai1ec_Base_Extension_Controller {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Settings entry name for license key.
|
|
||||||
*/
|
|
||||||
protected $_licence;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Settings entry name for license status output.
|
|
||||||
*/
|
|
||||||
protected $_licence_status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Licensing API endpoint URI.
|
|
||||||
*/
|
|
||||||
protected $_store = 'https://time.ly/';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get label to be used for license input field.
|
|
||||||
*
|
|
||||||
* @return string Localized label field.
|
|
||||||
*/
|
|
||||||
abstract public function get_license_label();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Ai1ec_Registry_Object $registry
|
|
||||||
*/
|
|
||||||
public function initialize_licence_actions() {
|
|
||||||
$this->_register_licence_actions();
|
|
||||||
$this->_register_licence_fields();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the extension tab if not present
|
|
||||||
*
|
|
||||||
* @param array $tabs
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function add_tabs( array $tabs ) {
|
|
||||||
if ( ! isset( $tabs['extensions'] ) ) {
|
|
||||||
$tabs['extensions'] = array(
|
|
||||||
'name' => Ai1ec_I18n::__( 'Add-ons' ),
|
|
||||||
'items' => array(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tabs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register action for licences.
|
|
||||||
*/
|
|
||||||
protected function _register_licence_actions() {
|
|
||||||
$dispatcher = $this->_registry->get( 'event.dispatcher' );
|
|
||||||
// we need the super class so we use get_class()
|
|
||||||
$class = explode( '_', get_class( $this ) );
|
|
||||||
$controller = strtolower( end( $class ) );
|
|
||||||
$dispatcher->register_filter(
|
|
||||||
'ai1ec_add_setting_tabs',
|
|
||||||
array( 'controller.' . $controller, 'add_tabs' )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register fields for licence
|
|
||||||
*/
|
|
||||||
protected function _register_licence_fields() {
|
|
||||||
$plugin_id = $this->get_machine_name();
|
|
||||||
$this->_licence = 'ai1ec_licence_' . $plugin_id;
|
|
||||||
$this->_licence_status = 'ai1ec_licence_status_' . $plugin_id;
|
|
||||||
$options = array(
|
|
||||||
$this->_licence => array(
|
|
||||||
'type' => 'string',
|
|
||||||
'version' => $this->get_version(),
|
|
||||||
'renderer' => array(
|
|
||||||
'class' => 'input',
|
|
||||||
'group-class' => 'ai1ec-col-sm-7',
|
|
||||||
'tab' => 'extensions',
|
|
||||||
'item' => 'licenses',
|
|
||||||
'type' => 'normal',
|
|
||||||
'label' => $this->get_license_label(),
|
|
||||||
'status' => $this->_licence_status,
|
|
||||||
),
|
|
||||||
'default' => '',
|
|
||||||
),
|
|
||||||
$this->_licence_status => array(
|
|
||||||
'type' => 'string',
|
|
||||||
'version' => $this->get_version(),
|
|
||||||
'default' => 'invalid',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
$settings = $this->_registry->get( 'model.settings' );
|
|
||||||
foreach ( $options as $key => $option ) {
|
|
||||||
$renderer = null;
|
|
||||||
if ( isset( $option['renderer'] ) ) {
|
|
||||||
$renderer = $option['renderer'];
|
|
||||||
}
|
|
||||||
$settings->register(
|
|
||||||
$key,
|
|
||||||
$option['default'],
|
|
||||||
$option['type'],
|
|
||||||
$renderer,
|
|
||||||
$option['version']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,291 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Basic extension controller.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
abstract class Ai1ec_Base_Extension_Controller {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Registry_Object
|
|
||||||
*/
|
|
||||||
protected $_registry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $_settings;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Registry_Object
|
|
||||||
*/
|
|
||||||
protected static $_registry_static;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected static $_settings_static;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected static $_schema;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the long name of the extension
|
|
||||||
*/
|
|
||||||
abstract public function get_name();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the machine name of the extension
|
|
||||||
*/
|
|
||||||
abstract public function get_machine_name();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the version of the extension
|
|
||||||
*/
|
|
||||||
abstract public function get_version();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the name of the main plugin file
|
|
||||||
*/
|
|
||||||
abstract public function get_file();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add extension specific settings
|
|
||||||
*/
|
|
||||||
abstract protected function _get_settings();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register action/filters/shortcodes for the extension
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event_Dispatcher $dispatcher
|
|
||||||
*/
|
|
||||||
abstract protected function _register_actions(
|
|
||||||
Ai1ec_Event_Dispatcher $dispatcher
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform the basic compatibility check.
|
|
||||||
*
|
|
||||||
* @param string $ai1ec_version
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function check_compatibility( $ai1ec_version ) {
|
|
||||||
return version_compare(
|
|
||||||
$ai1ec_version,
|
|
||||||
$this->minimum_core_required(),
|
|
||||||
'>='
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function minimum_core_required() {
|
|
||||||
return '2.0.7';
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Removes options when uninstalling the plugin.
|
|
||||||
*/
|
|
||||||
public static function on_uninstall() {
|
|
||||||
global $wpdb;
|
|
||||||
if ( ! current_user_can( 'activate_plugins' ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$settings = self::$_registry_static->get( 'model.settings' );
|
|
||||||
foreach ( self::$_settings_static as $name => $params ) {
|
|
||||||
$settings->remove_option( $name );
|
|
||||||
}
|
|
||||||
$schema = self::$_schema;
|
|
||||||
foreach ( $schema['tables'] as $table_name ) {
|
|
||||||
// Delete table events
|
|
||||||
$wpdb->query( 'DROP TABLE IF EXISTS ' . $table_name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Public constructor
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
global $wpdb;
|
|
||||||
self::$_schema = $this->_get_schema( $wpdb->prefix );
|
|
||||||
$settings = $this->_get_settings();
|
|
||||||
$this->_settings = $settings;
|
|
||||||
self::$_settings_static = $settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* initialize the extension.
|
|
||||||
*/
|
|
||||||
public function init( Ai1ec_Registry_Object $registry ) {
|
|
||||||
$this->_registry = $registry;
|
|
||||||
// static properties are needed as uninstall hook must be static
|
|
||||||
// http://wpseek.com/register_uninstall_hook/
|
|
||||||
self::$_registry_static = $registry;
|
|
||||||
register_deactivation_hook(
|
|
||||||
$this->get_file(),
|
|
||||||
array( $this, 'on_deactivation' )
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->_install_schema( $registry );
|
|
||||||
$this->_register_actions( $registry->get( 'event.dispatcher' ) );
|
|
||||||
$this->_add_settings( $registry->get( 'model.settings' ) );
|
|
||||||
$this->_perform_upgrade( $registry );
|
|
||||||
if ( method_exists( $this, 'initialize_licence_actions' ) ) {
|
|
||||||
$this->initialize_licence_actions();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hides settings on deactivation.
|
|
||||||
*/
|
|
||||||
public function on_deactivation() {
|
|
||||||
if ( ! current_user_can( 'activate_plugins' ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
|
|
||||||
$referer = 'deactivate-plugin_' . $plugin;
|
|
||||||
// if we are disabling the plugin in the exception handler, this can't be done.
|
|
||||||
// but i want to disable options
|
|
||||||
if ( function_exists( '_get_list_table' ) ) {
|
|
||||||
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
|
|
||||||
$action = $wp_list_table->current_action();
|
|
||||||
if ( 'deactivate-selected' === $action ) {
|
|
||||||
$referer = 'bulk-plugins';
|
|
||||||
}
|
|
||||||
check_admin_referer( $referer );
|
|
||||||
}
|
|
||||||
$settings = $this->_registry->get( 'model.settings' );
|
|
||||||
foreach ( $this->_settings as $name => $params ) {
|
|
||||||
$settings->hide_option( $name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the settings
|
|
||||||
*/
|
|
||||||
public function show_settings( Ai1ec_Registry_Object $registry ) {
|
|
||||||
$settings = $registry->get( 'model.settings' );
|
|
||||||
foreach ( $this->_settings as $name => $params ) {
|
|
||||||
if ( isset( $params['renderer'] ) ) {
|
|
||||||
$settings->show_option( $name, $params['renderer'] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$settings->set( 'allow_statistics', true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If extensions need to add tables, they will need to override the function to add a schema.
|
|
||||||
*
|
|
||||||
* @param string $prefix Database prefix to use for table names.
|
|
||||||
*
|
|
||||||
* @return array An array with two keys, schema and tables which are used
|
|
||||||
* for installing and dropping the table.
|
|
||||||
*/
|
|
||||||
protected static function _get_schema( $prefix ) {
|
|
||||||
return array(
|
|
||||||
'tables' => array(),
|
|
||||||
'schema' => '',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performe upgarde actions based on extension version
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry
|
|
||||||
*/
|
|
||||||
protected function _perform_upgrade( Ai1ec_Registry_Object $registry ) {
|
|
||||||
$version_variable = 'ai1ec_' . $this->get_machine_name() .
|
|
||||||
'_version';
|
|
||||||
$option = $registry->get( 'model.option' );
|
|
||||||
$version = $option->get( $version_variable );
|
|
||||||
if ( $version !== $this->get_version() ) {
|
|
||||||
$registry->get( 'model.settings' )->perform_upgrade_actions();
|
|
||||||
$this->_perform_upgrade_actions();
|
|
||||||
$option->set( $version_variable, $this->get_version(), true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function called on add on upgrade.
|
|
||||||
* Can be overridden by add ons for extra behaviour
|
|
||||||
*/
|
|
||||||
protected function _perform_upgrade_actions() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Since the call the to the uninstall hook it's static, if a different behaviour
|
|
||||||
* is needed also this call must be overridden.
|
|
||||||
*/
|
|
||||||
protected function _register_uninstall_hook() {
|
|
||||||
register_uninstall_hook(
|
|
||||||
$this->get_file(),
|
|
||||||
array( get_class( $this ), 'on_uninstall' )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds extension settings
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Settings $settings
|
|
||||||
*/
|
|
||||||
protected function _add_settings( Ai1ec_Settings $settings ) {
|
|
||||||
foreach ( $this->_settings as $name => $params ) {
|
|
||||||
$renderer = null;
|
|
||||||
if ( isset( $params['renderer'] ) ) {
|
|
||||||
$renderer = $params['renderer'];
|
|
||||||
}
|
|
||||||
$settings->register(
|
|
||||||
$name,
|
|
||||||
$params['value'],
|
|
||||||
$params['type'],
|
|
||||||
$renderer,
|
|
||||||
$this->get_version()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the schema needs to be updated
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry
|
|
||||||
* @throws Ai1ec_Database_Update_Exception
|
|
||||||
*/
|
|
||||||
protected function _install_schema( Ai1ec_Registry_Object $registry ) {
|
|
||||||
$option = $registry->get( 'model.option' );
|
|
||||||
$schema = self::$_schema;
|
|
||||||
if (
|
|
||||||
is_admin() &&
|
|
||||||
! empty( $schema['schema'] )
|
|
||||||
) {
|
|
||||||
$db_version_variable = 'ai1ec_' . $this->get_machine_name() .
|
|
||||||
'_db_version';
|
|
||||||
$version = sha1( $schema['schema'] );
|
|
||||||
if (
|
|
||||||
$option->get( $db_version_variable ) !== $version
|
|
||||||
) {
|
|
||||||
if (
|
|
||||||
$registry->get( 'database.helper' )->apply_delta(
|
|
||||||
$schema['schema']
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
$option->set( $db_version_variable, $version );
|
|
||||||
} else {
|
|
||||||
throw new Ai1ec_Database_Update_Exception(
|
|
||||||
'Database upgrade for ' . $this->get_name() .
|
|
||||||
' failed'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,112 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The controller which handles import/export.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
class Ai1ec_Import_Export_Controller {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array The registered engines.
|
|
||||||
*/
|
|
||||||
protected $_engines = array();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Registry_Object
|
|
||||||
*/
|
|
||||||
protected $_registry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Import / export params.
|
|
||||||
*/
|
|
||||||
protected $_params;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This controller is instanciated only if we need to import/export something.
|
|
||||||
*
|
|
||||||
* When it is instanciated it allows other engines to be injected through a
|
|
||||||
* filter. If we do not plan to ship core engines, let's skip the
|
|
||||||
* $core_engines param.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry
|
|
||||||
* @param array $core_engines
|
|
||||||
* @param array $params
|
|
||||||
*/
|
|
||||||
public function __construct(
|
|
||||||
Ai1ec_Registry_Object $registry,
|
|
||||||
array $core_engines = array( 'ics', 'api-ics' ),
|
|
||||||
array $params = array()
|
|
||||||
) {
|
|
||||||
$this->_registry = $registry;
|
|
||||||
$known_engines = apply_filters(
|
|
||||||
'ai1ec_register_import_export_engines',
|
|
||||||
$core_engines
|
|
||||||
);
|
|
||||||
$this->_params = $params;
|
|
||||||
foreach ( $known_engines as $engine ) {
|
|
||||||
$this->register( $engine );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register an import-export engine.
|
|
||||||
*
|
|
||||||
* @param string $engine
|
|
||||||
*/
|
|
||||||
public function register( $engine ) {
|
|
||||||
$this->_engines[$engine] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Import events into the calendar.
|
|
||||||
*
|
|
||||||
* @param string $engine
|
|
||||||
* @param array $args
|
|
||||||
*
|
|
||||||
* @throws Ai1ec_Engine_Not_Set_Exception If the engine is not set.
|
|
||||||
* @throws Ai1ec_Parse_Exception If an error happens during parse.
|
|
||||||
*
|
|
||||||
* @return int The number of imported events
|
|
||||||
*/
|
|
||||||
public function import_events( $engine, array $args ) {
|
|
||||||
if ( ! isset( $this->_engines[$engine] ) ) {
|
|
||||||
throw new Ai1ec_Engine_Not_Set_Exception(
|
|
||||||
'The engine ' . $engine . 'is not registered.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// external engines must register themselves into the registry.
|
|
||||||
$engine = $this->_registry->get( 'import-export.' . $engine );
|
|
||||||
$exception = null;
|
|
||||||
try {
|
|
||||||
return $engine->import( $args );
|
|
||||||
} catch ( Ai1ec_Parse_Exception $parse_exception ) {
|
|
||||||
$exception = $parse_exception;
|
|
||||||
}
|
|
||||||
throw $exception;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Export the events using the specified engine.
|
|
||||||
*
|
|
||||||
* @param string $engine
|
|
||||||
* @param array $args
|
|
||||||
*
|
|
||||||
* @throws Ai1ec_Engine_Not_Set_Exception
|
|
||||||
*/
|
|
||||||
public function export_events( $engine, array $args ) {
|
|
||||||
if ( ! isset( $this->_engines[$engine] ) ) {
|
|
||||||
throw new Ai1ec_Engine_Not_Set_Exception(
|
|
||||||
'The engine ' . $engine . 'is not registered.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// external engines must register themselves into the registry.
|
|
||||||
$engine = $this->_registry->get( 'import-export.' . $engine );
|
|
||||||
return $engine->export( $args, $this->_params );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles Super Widget.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Javascript
|
|
||||||
*/
|
|
||||||
class Ai1ec_Controller_Javascript_Widget extends Ai1ec_Base {
|
|
||||||
|
|
||||||
const WIDGET_PARAMETER = 'ai1ec_js_widget';
|
|
||||||
const LEGACY_WIDGET_PARAMETER = 'ai1ec_super_widget';
|
|
||||||
const WIDGET_JS_CACHE_FILE = '/public/js_cache/ai1ec_js_widget.js';
|
|
||||||
|
|
||||||
protected $_widgets = array();
|
|
||||||
|
|
||||||
|
|
||||||
public function add_widget( $widget_id, $widget_class ) {
|
|
||||||
$this->_widgets[$widget_id] = $widget_class;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_widgets() {
|
|
||||||
return $this->_widgets;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds Super Widget JS to admin screen.
|
|
||||||
*
|
|
||||||
* @param array $files
|
|
||||||
* @param string $page_to_load
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function add_js( array $files, $page_to_load ) {
|
|
||||||
if ( 'admin_settings.js' === $page_to_load ) {
|
|
||||||
$files[] = AI1ECSW_PATH . '/public/js/pages/admin_settings.js';
|
|
||||||
}
|
|
||||||
return $files;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $data
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function add_js_translation( array $data ) {
|
|
||||||
$data['set_calendar_page'] = __(
|
|
||||||
'You must choose the Calendar page before using the Super Widget',
|
|
||||||
AI1EC_PLUGIN_NAME
|
|
||||||
);
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the flag to revalidate cached js files on next render.
|
|
||||||
*/
|
|
||||||
public function revalidate_cache() {
|
|
||||||
$this->_registry->get( 'model.option' )->set( 'jswidgetupdated', '0' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders everything that's needed for the embedded widget.
|
|
||||||
*/
|
|
||||||
public function render_js_widget() {
|
|
||||||
|
|
||||||
if ( isset( $_GET['render'] ) && 'true' === $_GET['render'] ) {
|
|
||||||
if ( isset( $_GET[self::WIDGET_PARAMETER] ) ){
|
|
||||||
$widget = $_GET[self::WIDGET_PARAMETER];
|
|
||||||
} else if ( isset( $_GET[self::LEGACY_WIDGET_PARAMETER] ) ) {
|
|
||||||
$widget = $_GET[self::LEGACY_WIDGET_PARAMETER];
|
|
||||||
}
|
|
||||||
$widget_class = null;
|
|
||||||
if ( isset( $this->_widgets[$widget] ) ) {
|
|
||||||
$widget_class = $this->_widgets[$widget];
|
|
||||||
}
|
|
||||||
if ( null === $widget_class ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$widget_instance = $this->_registry->get( $widget_class );
|
|
||||||
$this->render_content( $widget_instance );
|
|
||||||
} else {
|
|
||||||
if (
|
|
||||||
! $this->_registry->get( 'model.settings' )->get( 'cache_dynamic_js' ) ||
|
|
||||||
'1' != $this->_registry->get( 'model.option' )->get( 'jswidgetupdated' ) ||
|
|
||||||
! $this->_registry->get( 'filesystem.checker' )->check_file_exists(
|
|
||||||
AI1EC_PATH . self::WIDGET_JS_CACHE_FILE,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
$this->render_javascript();
|
|
||||||
} else {
|
|
||||||
header(
|
|
||||||
'Location: '
|
|
||||||
. plugin_dir_url( 'all-in-one-event-calendar/public/js_cache/.' )
|
|
||||||
. 'ai1ec_js_widget.js'
|
|
||||||
);
|
|
||||||
exit( 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function render_javascript() {
|
|
||||||
|
|
||||||
header( 'Content-Type: application/javascript' );
|
|
||||||
header(
|
|
||||||
'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 31536000 ) . ' GMT'
|
|
||||||
);
|
|
||||||
header( 'Cache-Control: public, max-age=31536000' );
|
|
||||||
|
|
||||||
$jscontroller = $this->_registry->get( 'controller.javascript' );
|
|
||||||
$css_controller = $this->_registry->get( 'css.frontend' );
|
|
||||||
$require_main = AI1EC_ADMIN_THEME_JS_PATH . DIRECTORY_SEPARATOR . 'require.js';
|
|
||||||
$widget_file = AI1EC_PATH . '/public/js/widget/common_widget.js';
|
|
||||||
$translation = $jscontroller->get_frontend_translation_data();
|
|
||||||
$page_id = $this->_registry->get(
|
|
||||||
'model.settings'
|
|
||||||
)->get( 'calendar_page_id' );
|
|
||||||
$permalink = get_permalink(
|
|
||||||
$page_id
|
|
||||||
);
|
|
||||||
$full_permalink = $this->_registry->get(
|
|
||||||
'template.link.helper'
|
|
||||||
)->get_full_permalink( $page_id );
|
|
||||||
// load the css to hardcode, saving a call
|
|
||||||
$css_rules = $css_controller->get_compiled_css();
|
|
||||||
$css_rules = addslashes( $css_rules );
|
|
||||||
$translation['permalinks_structure'] = $this->
|
|
||||||
_registry->get( 'model.option' )->get( 'permalink_structure' );
|
|
||||||
$translation['calendar_url'] = preg_replace( '/^https?:/', '', $permalink );
|
|
||||||
$translation['full_calendar_url'] = preg_replace( '/^https?:/', '', $full_permalink );
|
|
||||||
// Let extensions add their scripts.
|
|
||||||
// look at Extended Views or Super Widget for examples
|
|
||||||
$extension_urls = array();
|
|
||||||
$extension_urls = apply_filters(
|
|
||||||
'ai1ec_render_js',
|
|
||||||
$extension_urls,
|
|
||||||
'ai1ec_widget.js'
|
|
||||||
);
|
|
||||||
// Removing http:// or https:// from extension URLs
|
|
||||||
foreach ( $extension_urls as &$extension_url ) {
|
|
||||||
$extension_url = preg_replace( '/https?:/', '', $extension_url );
|
|
||||||
}
|
|
||||||
|
|
||||||
$translation['extension_urls'] = $extension_urls;
|
|
||||||
// the single event page js is loaded dinamically.
|
|
||||||
$translation['event_page'] = array(
|
|
||||||
'id' => 'ai1ec_event',
|
|
||||||
'url' => preg_replace( '/^https?:/', '', AI1EC_URL ) . '/public/js/pages/event.js',
|
|
||||||
);
|
|
||||||
$translation_module = $jscontroller->create_require_js_module(
|
|
||||||
Ai1ec_Javascript_Controller::FRONTEND_CONFIG_MODULE,
|
|
||||||
$translation
|
|
||||||
);
|
|
||||||
// get requirejs
|
|
||||||
$require = file_get_contents( $require_main );
|
|
||||||
$main_widget = file_get_contents( $widget_file );
|
|
||||||
$require_config = $jscontroller->create_require_js_config_object();
|
|
||||||
$config = $jscontroller->create_require_js_module(
|
|
||||||
'ai1ec_config',
|
|
||||||
$jscontroller->get_translation_data()
|
|
||||||
);
|
|
||||||
// get jquery
|
|
||||||
$jquery = $jscontroller->get_jquery_version_based_on_browser(
|
|
||||||
isset( $_SERVER['HTTP_USER_AGENT'] )
|
|
||||||
? $_SERVER['HTTP_USER_AGENT']
|
|
||||||
: ''
|
|
||||||
);
|
|
||||||
|
|
||||||
$domready = $jscontroller->get_module(
|
|
||||||
'domReady.js'
|
|
||||||
);
|
|
||||||
$frontend = $jscontroller->get_module(
|
|
||||||
'scripts/common_scripts/frontend/common_frontend.js'
|
|
||||||
);
|
|
||||||
|
|
||||||
// compress data if possible
|
|
||||||
$compatibility_ob = $this->_registry->get( 'compatibility.ob' );
|
|
||||||
$js = <<<JS
|
|
||||||
/******** Called once Require.js has loaded ******/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
var timely_css = document.createElement( 'style' );
|
|
||||||
timely_css.innerHTML = '$css_rules';
|
|
||||||
( document.getElementsByTagName( "head" )[0] || document.documentElement ).appendChild( timely_css );
|
|
||||||
// bring in requires
|
|
||||||
$require
|
|
||||||
// make timely global
|
|
||||||
window.timely = timely;
|
|
||||||
$require_config
|
|
||||||
// Load other modules
|
|
||||||
$translation_module
|
|
||||||
$config
|
|
||||||
$jquery
|
|
||||||
$frontend
|
|
||||||
|
|
||||||
// start up the widget
|
|
||||||
$main_widget
|
|
||||||
})(); // We call our anonymous function immediately
|
|
||||||
JS;
|
|
||||||
$compatibility_ob->gzip_if_possible( $js );
|
|
||||||
|
|
||||||
if (
|
|
||||||
$this->_registry->get( 'model.settings' )->get( 'cache_dynamic_js' ) &&
|
|
||||||
(
|
|
||||||
'0' === $this->_registry->get( 'model.option' )->get( 'jswidgetupdated' ) ||
|
|
||||||
! $this->_registry->get( 'filesystem.checker' )->check_file_exists(
|
|
||||||
AI1EC_PATH . self::WIDGET_JS_CACHE_FILE,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
$js_path = AI1EC_ADMIN_THEME_JS_PATH . DIRECTORY_SEPARATOR;
|
|
||||||
$js_saved = file_put_contents(
|
|
||||||
$js_path . '../js_cache/ai1ec_js_widget.js',
|
|
||||||
$js
|
|
||||||
);
|
|
||||||
if ( $js_saved ) {
|
|
||||||
$this->_registry->get( 'model.option' )->set( 'jswidgetupdated', '1' );
|
|
||||||
}
|
|
||||||
} catch ( Exception $e ) {
|
|
||||||
$this->_registry->get( 'model.settings' )->set( 'cache_dynamic_js', false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function render_content( Ai1ec_Embeddable $widget_instance ) {
|
|
||||||
$args = array();
|
|
||||||
$defaults = $widget_instance->get_js_widget_configurable_defaults();
|
|
||||||
foreach ( $defaults as $id => $value ) {
|
|
||||||
if ( isset( $_GET[$id] ) ) {
|
|
||||||
$args[$id] = $_GET[$id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$html = $widget_instance->javascript_widget( $args );
|
|
||||||
$jsonp = $this->_registry->get( 'http.response.render.strategy.jsonp' );
|
|
||||||
$jsonp->render(
|
|
||||||
array(
|
|
||||||
'data' => array( 'html' => $html )
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,917 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Controller that handles javascript related functions.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
class Ai1ec_Javascript_Controller {
|
|
||||||
|
|
||||||
// The js handle used when enqueueing
|
|
||||||
const JS_HANDLE = 'ai1ec_requirejs';
|
|
||||||
|
|
||||||
// The namespace for require.js functions
|
|
||||||
const REQUIRE_NAMESPACE = 'timely';
|
|
||||||
|
|
||||||
// the name of the configuration module for the frontend
|
|
||||||
const FRONTEND_CONFIG_MODULE = 'ai1ec_calendar';
|
|
||||||
|
|
||||||
//the name of the get parameter we use for loading js
|
|
||||||
const LOAD_JS_PARAMETER = 'ai1ec_render_js';
|
|
||||||
|
|
||||||
// just load backend scripts
|
|
||||||
const LOAD_ONLY_BACKEND_SCRIPTS = 'common_backend';
|
|
||||||
|
|
||||||
// just load backend scripts
|
|
||||||
const LOAD_ONLY_FRONTEND_SCRIPTS = 'common_frontend';
|
|
||||||
|
|
||||||
// Are we in the backend
|
|
||||||
const IS_BACKEND_PARAMETER = 'is_backend';
|
|
||||||
|
|
||||||
// Are we on the calendar page
|
|
||||||
const IS_CALENDAR_PAGE = 'is_calendar_page';
|
|
||||||
|
|
||||||
// this is the value of IS_BACKEND_PARAMETER which triggers loading of backend script
|
|
||||||
const TRUE_PARAM = 'true';
|
|
||||||
|
|
||||||
// the javascript file for event page
|
|
||||||
const EVENT_PAGE_JS = 'event.js';
|
|
||||||
|
|
||||||
// the javascript file for calendar page
|
|
||||||
const CALENDAR_PAGE_JS = 'calendar.js';
|
|
||||||
|
|
||||||
// the file for the calendar feedsa page
|
|
||||||
const CALENDAR_FEEDS_PAGE = 'calendar_feeds.js';
|
|
||||||
|
|
||||||
// add new event page js
|
|
||||||
const ADD_NEW_EVENT_PAGE = 'add_new_event.js';
|
|
||||||
|
|
||||||
// event category page js
|
|
||||||
const EVENT_CATEGORY_PAGE = 'event_category.js';
|
|
||||||
|
|
||||||
// less variable editing page
|
|
||||||
const LESS_VARIBALES_PAGE = 'less_variables_editing.js';
|
|
||||||
|
|
||||||
// settings page
|
|
||||||
const SETTINGS_PAGE = 'admin_settings.js';
|
|
||||||
|
|
||||||
//widget creator page
|
|
||||||
const WIDGET_CREATOR = 'widget-creator.js';
|
|
||||||
|
|
||||||
//ticketing page
|
|
||||||
const TICKETING = 'ticketing.js';
|
|
||||||
|
|
||||||
//cache file
|
|
||||||
const CALENDAR_JS_CACHE_FILE = '/public/js_cache/calendar.js';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Registry_Object
|
|
||||||
*/
|
|
||||||
private $_registry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The core js pages to load.
|
|
||||||
* Used to avoid errors when extensions add pages.
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $_core_pages = array(
|
|
||||||
self::CALENDAR_FEEDS_PAGE => true,
|
|
||||||
self::ADD_NEW_EVENT_PAGE => true,
|
|
||||||
self::EVENT_CATEGORY_PAGE => true,
|
|
||||||
self::LESS_VARIBALES_PAGE => true,
|
|
||||||
self::SETTINGS_PAGE => true,
|
|
||||||
self::EVENT_PAGE_JS => true,
|
|
||||||
self::CALENDAR_PAGE_JS => true,
|
|
||||||
self::WIDGET_CREATOR => true,
|
|
||||||
self::TICKETING => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds an instance of the settings object
|
|
||||||
*
|
|
||||||
* @var Ai1ec_Settings
|
|
||||||
*/
|
|
||||||
private $_settings;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Locale
|
|
||||||
*/
|
|
||||||
private $_locale;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Scripts
|
|
||||||
*/
|
|
||||||
private $_scripts_helper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Acl_Aco
|
|
||||||
*/
|
|
||||||
private $_aco;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Template_Link_Helper
|
|
||||||
*/
|
|
||||||
private $_template_link_helper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
protected $_frontend_scripts_loaded = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Public constructor.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct( Ai1ec_Registry_Object $registry ) {
|
|
||||||
$this->_registry = $registry;
|
|
||||||
$this->_settings = $registry->get( 'model.settings' );
|
|
||||||
$this->_locale = $registry->get( 'p28n.wpml' );
|
|
||||||
$this->_aco = $registry->get( 'acl.aco' );
|
|
||||||
$this->_template_link_helper = $registry->get( 'template.link.helper' );
|
|
||||||
// this will need to be modified
|
|
||||||
$this->_scripts_helper = $registry->get( 'script.helper' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load javascript files for frontend pages.
|
|
||||||
*
|
|
||||||
* @wp-hook ai1ec_load_frontend_js
|
|
||||||
*
|
|
||||||
* @param $is_calendar_page boolean Whether we are displaying the main
|
|
||||||
* calendar page or not
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function load_frontend_js( $is_calendar_page, $is_shortcode = false ) {
|
|
||||||
$page = null;
|
|
||||||
|
|
||||||
// ======
|
|
||||||
// = JS =
|
|
||||||
// ======
|
|
||||||
if( $this->_are_we_accessing_the_single_event_page() === true ) {
|
|
||||||
$page = self::EVENT_PAGE_JS;
|
|
||||||
}
|
|
||||||
if( $is_calendar_page === true ) {
|
|
||||||
$page = self::CALENDAR_PAGE_JS;
|
|
||||||
}
|
|
||||||
if( null !== $page ) {
|
|
||||||
$this->add_link_to_render_js( $page, false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render the javascript for the appropriate page.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function render_js() {
|
|
||||||
$js_path = AI1EC_ADMIN_THEME_JS_PATH . DIRECTORY_SEPARATOR;
|
|
||||||
$common_js = '';
|
|
||||||
$js_cache = $this->_settings->get( 'cache_dynamic_js' );
|
|
||||||
|
|
||||||
if ( ! isset( $_GET[self::LOAD_JS_PARAMETER] ) ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
$page_to_load = $_GET[self::LOAD_JS_PARAMETER];
|
|
||||||
$scripts_updated = $this->_registry->get( 'model.option' )->get( 'calendarjsupdated' );
|
|
||||||
|
|
||||||
if (
|
|
||||||
$js_cache &&
|
|
||||||
$page_to_load === self::CALENDAR_PAGE_JS &&
|
|
||||||
'1' === $scripts_updated &&
|
|
||||||
$this->_registry->get( 'filesystem.checker' )->check_file_exists(
|
|
||||||
AI1EC_PATH . self::CALENDAR_JS_CACHE_FILE,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
Ai1ec_Http_Response_Helper::stop( 0 );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
isset( $_GET[self::IS_BACKEND_PARAMETER] ) &&
|
|
||||||
$_GET[self::IS_BACKEND_PARAMETER] === self::TRUE_PARAM
|
|
||||||
) {
|
|
||||||
$common_js = file_get_contents( $js_path . 'pages/common_backend.js' );
|
|
||||||
} else if (
|
|
||||||
$page_to_load === self::EVENT_PAGE_JS ||
|
|
||||||
$page_to_load === self::CALENDAR_PAGE_JS ||
|
|
||||||
$page_to_load === self::LOAD_ONLY_FRONTEND_SCRIPTS
|
|
||||||
) {
|
|
||||||
if (
|
|
||||||
$page_to_load === self::LOAD_ONLY_FRONTEND_SCRIPTS &&
|
|
||||||
true === $this->_frontend_scripts_loaded
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( false === $this->_frontend_scripts_loaded ) {
|
|
||||||
$common_js = file_get_contents(
|
|
||||||
$js_path . 'pages/common_frontend.js'
|
|
||||||
);
|
|
||||||
$this->_frontend_scripts_loaded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the config object for Require.js.
|
|
||||||
$require_config = $this->create_require_js_config_object();
|
|
||||||
|
|
||||||
// Load Require.js script.
|
|
||||||
$require = file_get_contents( $js_path . 'require.js' );
|
|
||||||
|
|
||||||
// Load appropriate jQuery script based on browser.
|
|
||||||
$jquery = $this->get_jquery_version_based_on_browser(
|
|
||||||
isset( $_SERVER['HTTP_USER_AGENT'] )
|
|
||||||
? $_SERVER['HTTP_USER_AGENT']
|
|
||||||
: ''
|
|
||||||
);
|
|
||||||
|
|
||||||
// Load the main script for the page.
|
|
||||||
$page_js = '';
|
|
||||||
if ( isset( $this->_core_pages[$page_to_load] ) ) {
|
|
||||||
$page_js = file_get_contents( $js_path . 'pages/' . $page_to_load );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load translation module.
|
|
||||||
$translation = $this->get_frontend_translation_data();
|
|
||||||
$permalink = $this->_template_link_helper
|
|
||||||
->get_permalink( $this->_settings->get( 'calendar_page_id' ) );
|
|
||||||
$full_permalink = $this->_template_link_helper
|
|
||||||
->get_full_permalink( $this->_settings->get( 'calendar_page_id' ) );
|
|
||||||
$translation['calendar_url'] = $permalink;
|
|
||||||
$translation['full_calendar_url'] = $full_permalink;
|
|
||||||
$translation_module = $this->create_require_js_module(
|
|
||||||
self::FRONTEND_CONFIG_MODULE,
|
|
||||||
$translation
|
|
||||||
);
|
|
||||||
|
|
||||||
// Load Ai1ec config script.
|
|
||||||
$config = $this->create_require_js_module(
|
|
||||||
'ai1ec_config',
|
|
||||||
$this->get_translation_data()
|
|
||||||
);
|
|
||||||
|
|
||||||
// Let extensions add their scripts.
|
|
||||||
$extension_files = array();
|
|
||||||
$extension_files = apply_filters(
|
|
||||||
'ai1ec_render_js',
|
|
||||||
$extension_files,
|
|
||||||
$page_to_load
|
|
||||||
);
|
|
||||||
$ext_js = '';
|
|
||||||
|
|
||||||
foreach ( $extension_files as $file ) {
|
|
||||||
$ext_js .= file_get_contents( $file );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finally, load the page_ready script to execute code that must run after
|
|
||||||
// all scripts have been loaded.
|
|
||||||
$page_ready = file_get_contents(
|
|
||||||
$js_path . 'scripts/common_scripts/page_ready.js'
|
|
||||||
);
|
|
||||||
|
|
||||||
$javascript = $require . $require_config . $translation_module .
|
|
||||||
$config . $jquery . $common_js . $ext_js . $page_js . $page_ready;
|
|
||||||
// add to blank spaces to fix issues with js
|
|
||||||
// being truncated onn some installs
|
|
||||||
$javascript .= ' ';
|
|
||||||
|
|
||||||
if (
|
|
||||||
$js_cache &&
|
|
||||||
$page_to_load === self::CALENDAR_PAGE_JS &&
|
|
||||||
(
|
|
||||||
'0' === $scripts_updated ||
|
|
||||||
! $this->_registry->get( 'filesystem.checker' )->check_file_exists(
|
|
||||||
AI1EC_PATH . self::CALENDAR_JS_CACHE_FILE,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
$js_saved = false;
|
|
||||||
try {
|
|
||||||
$js_saved = file_put_contents(
|
|
||||||
$js_path . '../js_cache/' . self::CALENDAR_PAGE_JS,
|
|
||||||
$javascript
|
|
||||||
);
|
|
||||||
if ( $js_saved ) {
|
|
||||||
$this->_registry->get( 'model.option' )->set( 'calendarjsupdated', '1' );
|
|
||||||
}
|
|
||||||
} catch ( Exception $e ) {
|
|
||||||
$this->_settings->set( 'cache_dynamic_js', false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_echo_javascript( $javascript );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the flag to revalidate cached js files on next render.
|
|
||||||
*/
|
|
||||||
public function revalidate_cache() {
|
|
||||||
$this->_registry->get( 'model.option' )->set( 'calendarjsupdated', '0' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a compiled javascript file ( used by extensions )
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function get_module( $name ) {
|
|
||||||
$js_path = AI1EC_ADMIN_THEME_JS_PATH . DIRECTORY_SEPARATOR;
|
|
||||||
return file_get_contents( $js_path . $name );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check what file needs to be loaded and add the correct link.
|
|
||||||
*
|
|
||||||
* @wp-hook init
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function load_admin_js() {
|
|
||||||
// Initialize dashboard view
|
|
||||||
|
|
||||||
$script_to_load = FALSE;
|
|
||||||
if ( $this->are_we_on_calendar_feeds_page() === TRUE ) {
|
|
||||||
// Load script for the importer plugins
|
|
||||||
$script_to_load[] = self::CALENDAR_FEEDS_PAGE;
|
|
||||||
}
|
|
||||||
// Start the scripts for the event category page
|
|
||||||
if ( $this->_are_we_editing_event_categories() === TRUE ) {
|
|
||||||
// Load script required when editing categories
|
|
||||||
$script_to_load[] = self::EVENT_CATEGORY_PAGE;
|
|
||||||
}
|
|
||||||
if ( $this->_are_we_editing_less_variables() === TRUE ) {
|
|
||||||
// Load script required when editing categories
|
|
||||||
$script_to_load[] = self::LESS_VARIBALES_PAGE;
|
|
||||||
}
|
|
||||||
// Load the js needed when you edit an event / add a new event
|
|
||||||
if (
|
|
||||||
true === $this->_are_we_creating_a_new_event() ||
|
|
||||||
true === $this->_are_we_editing_an_event()
|
|
||||||
) {
|
|
||||||
// Load script for adding / modifying events
|
|
||||||
$script_to_load[] = self::ADD_NEW_EVENT_PAGE;
|
|
||||||
}
|
|
||||||
if ( true === $this->_are_we_accessing_the_calendar_settings_page() ) {
|
|
||||||
$script_to_load[] = self::SETTINGS_PAGE;
|
|
||||||
}
|
|
||||||
if ( true === $this->_are_we_creating_widgets() ) {
|
|
||||||
$script_to_load[] = self::WIDGET_CREATOR;
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
true === $this->_are_we_managing_tickets() ||
|
|
||||||
true === $this->_are_we_managing_events_list()
|
|
||||||
) {
|
|
||||||
$script_to_load[] = self::TICKETING;
|
|
||||||
}
|
|
||||||
if ( false === $script_to_load ) {
|
|
||||||
$script_to_load[] = apply_filters( 'ai1ec_backend_js', self::LOAD_ONLY_BACKEND_SCRIPTS );
|
|
||||||
}
|
|
||||||
foreach ($script_to_load as $value) {
|
|
||||||
$this->add_link_to_render_js( $value, true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads version 1.9 or 2.0 of jQuery based on user agent.
|
|
||||||
* If $user_agent is null (due to lack of HTTP header) we always serve
|
|
||||||
* jQuery 2.0.
|
|
||||||
*
|
|
||||||
* @param string $user_agent
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function get_jquery_version_based_on_browser( $user_agent ) {
|
|
||||||
$js_path = AI1EC_ADMIN_THEME_JS_PATH . DIRECTORY_SEPARATOR;
|
|
||||||
$jquery = 'jquery_timely20.js';
|
|
||||||
|
|
||||||
preg_match( '/MSIE (.*?);/', $user_agent, $matches );
|
|
||||||
if ( count( $matches ) > 1 ) {
|
|
||||||
//Then we're using IE
|
|
||||||
$version = (int) $matches[1];
|
|
||||||
if ( $version <= 8 ) {
|
|
||||||
//IE 8 or under!
|
|
||||||
$jquery = 'jquery_timely19.js';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return file_get_contents( $js_path . $jquery );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a requirejs module that can be used for translations
|
|
||||||
*
|
|
||||||
* @param string $object_name
|
|
||||||
* @param array $data
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function create_require_js_module( $object_name, array $data ) {
|
|
||||||
foreach ( (array) $data as $key => $value ) {
|
|
||||||
if ( ! is_scalar( $value ) )
|
|
||||||
continue;
|
|
||||||
$data[$key] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8');
|
|
||||||
}
|
|
||||||
$json_data = json_encode( $data );
|
|
||||||
$prefix = self::REQUIRE_NAMESPACE;
|
|
||||||
$script = "$prefix.define( '$object_name', $json_data );";
|
|
||||||
|
|
||||||
return $script;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the array needed for translation and passing other settings to JS.
|
|
||||||
*
|
|
||||||
* @return $data array the dynamic data array
|
|
||||||
*/
|
|
||||||
public function get_translation_data() {
|
|
||||||
|
|
||||||
$force_ssl_admin = force_ssl_admin();
|
|
||||||
if ( $force_ssl_admin && ! is_ssl() ) {
|
|
||||||
force_ssl_admin( false );
|
|
||||||
}
|
|
||||||
$ajax_url = ai1ec_admin_url( 'admin-ajax.php' );
|
|
||||||
force_ssl_admin( $force_ssl_admin );
|
|
||||||
$settings = $this->_registry->get( 'model.settings' );
|
|
||||||
$locale = $this->_registry->get( 'p28n.wpml' );
|
|
||||||
$blog_timezone = $this->_registry->get( 'model.option' )
|
|
||||||
->get( 'gmt_offset' );
|
|
||||||
$application = $this->_registry->get( 'bootstrap.registry.application' );
|
|
||||||
$data = array(
|
|
||||||
'calendar_feeds_nonce' => wp_create_nonce( 'ai1ec_ics_feed_nonce'),
|
|
||||||
// ICS feed error messages
|
|
||||||
'duplicate_feed_message' => esc_html(
|
|
||||||
Ai1ec_I18n::__( 'This feed is already being imported.' )
|
|
||||||
),
|
|
||||||
'invalid_url_message' => esc_html(
|
|
||||||
Ai1ec_I18n::__( 'Please enter a valid iCalendar URL.' )
|
|
||||||
),
|
|
||||||
'invalid_website_message' => esc_html(
|
|
||||||
Ai1ec_I18n::__( 'Please enter a valid Website URL.' )
|
|
||||||
),
|
|
||||||
'invalid_registration_message' => esc_html(
|
|
||||||
Ai1ec_I18n::__( 'Please enter a valid Registration URL, starting with https:// or http://.' )
|
|
||||||
),
|
|
||||||
'invalid_email_message' => esc_html(
|
|
||||||
Ai1ec_I18n::__( 'Please enter a valid email address.' )
|
|
||||||
),
|
|
||||||
'choose_image_message' => Ai1ec_I18n::__( 'Choose Image' ),
|
|
||||||
'now' => $this->_registry->get( 'date.system' )
|
|
||||||
->current_time(),
|
|
||||||
'size_less_variable_not_ok' => Ai1ec_I18n::__(
|
|
||||||
'The value you have entered is not a valid CSS length.'
|
|
||||||
),
|
|
||||||
'confirm_reset_theme' => Ai1ec_I18n::__(
|
|
||||||
'Are you sure you want to reset your theme options to their default values?'
|
|
||||||
),
|
|
||||||
'error_message_not_valid_lat' => Ai1ec_I18n::__(
|
|
||||||
'Please enter a valid latitude. A valid latitude is comprised between +90 and -90.'
|
|
||||||
),
|
|
||||||
'error_message_not_valid_long' => Ai1ec_I18n::__(
|
|
||||||
'Please enter a valid longitude. A valid longitude is comprised between +180 and -180.'
|
|
||||||
),
|
|
||||||
'error_message_not_entered_lat' => Ai1ec_I18n::__(
|
|
||||||
'When the "Input coordinates" checkbox is checked, "Latitude" is a required field.'
|
|
||||||
),
|
|
||||||
'error_message_not_entered_long' => Ai1ec_I18n::__(
|
|
||||||
'When the "Input coordinates" checkbox is checked, "Longitude" is a required field.'
|
|
||||||
),
|
|
||||||
'ai1ec_contact_url_not_valid' => Ai1ec_I18n::__(
|
|
||||||
'The URL you have entered in the <b>Organizer Contact Info</b> > <b>Website URL</b> seems to be invalid.'
|
|
||||||
),
|
|
||||||
'ai1ec_ticket_ext_url_not_valid' => Ai1ec_I18n::__(
|
|
||||||
'The URL you have entered in the <b>Event Cost and Tickets</b> > <b>Tickets or Registration URL</b> seems to be invalid.'
|
|
||||||
),
|
|
||||||
'ai1ec_contact_email_not_valid' => Ai1ec_I18n::__(
|
|
||||||
'The Email you have entered in the <b>Organizer Contact Info</b> > <b>E-mail</b> seems to be invalid.'
|
|
||||||
),
|
|
||||||
'general_url_not_valid' => Ai1ec_I18n::__(
|
|
||||||
'Please remember that URLs must start with either "http://" or "https://".'
|
|
||||||
),
|
|
||||||
'calendar_loading' => Ai1ec_I18n::__(
|
|
||||||
'Loading…'
|
|
||||||
),
|
|
||||||
'ticketing_required_fields' => Ai1ec_I18n::__(
|
|
||||||
'<b>Required or incorrect fields for Ticketing are outlined red.</b>'
|
|
||||||
),
|
|
||||||
'ticketing_repeat_not_supported' => Ai1ec_I18n::__( '<b>The Repeat option was selected but recurrence is not supported by Event with Tickets.</b>'
|
|
||||||
),
|
|
||||||
'ticketing_no_tickets_included' => Ai1ec_I18n::__( '<b>
|
|
||||||
The Event has the cost option Tickets selected but no ticket was included.</b>'
|
|
||||||
),
|
|
||||||
'discovery_event_success' => Ai1ec_I18n::__(
|
|
||||||
'Event was imported successfully.'
|
|
||||||
),
|
|
||||||
'discovery_event_error' => Ai1ec_I18n::__(
|
|
||||||
'An error occurred when importing event. Please, try later.'
|
|
||||||
),
|
|
||||||
'language' => $this->_registry->get( 'p28n.wpml' )->get_lang(),
|
|
||||||
'ajax_url' => $ajax_url,
|
|
||||||
// 24h time format for time pickers
|
|
||||||
'twentyfour_hour' => $settings->get( 'input_24h_time' ),
|
|
||||||
// Date format for date pickers
|
|
||||||
'date_format' => $settings->get( 'input_date_format' ),
|
|
||||||
// Names for months in date picker header (escaping is done in wp_localize_script)
|
|
||||||
'month_names' => $locale->get_localized_month_names(),
|
|
||||||
// Names for days in date picker header (escaping is done in wp_localize_script)
|
|
||||||
'day_names' => $locale->get_localized_week_names(),
|
|
||||||
// Start the week on this day in the date picker
|
|
||||||
'week_start_day' => $settings->get( 'week_start_day' ),
|
|
||||||
'week_view_starts_at' => $settings->get( 'week_view_starts_at' ),
|
|
||||||
'week_view_ends_at' => $settings->get( 'week_view_ends_at' ),
|
|
||||||
'google_maps_api_key' => $settings->get( 'google_maps_api_key' ),
|
|
||||||
'blog_timezone' => $blog_timezone,
|
|
||||||
'affix_filter_menu' => $settings->get( 'affix_filter_menu' ),
|
|
||||||
'affix_vertical_offset_md' => $settings->get( 'affix_vertical_offset_md' ),
|
|
||||||
'affix_vertical_offset_lg' => $settings->get( 'affix_vertical_offset_lg' ),
|
|
||||||
'affix_vertical_offset_sm' => $settings->get( 'affix_vertical_offset_sm' ),
|
|
||||||
'affix_vertical_offset_xs' => $settings->get( 'affix_vertical_offset_xs' ),
|
|
||||||
'calendar_page_id' => $settings->get( 'calendar_page_id' ),
|
|
||||||
'region' => ( $settings->get( 'geo_region_biasing' ) ) ? $locale->get_region() : '',
|
|
||||||
'site_url' => trailingslashit(
|
|
||||||
ai1ec_get_site_url()
|
|
||||||
),
|
|
||||||
'javascript_widgets' => array(),
|
|
||||||
'widget_creator' => array(
|
|
||||||
'preview' => Ai1ec_I18n::__( 'Preview:' ),
|
|
||||||
'preview_loading' => Ai1ec_I18n::__(
|
|
||||||
'Loading preview <i class="ai1ec-fa ai1ec-fa-spin ai1ec-fa-spinner"></i>'
|
|
||||||
)
|
|
||||||
),
|
|
||||||
'ticketing' => array(
|
|
||||||
'details' => Ai1ec_I18n::__( 'Ticketing Details' ),
|
|
||||||
'hide_details' => Ai1ec_I18n::__( 'Hide Ticketing Details' ),
|
|
||||||
'loading_details' => Ai1ec_I18n::__( 'Loading tickets details...' ),
|
|
||||||
'type_and_price' => Ai1ec_I18n::__( 'Type and price' ),
|
|
||||||
'info' => Ai1ec_I18n::__( 'Info' ),
|
|
||||||
'information' => Ai1ec_I18n::__( 'Information' ),
|
|
||||||
'report' => Ai1ec_I18n::__( 'Report' ),
|
|
||||||
'sale_dates' => Ai1ec_I18n::__( 'Sale dates' ),
|
|
||||||
'limits' => Ai1ec_I18n::__( 'Limits' ),
|
|
||||||
'actions' => Ai1ec_I18n::__( 'Actions' ),
|
|
||||||
'sold' => Ai1ec_I18n::__( 'Sold:' ),
|
|
||||||
'left' => Ai1ec_I18n::__( 'Left:' ),
|
|
||||||
'start' => Ai1ec_I18n::__( 'Start:' ),
|
|
||||||
'end' => Ai1ec_I18n::__( 'End:' ),
|
|
||||||
'min' => Ai1ec_I18n::__( 'Min:' ),
|
|
||||||
'max' => Ai1ec_I18n::__( 'Max:' ),
|
|
||||||
'attendees' => Ai1ec_I18n::__( 'Attendees' ),
|
|
||||||
'hide_attendees' => Ai1ec_I18n::__( 'Hide Attendees' ),
|
|
||||||
'attendees_list' => Ai1ec_I18n::__( 'Attendees List' ),
|
|
||||||
'guest_name' => Ai1ec_I18n::__( 'Guest Name' ),
|
|
||||||
'status' => Ai1ec_I18n::__( 'Status' ),
|
|
||||||
'email' => Ai1ec_I18n::__( 'Email' ),
|
|
||||||
'no_attendees' => Ai1ec_I18n::__( 'No attendees for this ticket type.' ),
|
|
||||||
'edit' => Ai1ec_I18n::__( 'Edit' ),
|
|
||||||
'code' => Ai1ec_I18n::__( 'Code' ),
|
|
||||||
'unlimited' => Ai1ec_I18n::__( 'Unlimited' ),
|
|
||||||
'open_for_sale' => Ai1ec_I18n::__( 'Open for sale' ),
|
|
||||||
'no_delete_text' => Ai1ec_I18n::__( 'You have sold tickets for this ticket type. Please change it\'s status to "Canceled" and make refunds to all users that purchased tickets.' ),
|
|
||||||
'cancel_message' => Ai1ec_I18n::__( 'You have sold tickets for this ticket type. Please make refunds to all users that purchased tickets' )
|
|
||||||
),
|
|
||||||
'review' => array(
|
|
||||||
'message_sent' => Ai1ec_I18n::__( 'Your message has been sent. Thank you for your feedback.' ),
|
|
||||||
'message_error' => Ai1ec_I18n::__( 'Your message has not been sent. Please try again or contact us.' )
|
|
||||||
),
|
|
||||||
'load_views_error' => Ai1ec_I18n::__(
|
|
||||||
'Something went wrong while fetching events.<br>The request status is: %STATUS% <br>The error thrown was: %ERROR%'
|
|
||||||
),
|
|
||||||
'load_views_error_popup_title' => Ai1ec_I18n::__( 'Response text received from server' ),
|
|
||||||
'load_views_error_link_popup' => Ai1ec_I18n::__( 'Click here for technical details' ),
|
|
||||||
'cookie_path' => $this->_registry->get(
|
|
||||||
'cookie.utility'
|
|
||||||
)->get_path_for_cookie(),
|
|
||||||
'disable_autocompletion' => $settings->get( 'disable_autocompletion' ),
|
|
||||||
'end_must_be_after_start' => __( 'The end date can\'t be earlier than the start date.', AI1EC_PLUGIN_NAME ),
|
|
||||||
'show_at_least_six_hours' => __( 'For week and day view, you must select an interval of at least 6 hours.', AI1EC_PLUGIN_NAME ),
|
|
||||||
'ai1ec_permalinks_enabled' => $application->get( 'permalinks_enabled' ),
|
|
||||||
);
|
|
||||||
return apply_filters( 'ai1ec_js_translations', $data );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the array with translated data for the frontend
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function get_frontend_translation_data() {
|
|
||||||
$data = array(
|
|
||||||
'export_url' => AI1EC_EXPORT_URL,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Replace desired CSS selector with calendar, if selector has been set
|
|
||||||
$calendar_selector = $this->_settings->get( 'calendar_css_selector' );
|
|
||||||
if( $calendar_selector ) {
|
|
||||||
$page = get_post(
|
|
||||||
$this->_settings->get( 'calendar_page_id' )
|
|
||||||
);
|
|
||||||
$data['selector'] = $calendar_selector;
|
|
||||||
$data['title'] = $page->post_title;
|
|
||||||
}
|
|
||||||
|
|
||||||
// DEPRECATED: Only still here for backwards compatibility with Ai1ec 1.x.
|
|
||||||
$data['fonts'] = array();
|
|
||||||
$fonts_dir = AI1EC_DEFAULT_THEME_URL . 'font_css/';
|
|
||||||
$data['fonts'][] = array(
|
|
||||||
'name' => 'League Gothic',
|
|
||||||
'url' => $fonts_dir . 'font-league-gothic.css',
|
|
||||||
);
|
|
||||||
$data['fonts'][] = array(
|
|
||||||
'name' => 'fontawesome',
|
|
||||||
'url' => $fonts_dir . 'font-awesome.css',
|
|
||||||
);
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Echoes the Javascript if not cached.
|
|
||||||
*
|
|
||||||
* Echoes the javascript with the correct content.
|
|
||||||
* Since the content is dinamic, i use the hash function.
|
|
||||||
*
|
|
||||||
* @param string $javascript
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function _echo_javascript( $javascript ) {
|
|
||||||
$conditional_get = new HTTP_ConditionalGet( array(
|
|
||||||
'contentHash' => md5( $javascript )
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$conditional_get->sendHeaders();
|
|
||||||
if ( ! $conditional_get->cacheIsValid ) {
|
|
||||||
$http_encoder = $this->_registry->get(
|
|
||||||
'http.encoder',
|
|
||||||
array(
|
|
||||||
'content' => $javascript,
|
|
||||||
'type' => 'text/javascript'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$compression_level = null;
|
|
||||||
if ( $this->_registry->get( 'model.settings' )->get( 'disable_gzip_compression' ) ) {
|
|
||||||
// set the compression level to 0 to disable it.
|
|
||||||
$compression_level = 0;
|
|
||||||
}
|
|
||||||
$http_encoder->encode( $compression_level );
|
|
||||||
$http_encoder->sendAll();
|
|
||||||
}
|
|
||||||
Ai1ec_Http_Response_Helper::stop( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the config object for requirejs.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function create_require_js_config_object() {
|
|
||||||
$js_url = AI1EC_ADMIN_THEME_JS_URL;
|
|
||||||
$version = AI1EC_VERSION;
|
|
||||||
$namespace = self::REQUIRE_NAMESPACE;
|
|
||||||
$config = <<<JSC
|
|
||||||
$namespace.require.config( {
|
|
||||||
waitSeconds : 15,
|
|
||||||
urlArgs : 'ver=$version',
|
|
||||||
baseUrl : '$js_url'
|
|
||||||
} );
|
|
||||||
JSC;
|
|
||||||
return $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we are in the calendar feeds page
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are in the calendar feeds page FALSE otherwise
|
|
||||||
*/
|
|
||||||
public function are_we_on_calendar_feeds_page() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : FALSE;
|
|
||||||
$page = isset( $_GET['page'] ) ? $_GET['page'] : FALSE;
|
|
||||||
if( $post_type === FALSE || $page === FALSE ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
$is_calendar_feed_page = $path_details['basename'] === 'edit.php' &&
|
|
||||||
$post_type === 'ai1ec_event' &&
|
|
||||||
$page === 'all-in-one-event-calendar-feeds';
|
|
||||||
return $is_calendar_feed_page;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the link to render the javascript
|
|
||||||
*
|
|
||||||
* @param string $page
|
|
||||||
* @param boolean $backend
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function add_link_to_render_js( $page, $backend ) {
|
|
||||||
$load_backend_script = 'false';
|
|
||||||
if ( true === $backend ) {
|
|
||||||
$load_backend_script = self::TRUE_PARAM;
|
|
||||||
}
|
|
||||||
$is_calendar_page = false;
|
|
||||||
if(
|
|
||||||
true === is_page( $this->_settings->get( 'calendar_page_id' ) ) ||
|
|
||||||
self::CALENDAR_PAGE_JS === $page
|
|
||||||
) {
|
|
||||||
$is_calendar_page = self::TRUE_PARAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
$url = add_query_arg(
|
|
||||||
array(
|
|
||||||
// Add the page to load
|
|
||||||
self::LOAD_JS_PARAMETER => $page,
|
|
||||||
// If we are in the backend, we must load the common scripts
|
|
||||||
self::IS_BACKEND_PARAMETER => $load_backend_script,
|
|
||||||
// If we are on the calendar page we must load the correct option
|
|
||||||
self::IS_CALENDAR_PAGE => $is_calendar_page,
|
|
||||||
),
|
|
||||||
trailingslashit( ai1ec_get_site_url() )
|
|
||||||
);
|
|
||||||
if (
|
|
||||||
$this->_settings->get( 'cache_dynamic_js' ) &&
|
|
||||||
$is_calendar_page &&
|
|
||||||
'1' === $this->_registry->get( 'model.option' )->get( 'calendarjsupdated' ) &&
|
|
||||||
$this->_registry->get( 'filesystem.checker' )->check_file_exists(
|
|
||||||
AI1EC_PATH . self::CALENDAR_JS_CACHE_FILE,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
$url = plugin_dir_url( 'all-in-one-event-calendar/public/js_cache/.' ) . $page;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( true === $backend ) {
|
|
||||||
$this->_scripts_helper->enqueue_script(
|
|
||||||
self::JS_HANDLE,
|
|
||||||
$url,
|
|
||||||
array( 'postbox' ),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->_scripts_helper->enqueue_script(
|
|
||||||
self::JS_HANDLE,
|
|
||||||
$url,
|
|
||||||
array(),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check if we are editing an event
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are editing an event FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_editing_an_event() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$post_id = isset( $_GET['post'] ) ? $_GET['post'] : FALSE;
|
|
||||||
$action = isset( $_GET['action'] ) ? $_GET['action'] : FALSE;
|
|
||||||
if( $post_id === FALSE || $action === FALSE ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$editing = (
|
|
||||||
'post.php' === $path_details['basename'] &&
|
|
||||||
'edit' === $action &&
|
|
||||||
$this->_aco->is_our_post_type( $post_id )
|
|
||||||
);
|
|
||||||
return $editing;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check if we are viewing events list
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are on the events list FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_managing_events_list() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : FALSE;
|
|
||||||
if ( FALSE === $post_type ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
$page = isset( $_GET['page'] ) ? $_GET['page'] : '';
|
|
||||||
$events_list = (
|
|
||||||
'edit.php' === $path_details['basename'] &&
|
|
||||||
'ai1ec_event' === $post_type &&
|
|
||||||
ai1ec_is_blank( $page )
|
|
||||||
);
|
|
||||||
return $events_list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check if we are creating a new event
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are creating a new event FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_creating_a_new_event() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
|
|
||||||
return $path_details['basename'] === 'post-new.php' &&
|
|
||||||
$post_type === AI1EC_POST_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we are accessing the settings page
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are accessing the settings page FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_accessing_the_calendar_settings_page() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$page = isset( $_GET['page'] ) ? $_GET['page'] : '';
|
|
||||||
return $path_details['basename'] === 'edit.php' &&
|
|
||||||
$page === AI1EC_PLUGIN_NAME . '-settings';
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _are_we_creating_widgets() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$page = isset( $_GET['page'] ) ? $_GET['page'] : '';
|
|
||||||
return $path_details['basename'] === 'edit.php' &&
|
|
||||||
$page === AI1EC_PLUGIN_NAME . '-widget-creator';
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _are_we_managing_tickets() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$page = isset( $_GET['page'] ) ? $_GET['page'] : '';
|
|
||||||
return $path_details['basename'] === 'edit.php' &&
|
|
||||||
$page === AI1EC_PLUGIN_NAME . '-tickets';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we are editing less variables
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are accessing a single event page FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_editing_less_variables() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$page = isset( $_GET['page'] ) ? $_GET['page'] : '';
|
|
||||||
return $path_details['basename'] === 'edit.php' && $page === AI1EC_PLUGIN_NAME . '-edit-css';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we are accessing the events category page
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are accessing the events category page FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_editing_event_categories() {
|
|
||||||
if ( !isset( $_SERVER['SCRIPT_NAME'] ) ) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$path_details = pathinfo( $_SERVER['SCRIPT_NAME'] );
|
|
||||||
$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
|
|
||||||
return (
|
|
||||||
$path_details['basename'] === 'edit-tags.php' ||
|
|
||||||
$path_details['basename'] === 'term.php'
|
|
||||||
) && $post_type === AI1EC_POST_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we are accessing a single event page
|
|
||||||
*
|
|
||||||
* @return boolean TRUE if we are accessing a single event page FALSE otherwise
|
|
||||||
*/
|
|
||||||
private function _are_we_accessing_the_single_event_page() {
|
|
||||||
return $this->_aco->is_our_post_type();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller that handles shutdown functions.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Controller
|
|
||||||
*/
|
|
||||||
class Ai1ec_Shutdown_Controller {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Map of object names and class names they represent to preserve
|
|
||||||
*/
|
|
||||||
protected $_preserve = array(
|
|
||||||
'wpdb' => 'wpdb',
|
|
||||||
'wp_object_cache' => 'WP_Object_Cache',
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Map of object names and their representation from global scope
|
|
||||||
*/
|
|
||||||
protected $_restorables = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array List of callbacks to be executed during shutdown sequence
|
|
||||||
*/
|
|
||||||
protected $_callbacks = array();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor
|
|
||||||
*
|
|
||||||
* Here processing of globals is made - values are replaced, callbacks
|
|
||||||
* are executed and globals are restored to the previous state.
|
|
||||||
*
|
|
||||||
* @return void Destructor does not return
|
|
||||||
*/
|
|
||||||
public function __destruct() {
|
|
||||||
// replace globals from our internal store
|
|
||||||
$restore = array();
|
|
||||||
foreach ( $this->_preserve as $name => $class ) {
|
|
||||||
if (
|
|
||||||
! isset( $GLOBALS[$name] ) ||
|
|
||||||
! ( $GLOBALS[$name] instanceof $class )
|
|
||||||
) {
|
|
||||||
$restore[$name] = NULL;
|
|
||||||
if ( isset( $GLOBALS[$name] ) ) {
|
|
||||||
$restore[$name] = $GLOBALS[$name];
|
|
||||||
}
|
|
||||||
$GLOBALS[$name] = $this->_restorables[$name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// execute callbacks
|
|
||||||
foreach ( $this->_callbacks as $callback ) {
|
|
||||||
call_user_func( $callback );
|
|
||||||
}
|
|
||||||
// restore globals to previous state
|
|
||||||
foreach ( $restore as $name => $object ) {
|
|
||||||
if ( NULL === $object ) {
|
|
||||||
unset( $GLOBALS[$name] );
|
|
||||||
} else {
|
|
||||||
$GLOBALS[$name] = $object;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// destroy local references
|
|
||||||
foreach ( $this->_restorables as $name => $object ) {
|
|
||||||
unset( $object, $this->_restorables[$name] );
|
|
||||||
}
|
|
||||||
if ( AI1EC_DEBUG ) {
|
|
||||||
// __destruct is called twice if facebook extension is installed
|
|
||||||
// still can't find the reason, this fixes it but prevent other plugins
|
|
||||||
// __destruct() so let's just use it in dev until we fix this.
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register a callback to be executed during shutdown sequence
|
|
||||||
*
|
|
||||||
* @param callback $callback Valid PHP callback
|
|
||||||
*
|
|
||||||
* @return Ai1ec_Shutdown_Utility Self instance for chaining
|
|
||||||
*/
|
|
||||||
public function register( $callback ) {
|
|
||||||
$this->_callbacks[] = $callback;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* Here global variables are referenced locally to ensure their preservation
|
|
||||||
*
|
|
||||||
* @return void Constructor does not return
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
foreach ( $this->_preserve as $name => $class ) {
|
|
||||||
$this->_restorables[$name] = $GLOBALS[$name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,622 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Common class for Timely API communication.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.4
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
abstract class Ai1ec_Api_Abstract extends Ai1ec_App {
|
|
||||||
|
|
||||||
const WP_OPTION_KEY = 'ai1ec_api_settings';
|
|
||||||
const DEFAULT_TIMEOUT = 30;
|
|
||||||
|
|
||||||
protected $_settings;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post construction routine.
|
|
||||||
*
|
|
||||||
* Override this method to perform post-construction tasks.
|
|
||||||
*
|
|
||||||
* @return void Return from this method is ignored.
|
|
||||||
*/
|
|
||||||
protected function _initialize() {
|
|
||||||
$this->_settings = $this->_registry->get( 'model.settings' );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function get_ticketing_settings( $find_attribute = null, $default_value_attribute = null ) {
|
|
||||||
$api_settings = get_option( self::WP_OPTION_KEY, null );
|
|
||||||
if ( ! is_array( $api_settings ) ) {
|
|
||||||
$api_settings = array(
|
|
||||||
'enabled' => $this->_settings->get( 'ticketing_enabled' ),
|
|
||||||
'message' => $this->_settings->get( 'ticketing_message' ),
|
|
||||||
'token' => $this->_settings->get( 'ticketing_token' ),
|
|
||||||
'calendar_id' => $this->_settings->get( 'ticketing_calendar_id' )
|
|
||||||
);
|
|
||||||
update_option( self::WP_OPTION_KEY, $api_settings );
|
|
||||||
$this->_settings->set( 'ticketing_message' , '' );
|
|
||||||
$this->_settings->set( 'ticketing_enabled' , false );
|
|
||||||
$this->_settings->set( 'ticketing_token' , '' );
|
|
||||||
$this->_settings->set( 'ticketing_calendar_id', null );
|
|
||||||
}
|
|
||||||
if ( is_null( $find_attribute ) ) {
|
|
||||||
return $api_settings;
|
|
||||||
} else {
|
|
||||||
if ( isset( $api_settings[$find_attribute] ) ) {
|
|
||||||
return $api_settings[$find_attribute];
|
|
||||||
} else {
|
|
||||||
return $default_value_attribute;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param String $message last message received from the Sign up or Sign in process
|
|
||||||
* @param bool $enabled true or false is ticket is enabled
|
|
||||||
* @param string $token autenthication token
|
|
||||||
* @param int @calendar_id remote id of the calendar
|
|
||||||
* @param string $account Email used to create the account
|
|
||||||
*/
|
|
||||||
protected function save_ticketing_settings( $message, $enabled, $token, $calendar_id, $account ) {
|
|
||||||
$api_settings = $this->get_ticketing_settings();
|
|
||||||
$api_settings['message'] = $message;
|
|
||||||
$api_settings['enabled'] = $enabled;
|
|
||||||
$api_settings['token'] = $token;
|
|
||||||
$api_settings['calendar_id'] = $calendar_id;
|
|
||||||
$api_settings['account'] = $account;
|
|
||||||
return update_option( self::WP_OPTION_KEY, $api_settings );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function clear_ticketing_settings() {
|
|
||||||
delete_option( self::WP_OPTION_KEY );
|
|
||||||
|
|
||||||
// Clear transient API data
|
|
||||||
delete_transient( 'ai1ec_api_feeds_subscriptions' );
|
|
||||||
delete_transient( 'ai1ec_api_subscriptions' );
|
|
||||||
delete_transient( 'ai1ec_api_features' );
|
|
||||||
delete_transient( 'ai1ec_api_checked' );
|
|
||||||
|
|
||||||
$this->check_settings();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the Payment settings localy (same saved on the API)
|
|
||||||
* @param array Preferences to save
|
|
||||||
*/
|
|
||||||
public function save_payment_settings( array $values ) {
|
|
||||||
$api_settings = $this->get_ticketing_settings();
|
|
||||||
if ( null !== $values ) {
|
|
||||||
$api_settings['payment_settings'] = $values;
|
|
||||||
} else {
|
|
||||||
unset( $api_settings['payment_settings'] );
|
|
||||||
}
|
|
||||||
return update_option( self::WP_OPTION_KEY, $api_settings );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the saved payments settings (the same saved on the API)
|
|
||||||
*/
|
|
||||||
public function get_payment_settings() {
|
|
||||||
return $this->get_ticketing_settings( 'payment_settings' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the current WP instance has payments settings configured
|
|
||||||
*/
|
|
||||||
public function has_payment_settings() {
|
|
||||||
$payment_settings = $this->get_payment_settings();
|
|
||||||
if ( null === $payment_settings ) {
|
|
||||||
//code to migrate the settings save on ticketing api and
|
|
||||||
//bring them to the core side
|
|
||||||
$payment_settings = $this->get_payment_preferences();
|
|
||||||
if ( is_object( $payment_settings ) ) {
|
|
||||||
$payment_settings = (array) $payment_settings;
|
|
||||||
}
|
|
||||||
$this->save_payment_settings( (array) $payment_settings );
|
|
||||||
}
|
|
||||||
return ( null !== $payment_settings &&
|
|
||||||
'paypal' === $payment_settings['payment_method'] &&
|
|
||||||
false === ai1ec_is_blank( $payment_settings['paypal_email'] ) ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response from API, or empty defaults
|
|
||||||
*/
|
|
||||||
public function get_payment_preferences() {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
$settings = null;
|
|
||||||
if ( 0 < $calendar_id ) {
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . "calendars/$calendar_id/payment",
|
|
||||||
null, //no body
|
|
||||||
true //decode response body
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$settings = $response->body;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( is_null( $settings ) ) {
|
|
||||||
return (object) array( 'payment_method'=>'paypal', 'paypal_email'=> '', 'first_name'=>'', 'last_name'=>'', 'currency'=> 'USD' );
|
|
||||||
} else {
|
|
||||||
if ( ! isset( $settings->currency ) ) {
|
|
||||||
$settings->currency = 'USD';
|
|
||||||
}
|
|
||||||
return $settings;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function get_timely_token() {
|
|
||||||
return $this->get_ticketing_settings( 'token' );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function save_calendar_id ( $calendar_id ) {
|
|
||||||
$api_settings = $this->get_ticketing_settings();
|
|
||||||
$api_settings['calendar_id'] = $calendar_id;
|
|
||||||
return update_option( self::WP_OPTION_KEY, $api_settings );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the header array with authorization token
|
|
||||||
*/
|
|
||||||
protected function _get_headers( $custom_headers = null ) {
|
|
||||||
$headers = array(
|
|
||||||
'Content-Type' => 'application/x-www-form-urlencoded'
|
|
||||||
);
|
|
||||||
$headers['Authorization'] = 'Basic ' . $this->get_ticketing_settings( 'token', '' );
|
|
||||||
if ( null !== $custom_headers ) {
|
|
||||||
foreach ( $custom_headers as $key => $value ) {
|
|
||||||
if ( null === $value ) {
|
|
||||||
unset( $headers[$key] );
|
|
||||||
} else {
|
|
||||||
$headers[$key] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a standarized message to return
|
|
||||||
* 1) If the API respond with http code 400 and with a JSON body, so, we will consider the API message to append in the base message.
|
|
||||||
* 2) If the API does not responde with http code 400 or does not have a valid a JSON body, we will show the API URL and the http message error.
|
|
||||||
*/
|
|
||||||
protected function _transform_error_message( $base_message, $response, $url, $ask_for_reload = false ) {
|
|
||||||
$api_error = $this->get_api_error_msg( $response );
|
|
||||||
$result = null;
|
|
||||||
if ( false === ai1ec_is_blank( $api_error ) ) {
|
|
||||||
$result = sprintf(
|
|
||||||
__( '%s.<br/>Detail: %s.', AI1EC_PLUGIN_NAME ),
|
|
||||||
$base_message, $api_error
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
if ( is_wp_error( $response ) ) {
|
|
||||||
$error_message = sprintf(
|
|
||||||
__( 'API URL: %s.<br/>Detail: %s', AI1EC_PLUGIN_NAME ),
|
|
||||||
$url,
|
|
||||||
$response->get_error_message()
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$error_message = sprintf(
|
|
||||||
__( 'API URL: %s.<br/>Detail: %s - %s', AI1EC_PLUGIN_NAME ),
|
|
||||||
$url,
|
|
||||||
wp_remote_retrieve_response_code( $response ),
|
|
||||||
wp_remote_retrieve_response_message( $response )
|
|
||||||
);
|
|
||||||
$mailto = '<a href="mailto:labs@time.ly" target="_top">labs@time.ly</a>';
|
|
||||||
if ( true === $ask_for_reload ) {
|
|
||||||
$result = sprintf(
|
|
||||||
__( '%s. Please reload this page to try again. If this error persists, please contact us at %s. In your report please include the information below.<br/>%s.', AI1EC_PLUGIN_NAME ),
|
|
||||||
$base_message,
|
|
||||||
$mailto,
|
|
||||||
$error_message
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$result = sprintf(
|
|
||||||
__( '%s. Please try again. If this error persists, please contact us at %s. In your report please include the information below.<br/>%s.', AI1EC_PLUGIN_NAME ),
|
|
||||||
$base_message,
|
|
||||||
$mailto,
|
|
||||||
$error_message
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$result = trim( $result );
|
|
||||||
$result = str_replace( '..', '.', $result );
|
|
||||||
$result = str_replace( '.,', '.', $result );
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for the API message error
|
|
||||||
*/
|
|
||||||
public function get_api_error_msg( $response ) {
|
|
||||||
if ( isset( $response ) && false === is_wp_error( $response ) ) {
|
|
||||||
$response_body = json_decode( $response['body'], true );
|
|
||||||
if ( is_array( $response_body ) &&
|
|
||||||
isset( $response_body['errors'] ) ) {
|
|
||||||
$errors = $response_body['errors'];
|
|
||||||
if ( false === is_array( $errors )) {
|
|
||||||
$errors = array( $errors );
|
|
||||||
}
|
|
||||||
$messages = null;
|
|
||||||
foreach ($errors as $key => $value) {
|
|
||||||
if ( false === ai1ec_is_blank( $value ) ) {
|
|
||||||
if ( is_array( $value ) ) {
|
|
||||||
$value = implode ( ', ', $value );
|
|
||||||
}
|
|
||||||
$messages[] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( null !== $messages && false === empty( $messages ) ) {
|
|
||||||
return implode ( ', ', $messages);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the ticket calendar from settings, if the calendar does not exists in
|
|
||||||
* settings, then we will try to find on the API
|
|
||||||
* @return string JSON.
|
|
||||||
*/
|
|
||||||
protected function _get_ticket_calendar( $createIfNotExists = true ) {
|
|
||||||
$ticketing_calendar_id = $this->get_ticketing_settings( 'calendar_id', 0 );
|
|
||||||
if ( 0 < $ticketing_calendar_id ) {
|
|
||||||
return $ticketing_calendar_id;
|
|
||||||
} else {
|
|
||||||
if ( ! $createIfNotExists ) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// Try to find the calendar in the API
|
|
||||||
$ticketing_calendar_id = $this->_find_user_calendar();
|
|
||||||
if ( 0 < $ticketing_calendar_id ) {
|
|
||||||
$this->save_calendar_id( $ticketing_calendar_id );
|
|
||||||
|
|
||||||
return $ticketing_calendar_id;
|
|
||||||
} else {
|
|
||||||
// If the calendar doesn't exist in the API, create a new one
|
|
||||||
$ticketing_calendar_id = $this->_create_calendar();
|
|
||||||
if ( 0 < $ticketing_calendar_id ) {
|
|
||||||
$this->save_calendar_id( $ticketing_calendar_id );
|
|
||||||
|
|
||||||
return $ticketing_calendar_id;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the existent calendar when the user is signing in
|
|
||||||
*/
|
|
||||||
protected function _find_user_calendar() {
|
|
||||||
$body = array(
|
|
||||||
'title' => get_bloginfo( 'name' ),
|
|
||||||
'url' => ai1ec_site_url()
|
|
||||||
);
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars', $body );
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
if ( is_array( $response->body ) ) {
|
|
||||||
return $response->body[0]->id;
|
|
||||||
} else {
|
|
||||||
return $response->body->id;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a calendar when the user is signup
|
|
||||||
*/
|
|
||||||
protected function _create_calendar() {
|
|
||||||
$body = array(
|
|
||||||
'title' => get_bloginfo( 'name' ),
|
|
||||||
'url' => ai1ec_site_url(),
|
|
||||||
'timezone' => $this->_settings->get( 'timezone_string' )
|
|
||||||
);
|
|
||||||
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars', $body );
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
return $response->body->id;
|
|
||||||
} else {
|
|
||||||
$this->log_error( $response, 'Created calendar' );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the current WP instance is signed into the API
|
|
||||||
*/
|
|
||||||
public function is_signed() {
|
|
||||||
return ( true === $this->get_ticketing_settings( 'enabled', false ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function check_settings( $force = false ) {
|
|
||||||
$checked = get_transient( 'ai1ec_api_checked' );
|
|
||||||
|
|
||||||
if ( false === $checked || $force ) {
|
|
||||||
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
|
||||||
|
|
||||||
$failList = array();
|
|
||||||
foreach ( Ai1ec_Api_Features::$features as $key => $value ) {
|
|
||||||
if ( empty( $value ) ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( ( ! $this->is_signed() || ! $this->has_subscription_active( $key ) ) && call_user_func( 'is'.'_'.'pl'.'ug'.'in'.'_'.'ac'.'ti'.'ve', $value ) ) {
|
|
||||||
$failList[] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( count( $failList ) > 0 ) {
|
|
||||||
call_user_func( 'de'.'act'.'iv'.'ate'.'_'.'pl'.'ug'.'ins', $failList );
|
|
||||||
|
|
||||||
$message = 'Your ' .
|
|
||||||
'All-in-One Event Calendar ' .
|
|
||||||
'has the ' .
|
|
||||||
'following ' .
|
|
||||||
'plugins ' .
|
|
||||||
'installed ' .
|
|
||||||
'but they are ' .
|
|
||||||
'disabled. '.
|
|
||||||
'To keep ' .
|
|
||||||
'them ' .
|
|
||||||
'enabled'.
|
|
||||||
', simply '.
|
|
||||||
'keep ' .
|
|
||||||
'your calendar ' .
|
|
||||||
'logged in ' .
|
|
||||||
'to your '.
|
|
||||||
'Timely account.' .
|
|
||||||
'<br /><br />';
|
|
||||||
|
|
||||||
foreach ( $failList as $failed ) {
|
|
||||||
$pieces = explode( '/', $failed );
|
|
||||||
$message .= '- ' . $pieces[0] . '<br />';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->show_error( $message );
|
|
||||||
}
|
|
||||||
|
|
||||||
set_transient( 'ai1ec_api_checked', true, 5 * 60 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current email account
|
|
||||||
*/
|
|
||||||
public function get_current_account() {
|
|
||||||
return $this->get_ticketing_settings( 'account', '' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current calendar id
|
|
||||||
*/
|
|
||||||
public function get_current_calendar() {
|
|
||||||
return $this->get_ticketing_settings( 'calendar_id', 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the last message return by Signup or Signup process
|
|
||||||
*/
|
|
||||||
public function get_sign_message() {
|
|
||||||
return $this->get_ticketing_settings( 'message', '' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear the last message return by Signup or Signup process
|
|
||||||
*/
|
|
||||||
public function clear_sign_message() {
|
|
||||||
$api_settings = $this->get_ticketing_settings();
|
|
||||||
$api_settings['message'] = '';
|
|
||||||
return update_option( self::WP_OPTION_KEY, $api_settings );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array List of subscriptions and limits
|
|
||||||
*/
|
|
||||||
protected function get_subscriptions( $force_refresh = false ) {
|
|
||||||
$subscriptions = get_transient( 'ai1ec_api_subscriptions' );
|
|
||||||
|
|
||||||
if ( false === $subscriptions || $force_refresh || ( defined( 'AI1EC_DEBUG' ) && AI1EC_DEBUG ) ) {
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $this->_get_ticket_calendar() . '/subscriptions',
|
|
||||||
null,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$subscriptions = (array) $response->body;
|
|
||||||
} else {
|
|
||||||
$subscriptions = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save for 5 minutes
|
|
||||||
$minutes = 5;
|
|
||||||
set_transient( 'ai1ec_api_subscriptions', $subscriptions, $minutes * 60 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $subscriptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if calendar should have a specific feature enabled
|
|
||||||
*/
|
|
||||||
public function has_subscription_active( $feature ) {
|
|
||||||
$subscriptions = $this->get_subscriptions();
|
|
||||||
|
|
||||||
return array_key_exists( $feature, $subscriptions );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if feature has reached its limit
|
|
||||||
*/
|
|
||||||
public function subscription_has_reached_limit( $feature ) {
|
|
||||||
$has_reached_limit = true;
|
|
||||||
|
|
||||||
$provided = $this->subscription_get_quantity_limit( $feature );
|
|
||||||
$used = $this->subscription_get_used_quantity( $feature );
|
|
||||||
|
|
||||||
if ( $provided - $used > 0 ) {
|
|
||||||
$has_reached_limit = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $has_reached_limit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get feature quantity limit
|
|
||||||
*/
|
|
||||||
public function subscription_get_quantity_limit( $feature ) {
|
|
||||||
$provided = 0;
|
|
||||||
|
|
||||||
$subscriptions = $this->get_subscriptions();
|
|
||||||
|
|
||||||
if ( array_key_exists( $feature, $subscriptions ) ) {
|
|
||||||
$quantity = (array) $subscriptions[$feature];
|
|
||||||
|
|
||||||
$provided = $quantity['provided'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $provided;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get feature used quantity
|
|
||||||
*/
|
|
||||||
public function subscription_get_used_quantity( $feature ) {
|
|
||||||
$used = 0;
|
|
||||||
|
|
||||||
$subscriptions = $this->get_subscriptions();
|
|
||||||
|
|
||||||
if ( array_key_exists( $feature, $subscriptions ) ) {
|
|
||||||
$quantity = (array) $subscriptions[$feature];
|
|
||||||
|
|
||||||
$used = $quantity['used'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $used;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make the request to the API endpons
|
|
||||||
* @param $url The end part of the url to make the request.
|
|
||||||
* $body The body to send the message
|
|
||||||
* $method POST | GET | PUT, etc
|
|
||||||
* or send a customized message to be showed in case of error
|
|
||||||
* $decode_response_body TRUE (default) to decode the body response
|
|
||||||
* @return stdClass with the the fields:
|
|
||||||
* is_error TRUE or FALSE
|
|
||||||
* error in case of is_error be true
|
|
||||||
* body in case of is_error be false
|
|
||||||
*/
|
|
||||||
protected function request_api( $method, $url, $body = null, $decode_response_body = true, $custom_headers = null ) {
|
|
||||||
$request = array(
|
|
||||||
'method' => $method,
|
|
||||||
'accept' => 'application/json',
|
|
||||||
'headers' => $this->_get_headers( $custom_headers ),
|
|
||||||
'timeout' => self::DEFAULT_TIMEOUT
|
|
||||||
);
|
|
||||||
if ( ! is_null( $body ) ) {
|
|
||||||
$request['body'] = $body;
|
|
||||||
}
|
|
||||||
$response = wp_remote_request( $url, $request );
|
|
||||||
$result = new stdClass();
|
|
||||||
$result->url = $url;
|
|
||||||
$result->raw = $response;
|
|
||||||
if ( is_wp_error( $response ) ) {
|
|
||||||
$result->is_error = true;
|
|
||||||
$result->error = $response->get_error_message();
|
|
||||||
} else {
|
|
||||||
$result->response_code = wp_remote_retrieve_response_code( $response );
|
|
||||||
if ( 200 === $result->response_code ) {
|
|
||||||
if ( true === $decode_response_body ) {
|
|
||||||
$result->body = json_decode( $response['body'] );
|
|
||||||
if ( false === is_null( $result->body ) ) {
|
|
||||||
$result->is_error = false;
|
|
||||||
} else {
|
|
||||||
$result->is_error = true;
|
|
||||||
$result->error = __( 'Error decoding the response', AI1EC_PLUGIN_NAME );
|
|
||||||
unset( $result->body );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result->is_error = false;
|
|
||||||
$result->body = $response['body'];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result->is_error = true;
|
|
||||||
$result->error = wp_remote_retrieve_response_message( $response );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make a post request to the api
|
|
||||||
* @param rest_endpoint Partial URL that can include {calendar_id} that will be replaced by the current calendar signed
|
|
||||||
*/
|
|
||||||
public function call_api( $method, $endpoint, $body = null, $decode_response_body = true, $custom_headers = null ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$url = AI1EC_API_URL . str_replace( '{calendar_id}', $calendar_id, $endpoint );
|
|
||||||
return $this->request_api( $method, $url, $body, $decode_response_body, $custom_headers );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save an error notification to be showed to the user on WP header of the page
|
|
||||||
* @param $response The response got from request_api method.
|
|
||||||
* $custom_error_message The custom message to show before the detailed message
|
|
||||||
* @return full error message
|
|
||||||
*/
|
|
||||||
protected function save_error_notification( $response, $custom_error_response ) {
|
|
||||||
$error_message = $this->_transform_error_message(
|
|
||||||
$custom_error_response,
|
|
||||||
$response->raw,
|
|
||||||
$response->url,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
$response->error_message = $error_message;
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store( $error_message, 'error', 0, array( Ai1ec_Notification_Admin::RCPT_ADMIN ), false );
|
|
||||||
error_log( $custom_error_response . ': ' . $error_message . ' - raw error: ' . print_r( $response->raw, true ) );
|
|
||||||
return $error_message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save an error notification to be showed to the user on WP header of the page
|
|
||||||
* @param $response The response got from request_api method.
|
|
||||||
* $custom_error_message The custom message to show before the detailed message
|
|
||||||
* @return full error message
|
|
||||||
*/
|
|
||||||
protected function log_error( $response, $custom_error_response ) {
|
|
||||||
$error_message = $this->_transform_error_message(
|
|
||||||
$custom_error_response,
|
|
||||||
$response->raw,
|
|
||||||
$response->url,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
error_log( $custom_error_response . ': ' . $error_message . ' - raw error: ' . print_r( $response->raw, true ) );
|
|
||||||
return $error_message;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function show_error( $error_message ) {
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store( $error_message, 'error', 0, array( Ai1ec_Notification_Admin::RCPT_ADMIN ), false );
|
|
||||||
error_log( $error_message);
|
|
||||||
return $error_message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Useful method to check if the response of request_api is a successful message
|
|
||||||
*/
|
|
||||||
public function is_response_success( $response ) {
|
|
||||||
return $response != null &&
|
|
||||||
( !isset( $response->is_error ) || ( isset( $response->is_error ) && false === $response->is_error ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
class Ai1ec_Api_Features {
|
|
||||||
|
|
||||||
const CODE_API_ACCESS = 'api-access';
|
|
||||||
const CODE_TICKETING = 'ticketing';
|
|
||||||
const CODE_TWITTER = 'twitter';
|
|
||||||
const CODE_FRONTEND_SUBMISSIONS = 'frontend-submissions';
|
|
||||||
const CODE_CSV_IMPORT = 'csv-import';
|
|
||||||
const CODE_SUPER_WIDGET = 'super-widget';
|
|
||||||
const CODE_EXTENDED_VIEWS = 'extended-views';
|
|
||||||
const CODE_BIG_FILTERING = 'big-filtering';
|
|
||||||
const CODE_CUSTOM_FILTERS = 'custom-filter-groups';
|
|
||||||
const CODE_DISCOVER_EVENTS = 'discover-events';
|
|
||||||
const CODE_EVENT_PROMOTE = 'event-promote';
|
|
||||||
const CODE_FACEBOOK_INTEGRATION = 'facebook-integration';
|
|
||||||
const CODE_FEATURED_EVENTS = 'featured-events';
|
|
||||||
const CODE_MAILCHIMP = 'mailchimp';
|
|
||||||
const CODE_PHRASE_OVERRIDE = 'phrase-override';
|
|
||||||
const CODE_POPOVERS = 'popovers';
|
|
||||||
const CODE_SAVE_AND_SHARE = 'save-and-share';
|
|
||||||
const CODE_VENUES = 'venues';
|
|
||||||
const CODE_IMPORT_FEEDS = 'import-feeds';
|
|
||||||
|
|
||||||
public static $features = array(
|
|
||||||
self::CODE_API_ACCESS => '',
|
|
||||||
self::CODE_TICKETING => '',
|
|
||||||
self::CODE_TWITTER => 'all-in-one-event-calendar-twitter-integration/all-in-one-event-calendar-twitter-integration.php',
|
|
||||||
self::CODE_FRONTEND_SUBMISSIONS => 'all-in-one-event-calendar-frontend-submissions/all-in-one-event-calendar-frontend-submissions.php',
|
|
||||||
self::CODE_CSV_IMPORT => 'all-in-one-event-calendar-csv-feed/all-in-one-event-calendar-csv-feed.php',
|
|
||||||
self::CODE_SUPER_WIDGET => 'all-in-one-event-calendar-super-widget/all-in-one-event-calendar-super-widget.php',
|
|
||||||
self::CODE_EXTENDED_VIEWS => 'all-in-one-event-calendar-extended-views/all-in-one-event-calendar-extended-views.php',
|
|
||||||
self::CODE_BIG_FILTERING => 'all-in-one-event-calendar-big-filtering/all-in-one-event-calendar-big-filtering.php',
|
|
||||||
self::CODE_CUSTOM_FILTERS => 'all-in-one-event-calendar-custom-filter-groups/all-in-one-event-calendar-custom-filter-groups.php',
|
|
||||||
self::CODE_DISCOVER_EVENTS => '',
|
|
||||||
self::CODE_EVENT_PROMOTE => 'all-in-one-event-calendar-event-promote/all-in-one-event-calendar-event-promote.php',
|
|
||||||
self::CODE_FACEBOOK_INTEGRATION => 'all-in-one-event-calendar-facebook-integration/all-in-one-event-calendar-facebook-integration.php',
|
|
||||||
self::CODE_FEATURED_EVENTS => 'all-in-one-event-calendar-featured-events/all-in-one-event-calendar-featured-events.php',
|
|
||||||
self::CODE_MAILCHIMP => 'all-in-one-event-calendar-mailchimp/all-in-one-event-calendar-mailchimp.php',
|
|
||||||
self::CODE_PHRASE_OVERRIDE => 'all-in-one-event-calendar-phrase-override/all-in-one-event-calendar-phrase-override.php',
|
|
||||||
self::CODE_POPOVERS => 'all-in-one-event-calendar-popovers/all-in-one-event-calendar-popovers.php',
|
|
||||||
self::CODE_SAVE_AND_SHARE => 'all-in-one-event-calendar-save-and-share/all-in-one-event-calendar-save-and-share.php',
|
|
||||||
self::CODE_VENUES => 'all-in-one-event-calendar-venue/all-in-one-event-calendar-venue.php',
|
|
||||||
self::CODE_IMPORT_FEEDS => '',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,321 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for Timely API communication related to Discover Events and Feeds.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.4
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Api_Feeds extends Ai1ec_Api_Abstract {
|
|
||||||
|
|
||||||
// Feed status
|
|
||||||
// c = Feed not migrated yet to API
|
|
||||||
// a = Feed migrated to API (all events)
|
|
||||||
// b = Feed migrated to API (individual events were selected)
|
|
||||||
public static $FEED_NOT_MIGRATED_CODE = 'c';
|
|
||||||
public static $FEED_API_ALL_EVENTS_CODE = 'a';
|
|
||||||
public static $FEED_API_SOME_EVENTS_CODE = 'b';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post construction routine.
|
|
||||||
*
|
|
||||||
* Override this method to perform post-construction tasks.
|
|
||||||
*
|
|
||||||
* @return void Return from this method is ignored.
|
|
||||||
*/
|
|
||||||
protected function _initialize() {
|
|
||||||
parent::_initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get static var (for PHP 5.2 compatibility)
|
|
||||||
*
|
|
||||||
* @param String $var
|
|
||||||
*/
|
|
||||||
public function getStaticVar($var) {
|
|
||||||
return self::$$var;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getting a suggested events list.
|
|
||||||
* @return stClass Response using the following format:
|
|
||||||
* [total] => 10
|
|
||||||
* [per_page] => 8
|
|
||||||
* [current_page] => 1
|
|
||||||
* [last_page] => 2
|
|
||||||
* [next_page_url] =>
|
|
||||||
* [prev_page_url] =>
|
|
||||||
* [from] => 1
|
|
||||||
* [to] => 8
|
|
||||||
* [data] => Array list of suggested events
|
|
||||||
*/
|
|
||||||
public function get_suggested_events() {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
throw new Exception( 'Calendar ID not found' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$body = null;
|
|
||||||
if (
|
|
||||||
isset( $_POST[ 'lat' ] ) &&
|
|
||||||
isset( $_POST[ 'lng' ] ) &&
|
|
||||||
isset( $_POST[ 'radius' ] )
|
|
||||||
) {
|
|
||||||
$body = array(
|
|
||||||
'lat' => $_POST[ 'lat' ],
|
|
||||||
'lng' => $_POST[ 'lng' ],
|
|
||||||
'radius' => $_POST[ 'radius' ]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$page = isset( $_POST[ 'page' ] ) ? $_POST[ 'page' ] : 1;
|
|
||||||
$max = isset( $_POST[ 'max' ] ) ? $_POST[ 'max' ] : 8;
|
|
||||||
$term = isset( $_POST[ 'term' ] ) && $_POST[ 'term' ]
|
|
||||||
? urlencode( $_POST[ 'term' ] )
|
|
||||||
: '*';
|
|
||||||
$location = isset( $_POST[ 'location' ] ) && $_POST[ 'location' ]
|
|
||||||
? '&location=' . urlencode( $_POST[ 'location' ] )
|
|
||||||
: '';
|
|
||||||
|
|
||||||
$url = AI1EC_API_URL .
|
|
||||||
"calendars/$calendar_id/discover/events?page=$page&max=$max&term=$term" .
|
|
||||||
$location;
|
|
||||||
|
|
||||||
$response = $this->request_api( 'GET', $url,
|
|
||||||
$body,
|
|
||||||
true //decode body response
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
return $response->body;
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification(
|
|
||||||
$response,
|
|
||||||
__( 'We were unable to get the Suggested Events from Time.ly Network', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
throw new Exception( 'We were unable to get the Suggested Events from Time.ly Network' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call the API to Process and Import the Feed
|
|
||||||
*/
|
|
||||||
public function import_feed( $entry ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
throw new Exception( 'Calendar ID not found' );
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/import',
|
|
||||||
array(
|
|
||||||
'url' => $entry['feed_url'],
|
|
||||||
'categories' => $entry['feed_category'],
|
|
||||||
'tags' => $entry['feed_tags'],
|
|
||||||
'allow_comments' => $entry['comments_enabled'],
|
|
||||||
'show_maps' => $entry['map_display_enabled'],
|
|
||||||
'import_any_tag_and_categories' => $entry['keep_tags_categories'],
|
|
||||||
'preserve_imported_events' => $entry['keep_old_events'],
|
|
||||||
'assign_default_utc' => $entry['import_timezone']
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
// Refresh list of subscriptions and limits
|
|
||||||
$this->get_subscriptions( true );
|
|
||||||
|
|
||||||
return $response->body;
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification(
|
|
||||||
$response,
|
|
||||||
__( 'We were unable to import feed', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call the API to get the feed
|
|
||||||
*/
|
|
||||||
public function get_feed( $feed_id ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
throw new Exception( 'Calendar ID not found' );
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/get/' . $feed_id,
|
|
||||||
array( 'max' => '9999' )
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
return $response->body;
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification(
|
|
||||||
$response,
|
|
||||||
__( 'We were unable to get feed data', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call the API to get list of feed subscriptions
|
|
||||||
*/
|
|
||||||
public function get_feed_subscriptions( $force_refresh = false ) {
|
|
||||||
$feeds_subscriptions = get_transient( 'ai1ec_api_feeds_subscriptions' );
|
|
||||||
|
|
||||||
if ( $force_refresh || false === $feeds_subscriptions ) {
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $this->_get_ticket_calendar() . '/feeds/list',
|
|
||||||
null,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$feeds_subscriptions = (array) $response->body;
|
|
||||||
} else {
|
|
||||||
$feeds_subscriptions = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save for 5 minutes
|
|
||||||
$minutes = 5;
|
|
||||||
set_transient( 'ai1ec_api_feeds_subscriptions', $feeds_subscriptions, $minutes * 60 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $feeds_subscriptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sync feed subscriptions
|
|
||||||
*/
|
|
||||||
public function get_and_sync_feed_subscriptions() {
|
|
||||||
$feeds_subscriptions = $this->get_feed_subscriptions();
|
|
||||||
|
|
||||||
$db = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
$table_name = $db->get_table_name( 'ai1ec_event_feeds' );
|
|
||||||
|
|
||||||
// Select all feeds
|
|
||||||
$rows = $db->select(
|
|
||||||
$table_name,
|
|
||||||
array(
|
|
||||||
'feed_id',
|
|
||||||
'feed_url',
|
|
||||||
'feed_name',
|
|
||||||
'feed_category',
|
|
||||||
'feed_tags',
|
|
||||||
'comments_enabled',
|
|
||||||
'map_display_enabled',
|
|
||||||
'keep_tags_categories',
|
|
||||||
'keep_old_events',
|
|
||||||
'import_timezone'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Iterate over API response
|
|
||||||
foreach( $feeds_subscriptions as $api_feed ) {
|
|
||||||
$found = false;
|
|
||||||
|
|
||||||
foreach ( $rows as $row ) {
|
|
||||||
// Check if URL is the same
|
|
||||||
if ( trim( $row->feed_url ) === trim( $api_feed->url ) ) {
|
|
||||||
$found = true;
|
|
||||||
|
|
||||||
// Update feed
|
|
||||||
$db->update(
|
|
||||||
$table_name,
|
|
||||||
array(
|
|
||||||
'comments_enabled' => $api_feed->allow_comments,
|
|
||||||
'map_display_enabled' => $api_feed->show_maps,
|
|
||||||
'keep_tags_categories' => $api_feed->import_any_tag_and_categories,
|
|
||||||
'keep_old_events' => $api_feed->preserve_imported_events,
|
|
||||||
'import_timezone' => $api_feed->assign_default_utc,
|
|
||||||
'feed_name' => $api_feed->feed_id
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'feed_id' => $row->feed_id
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not found in local database.. Insert
|
|
||||||
if ( ! $found ) {
|
|
||||||
$entry = array(
|
|
||||||
'feed_url' => $api_feed->url,
|
|
||||||
'feed_name' => $api_feed->feed_id,
|
|
||||||
'feed_category' => $api_feed->categories,
|
|
||||||
'feed_tags' => $api_feed->tags,
|
|
||||||
'comments_enabled' => $api_feed->allow_comments,
|
|
||||||
'map_display_enabled' => $api_feed->show_maps,
|
|
||||||
'keep_tags_categories' => $api_feed->import_any_tag_and_categories,
|
|
||||||
'keep_old_events' => $api_feed->preserve_imported_events,
|
|
||||||
'import_timezone' => $api_feed->assign_default_utc
|
|
||||||
);
|
|
||||||
$format = array( '%s', '%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d' );
|
|
||||||
$db->insert(
|
|
||||||
$table_name,
|
|
||||||
$entry,
|
|
||||||
$format
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call the API to subscribe feed
|
|
||||||
*/
|
|
||||||
public function subscribe_feed( $feed_id, $feed_event_uid = '' ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
throw new Exception( 'Calendar ID not found' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/subscribe',
|
|
||||||
array(
|
|
||||||
'feed_id' => $feed_id,
|
|
||||||
'feed_event_uid' => $feed_event_uid
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Refresh list of subscriptions and limits
|
|
||||||
$this->get_subscriptions( true );
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
return $response->body;
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification(
|
|
||||||
$response,
|
|
||||||
__( 'We were unable to subscribe feed', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call the API to unsubscribe feed
|
|
||||||
*/
|
|
||||||
public function unsubscribe_feed( $feed_id, $feed_event_uid = '' ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
throw new Exception( 'Calendar ID not found' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/unsubscribe',
|
|
||||||
array(
|
|
||||||
'feed_id' => $feed_id,
|
|
||||||
'feed_event_uid' => $feed_event_uid
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Refresh list of subscriptions and limits
|
|
||||||
$this->get_subscriptions( true );
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
return $response->body;
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification(
|
|
||||||
$response,
|
|
||||||
__( 'We were unable to unsubscribe feed', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,252 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for Timely API communication for Registration.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.4
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Api_Registration extends Ai1ec_Api_Abstract {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post construction routine.
|
|
||||||
*
|
|
||||||
* Override this method to perform post-construction tasks.
|
|
||||||
*
|
|
||||||
* @return void Return from this method is ignored.
|
|
||||||
*/
|
|
||||||
protected function _initialize() {
|
|
||||||
parent::_initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
public function signin() {
|
|
||||||
$body['email'] = $_POST['ai1ec_email'];
|
|
||||||
$body['password'] = $_POST['ai1ec_password'];
|
|
||||||
$body['calendar_type'] = $_POST['ai1ec_calendar_type'];
|
|
||||||
$response = $this->request_api( 'POST', AI1EC_API_URL . 'auth/authenticate', $body, true, array( 'Authorization' => null ) );
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$response_body = (array) $response->body;
|
|
||||||
// Save calendar ID as 0 first, otherwise the auth data won't be saved in the database before creating/finding the calendar
|
|
||||||
$this->save_ticketing_settings( $response_body['message'], true, $response_body['auth_token'], 0, $body['email'] );
|
|
||||||
// Now save the calendar ID
|
|
||||||
$this->save_calendar_id( $this->_get_ticket_calendar() );
|
|
||||||
$this->has_payment_settings();
|
|
||||||
$this->get_subscriptions( true );
|
|
||||||
$this->sync_api_settings();
|
|
||||||
} else {
|
|
||||||
$error_message = $this->save_error_notification( $response, __( 'We were unable to Sign you In for Time.ly Network', AI1EC_PLUGIN_NAME ) );
|
|
||||||
$this->save_ticketing_settings( $error_message, false, '', 0, null );
|
|
||||||
}
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
public function signup() {
|
|
||||||
$body['name'] = $_POST['ai1ec_name'];
|
|
||||||
$body['email'] = $_POST['ai1ec_email'];
|
|
||||||
$body['password'] = $_POST['ai1ec_password'];
|
|
||||||
$body['password_confirmation'] = $_POST['ai1ec_password_confirmation'];
|
|
||||||
$body['phone'] = $_POST['ai1ec_phone'];
|
|
||||||
$body['calendar_type'] = $_POST['ai1ec_calendar_type'];
|
|
||||||
$body['terms'] = $_POST['ai1ec_terms'];
|
|
||||||
$response = $this->request_api( 'POST', AI1EC_API_URL . 'auth/register', $body, true );
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$response_body = (array) $response->body;
|
|
||||||
// Save calendar ID as 0 first, otherwise the auth data won't be saved in the database before creating the calendar
|
|
||||||
$this->save_ticketing_settings( $response_body['Registration'], true, $response_body['auth_token'] , 0, $body['email'] );
|
|
||||||
// Now save the calendar ID
|
|
||||||
$this->save_calendar_id( $this->_create_calendar() );
|
|
||||||
$this->has_payment_settings();
|
|
||||||
$this->get_subscriptions( true );
|
|
||||||
$this->sync_api_settings();
|
|
||||||
} else {
|
|
||||||
$error_message = $this->save_error_notification( $response, __( 'We were unable to Sign you Up for Time.ly Network', AI1EC_PLUGIN_NAME ) );
|
|
||||||
$this->save_ticketing_settings( $error_message, false, '', 0, null );
|
|
||||||
}
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
protected function availability() {
|
|
||||||
$api_features = get_transient( 'ai1ec_api_features' );
|
|
||||||
|
|
||||||
if ( false === $api_features || ( defined( 'AI1EC_DEBUG' ) && AI1EC_DEBUG ) ) {
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'feature/availability', null, true );
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$api_features = (array) $response->body;
|
|
||||||
} else {
|
|
||||||
$api_features = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save for 5 minutes
|
|
||||||
$minutes = 5;
|
|
||||||
set_transient( 'ai1ec_api_features', $api_features, $minutes * 60 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $api_features;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function is_feature_available( $feature_code ) {
|
|
||||||
$availability = $this->availability();
|
|
||||||
|
|
||||||
if ( ! is_null( $availability ) ) {
|
|
||||||
foreach ( $availability as $value ) {
|
|
||||||
if ( isset( $value->code ) && $feature_code === $value->code
|
|
||||||
&& isset( $value->available ) && true === $value->available ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
protected function settings() {
|
|
||||||
$calendar_settings = get_transient( 'ai1ec_calendar_settings' );
|
|
||||||
|
|
||||||
if ( false === $calendar_settings || ( defined( 'AI1EC_DEBUG' ) && AI1EC_DEBUG ) ) {
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $this->_get_ticket_calendar() . '/settings', null, true );
|
|
||||||
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$calendar_settings = (array) $response->body;
|
|
||||||
} else {
|
|
||||||
$calendar_settings = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save for 5 minutes
|
|
||||||
$minutes = 5;
|
|
||||||
set_transient( 'ai1ec_calendar_settings', $calendar_settings, $minutes * 60 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $calendar_settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function is_api_sign_up_available() {
|
|
||||||
return $this->is_feature_available( Ai1ec_Api_Features::CODE_API_ACCESS );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function is_ticket_available() {
|
|
||||||
return $this->is_feature_available( Ai1ec_Api_Features::CODE_TICKETING );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function is_ticket_enabled() {
|
|
||||||
return $this->has_subscription_active( Ai1ec_Api_Features::CODE_TICKETING );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clean the ticketing settings on WP database only
|
|
||||||
*/
|
|
||||||
public function signout() {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar( false );
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
$this->clear_ticketing_settings();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $calendar_id . '/signout', null, true );
|
|
||||||
// Consider "Unauthorized" status (401) a valid response
|
|
||||||
if ( $this->is_response_success( $response ) || 401 === wp_remote_retrieve_response_code( $response->raw ) ) {
|
|
||||||
$this->clear_ticketing_settings();
|
|
||||||
return array( 'message' => '' );
|
|
||||||
} else {
|
|
||||||
$error_message = $this->save_error_notification( $response, __( 'We were unable to Sign you Out of Time.ly Network', AI1EC_PLUGIN_NAME ) );
|
|
||||||
return array( 'message' => $error_message );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body from API.
|
|
||||||
*/
|
|
||||||
public function save_payment_preferences() {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( 0 >= $calendar_id ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$settings = array(
|
|
||||||
'payment_method' => $_POST['ai1ec_payment_method'],
|
|
||||||
'paypal_email' => $_POST['ai1ec_paypal_email'],
|
|
||||||
'first_name' => $_POST['ai1ec_first_name'],
|
|
||||||
'last_name' => $_POST['ai1ec_last_name'],
|
|
||||||
'currency' => $_POST['ai1ec_currency']
|
|
||||||
);
|
|
||||||
$custom_headers['content-type'] = 'application/x-www-form-urlencoded';
|
|
||||||
$response = $this->request_api( 'PUT', AI1EC_API_URL . 'calendars/' . $calendar_id . '/payment',
|
|
||||||
$settings,
|
|
||||||
true, //decode response body
|
|
||||||
$custom_headers
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$this->save_payment_settings( $settings );
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store(
|
|
||||||
__( 'Payment preferences were saved.', AI1EC_PLUGIN_NAME ),
|
|
||||||
'updated',
|
|
||||||
0,
|
|
||||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
return $response->body;
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification( $response,
|
|
||||||
__( 'Payment preferences were not saved.', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function _order_comparator( $order1, $order2 ) {
|
|
||||||
return strcmp( $order1->created_at, $order2->created_at ) * -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
public function get_purchases() {
|
|
||||||
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $this->_get_ticket_calendar() . '/sales',
|
|
||||||
null, //body
|
|
||||||
true //decode response body
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$result = $response->body;
|
|
||||||
if ( isset( $result->orders ) ) {
|
|
||||||
usort( $result->orders, array( "Ai1ec_Api_Registration", "_order_comparator" ) );
|
|
||||||
return $result->orders;
|
|
||||||
} else {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->save_error_notification( $response,
|
|
||||||
__( 'We were unable to get the Sales information from Time.ly Network', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sync settings from API after signing in
|
|
||||||
*/
|
|
||||||
public function sync_api_settings() {
|
|
||||||
// Sync feeds subscriptions
|
|
||||||
try {
|
|
||||||
$api_feed = $this->_registry->get( 'model.api.api-feeds' );
|
|
||||||
$api_feed->get_and_sync_feed_subscriptions();
|
|
||||||
} catch ( Exception $e ) {
|
|
||||||
$error_message = 'Some feeds were not imported to Time.ly Network. Error: ' . $e->getMessage();
|
|
||||||
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store( $error_message, 'error', 0, array( Ai1ec_Notification_Admin::RCPT_ADMIN ), false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?php
|
|
||||||
class Ai1ec_Api_Settings {
|
|
||||||
const FACEBOOK_API_KEY = 'facebook_api_key';
|
|
||||||
}
|
|
||||||
@@ -1,901 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for Timely API communication for Ticketing.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.4
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Api_Ticketing extends Ai1ec_Api_Abstract {
|
|
||||||
|
|
||||||
const API_EVENT_DATA = '_ai1ec_api_event_id';
|
|
||||||
|
|
||||||
const ATTR_EVENT_ID = 'api_event_id';
|
|
||||||
const ATTR_THUMBNAIL_ID = 'thumbnail_id';
|
|
||||||
const ATTR_ICS_CHECKOUT_URL = 'ics_checkout_url';
|
|
||||||
const ATTR_ICS_API_URL = 'ics_api_url';
|
|
||||||
const ATTR_ACCOUNT = 'account';
|
|
||||||
const ATTR_CALENDAR_ID = 'calendar_id';
|
|
||||||
const ATTR_CURRENCY = 'currency';
|
|
||||||
|
|
||||||
const MAX_TICKET_TO_BUY_DEFAULT = 25;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post construction routine.
|
|
||||||
*
|
|
||||||
* Override this method to perform post-construction tasks.
|
|
||||||
*
|
|
||||||
* @return void Return from this method is ignored.
|
|
||||||
*/
|
|
||||||
protected function _initialize() {
|
|
||||||
parent::_initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Count the valid Tickets Types (not removed) included inside the Ticket Event
|
|
||||||
*/
|
|
||||||
private function _count_valid_tickets( $post_ticket_types ) {
|
|
||||||
if (false === isset( $post_ticket_types ) || 0 === count( $post_ticket_types ) ) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
$count = 0;
|
|
||||||
foreach ( $post_ticket_types as $ticket_type_ite ) {
|
|
||||||
if ( !isset( $ticket_type_ite['remove'] ) ) {
|
|
||||||
$count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return an error if the Ticket Event is not owned by the Current account
|
|
||||||
*/
|
|
||||||
private function _prevent_update_ticket_event( Ai1ec_Event $event, $ajax_action = false ) {
|
|
||||||
if ( $this->is_ticket_event_imported( $event->get( 'post_id' ) ) ) {
|
|
||||||
//prevent changes on Ticket Events that were imported
|
|
||||||
$error = __( 'This Event was replicated from another site. Changes are not allowed.', AI1EC_PLUGIN_NAME );
|
|
||||||
if ( ! $ajax_action ) {
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store(
|
|
||||||
$error,
|
|
||||||
'error',
|
|
||||||
0,
|
|
||||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
if ( $this->is_ticket_event_from_another_account( $event->get( 'post_id' ) ) ) {
|
|
||||||
//prevent changes on Ticket Events that were imported
|
|
||||||
$error = sprintf(
|
|
||||||
__( 'This Event was created using a different account %s. Changes are not allowed.', AI1EC_PLUGIN_NAME ),
|
|
||||||
$this->get_api_event_account( $event->get( 'post_id' ) )
|
|
||||||
);
|
|
||||||
if ( ! $ajax_action ) {
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store(
|
|
||||||
$error,
|
|
||||||
'error',
|
|
||||||
0,
|
|
||||||
array( Ai1ec_Notification_Admin::RCPT_ADMIN ),
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run some validations inside the _POST request to check if the Event
|
|
||||||
* submmited is a valid event for Tickets
|
|
||||||
* @return NULL in case of success or a Message in case of error
|
|
||||||
*/
|
|
||||||
private function _is_valid_post( Ai1ec_Event $event, $updating ) {
|
|
||||||
$message = null;
|
|
||||||
if ( ( isset( $_POST['ai1ec_rdate'] ) && ! empty( $_POST['ai1ec_rdate'] ) ) ||
|
|
||||||
( isset( $_POST['ai1ec_repeat'] ) && ! empty( $_POST['ai1ec_repeat'] ) )
|
|
||||||
) {
|
|
||||||
$message = __( 'The Repeat option was selected but recurrence is not supported by Event with Tickets.', AI1EC_PLUGIN_NAME );
|
|
||||||
} else if ( isset( $_POST['ai1ec_tickets_loading_error'] ) ) {
|
|
||||||
//do not update tickets because is unsafe. There was a problem to load the tickets,
|
|
||||||
//the customer received the same message when the event was loaded.
|
|
||||||
$message = $_POST['ai1ec_tickets_loading_error'];
|
|
||||||
} else if ( false === ai1ec_is_blank( $event->get( 'ical_feed_url' ) ) ) {
|
|
||||||
//prevent ticket creating inside Regular Events Imported events
|
|
||||||
$message = __( 'This Event was replicated from another site. Any changes on Tickets were discarded.', AI1EC_PLUGIN_NAME );
|
|
||||||
} else {
|
|
||||||
$error = $this->_prevent_update_ticket_event( $event );
|
|
||||||
if ( null !== $error ) {
|
|
||||||
$message = $error;
|
|
||||||
} else if ( ! isset( $_POST['ai1ec_tickets'] ) || 0 === $this->_count_valid_tickets( $_POST['ai1ec_tickets'] ) ) {
|
|
||||||
$message = __( 'The Event has the cost option Ticket selected but no ticket was included.', AI1EC_PLUGIN_NAME );
|
|
||||||
} else if ( false === $this->has_payment_settings() ) {
|
|
||||||
$message = __( 'You need to save the payments settings to create ticket events.', AI1EC_PLUGIN_NAME );
|
|
||||||
} else if ( ! isset( $_POST['tax_options'] ) && ! $updating ) {
|
|
||||||
$message = __( 'Tax and Invoice options are required.', AI1EC_PLUGIN_NAME );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( null !== $message ) {
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store( $message, 'error', 0, array( Ai1ec_Notification_Admin::RCPT_ADMIN ), false );
|
|
||||||
return $message;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create or update a Ticket Event on API server
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
public function store_event( Ai1ec_Event $event, WP_Post $post, $updating ) {
|
|
||||||
|
|
||||||
$error = $this->_is_valid_post( $event, $updating );
|
|
||||||
if ( null !== $error ) {
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
$api_event_id = $this->get_api_event_id( $event->get( 'post_id' ) );
|
|
||||||
$is_new = ! $api_event_id;
|
|
||||||
$fields = array( 'visibility' => $_POST['visibility'] );
|
|
||||||
if ( isset( $_POST['tax_options'] ) ) {
|
|
||||||
$fields['tax_options'] = $_POST['tax_options'];
|
|
||||||
}
|
|
||||||
$body_data = $this->parse_event_fields_to_api_structure(
|
|
||||||
$event,
|
|
||||||
$post,
|
|
||||||
$_POST['ai1ec_tickets'],
|
|
||||||
$fields
|
|
||||||
);
|
|
||||||
$url = AI1EC_API_URL . 'events';
|
|
||||||
if ( $api_event_id ) {
|
|
||||||
$url = $url . '/' . $api_event_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
//get the thumbnail id saved previously
|
|
||||||
$api_data = $this->get_api_event_data( $event->get( 'post_id' ) );
|
|
||||||
if ( isset( $api_data[self::ATTR_THUMBNAIL_ID] ) ) {
|
|
||||||
$event_thumbnail_id = $api_data[self::ATTR_THUMBNAIL_ID];
|
|
||||||
} else {
|
|
||||||
$event_thumbnail_id = 0;
|
|
||||||
}
|
|
||||||
//get the current thumbnail id
|
|
||||||
$post_thumbnail_id = get_post_thumbnail_id( $event->get( 'post_id' ) );
|
|
||||||
if ( false === isset( $post_thumbnail_id ) ) {
|
|
||||||
$post_thumbnail_id = 0;
|
|
||||||
}
|
|
||||||
$update_image = ( $event_thumbnail_id !== $post_thumbnail_id );
|
|
||||||
$payload = '';
|
|
||||||
$custom_headers = null;
|
|
||||||
|
|
||||||
if ( true === $update_image && 0 < $post_thumbnail_id ) {
|
|
||||||
$boundary = wp_generate_password( 24 );
|
|
||||||
$custom_headers['Content-Type'] = 'multipart/form-data; boundary=' . $boundary;
|
|
||||||
$body_data['update_image'] = '1';
|
|
||||||
foreach ($body_data as $key => $value) {
|
|
||||||
if ( is_array( $value ) ) {
|
|
||||||
$index = 0;
|
|
||||||
foreach ( $value as $arr_key => $arr_value ) {
|
|
||||||
if ( is_array( $arr_value ) ) {
|
|
||||||
foreach ( $arr_value as $child_key => $child_value ) {
|
|
||||||
$payload .= '--' . $boundary;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= 'Content-Disposition: form-data; name="' . $key . '[' . $index . '][' . $child_key . ']"' . "\r\n";
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= $child_value;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$payload .= '--' . $boundary;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= 'Content-Disposition: form-data; name="tax_options[' . $arr_key . ']"' . "\r\n";
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= $arr_value;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
}
|
|
||||||
$index++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$payload .= '--' . $boundary;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n";
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= $value;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$file_path = get_attached_file ( $post_thumbnail_id );
|
|
||||||
$file_type = wp_check_filetype ( $file_path );
|
|
||||||
$payload .= '--' . $boundary;
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= 'Content-Disposition: form-data; name="image_id"; filename="' . basename( $file_path ) . '"' . "\r\n";
|
|
||||||
$payload .= 'Content-Type: ' . $file_type['type'] . "\r\n";
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= file_get_contents( $file_path );
|
|
||||||
$payload .= "\r\n";
|
|
||||||
$payload .= '--' . $boundary . '--';
|
|
||||||
} else {
|
|
||||||
$body_data['update_image'] = (true === $update_image) ? '1' : '0';
|
|
||||||
$payload = $body_data;
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'POST', $url, $payload,
|
|
||||||
true, //true to decode response body
|
|
||||||
$custom_headers
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$api_event_id = $response->body->id;
|
|
||||||
if ( isset( $response->body->currency ) ) {
|
|
||||||
$currency = $response->body->currency;
|
|
||||||
} else {
|
|
||||||
$currency = 'USD';
|
|
||||||
}
|
|
||||||
$currency = $response->body->currency;
|
|
||||||
if ( $post_thumbnail_id <= 0 ) {
|
|
||||||
$post_thumbnail_id = null;
|
|
||||||
}
|
|
||||||
$this->save_api_event_data( $event->get( 'post_id') , $api_event_id, null, null, $currency, $post_thumbnail_id );
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$error_message = '';
|
|
||||||
if ( $is_new ) {
|
|
||||||
$error_message = __( 'We were unable to create the Event on Time.ly Ticketing', AI1EC_PLUGIN_NAME );
|
|
||||||
} else {
|
|
||||||
$error_message = __( 'We were unable to update the Event on Time.ly Ticketing', AI1EC_PLUGIN_NAME );
|
|
||||||
}
|
|
||||||
return $this->save_error_notification( $response, $error_message );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the fields of an Event to the structure used by API
|
|
||||||
*/
|
|
||||||
public function parse_event_fields_to_api_structure( Ai1ec_Event $event , WP_Post $post, $post_ticket_types, $api_fields_values ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
if ( $calendar_id <= 0 ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//fields of ai1ec events table used by API
|
|
||||||
$body['latitude'] = $event->get( 'latitude' );
|
|
||||||
$body['longitude'] = $event->get( 'longitude' );
|
|
||||||
$body['post_id'] = $event->get( 'post_id' );
|
|
||||||
$body['calendar_id'] = $calendar_id;
|
|
||||||
$body['dtstart'] = $event->get( 'start' )->format_to_javascript();
|
|
||||||
$body['dtend'] = $event->getenddate()->format_to_javascript();
|
|
||||||
$body['timezone'] = $event->get( 'timezone_name' );
|
|
||||||
$body['venue_name'] = $event->get( 'venue' );
|
|
||||||
$body['address'] = $event->get( 'address' );
|
|
||||||
$body['city'] = $event->get( 'city' );
|
|
||||||
$body['province'] = $event->get( 'province' );
|
|
||||||
$body['postal_code'] = $event->get( 'postal_code' );
|
|
||||||
$body['country'] = $event->get( 'country' );
|
|
||||||
$body['contact_name'] = $event->get( 'contact_name' );
|
|
||||||
$body['contact_phone'] = $event->get( 'contact_phone' );
|
|
||||||
$body['contact_email'] = $event->get( 'contact_email' );
|
|
||||||
$body['contact_website'] = $event->get( 'contact_url' );
|
|
||||||
$body['uid'] = $event->get_uid();
|
|
||||||
$body['title'] = $post->post_title;
|
|
||||||
$body['description'] = $post->post_content;
|
|
||||||
$body['url'] = get_permalink( $post->ID );
|
|
||||||
$body['status'] = $post->post_status;
|
|
||||||
|
|
||||||
$utc_current_time = $this->_registry->get( 'date.time')->format_to_javascript();
|
|
||||||
$body['created_at'] = $utc_current_time;
|
|
||||||
$body['updated_at'] = $utc_current_time;
|
|
||||||
|
|
||||||
//removing blank values
|
|
||||||
foreach ($body as $key => $value) {
|
|
||||||
if ( ai1ec_is_blank( $value ) ) {
|
|
||||||
unset( $body[ $key ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( is_null( $api_fields_values ) || 0 == count( $api_fields_values ) ) {
|
|
||||||
$api_fields_values = array( 'status' => 'closed', 'ai1ec_version' => AI1EC_VERSION );
|
|
||||||
} else {
|
|
||||||
if ( ! isset( $api_fields_values['ai1ec_version'] ) ) {
|
|
||||||
$api_fields_values['ai1ec_version'] = AI1EC_VERSION;
|
|
||||||
}
|
|
||||||
foreach ( $api_fields_values as $key => $value ) {
|
|
||||||
$body[$key] = $api_fields_values[$key];
|
|
||||||
if ( 'visibility' === $key ) {
|
|
||||||
if ( 0 === strcasecmp( 'private', $value ) ) {
|
|
||||||
$body['status'] = 'private';
|
|
||||||
} else if ( 0 === strcasecmp( 'password', $value ) ) {
|
|
||||||
$body['status'] = 'password';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$tickets_types = array();
|
|
||||||
if ( ! is_null( $post_ticket_types ) ) {
|
|
||||||
$index = 0;
|
|
||||||
foreach ( $post_ticket_types as $ticket_type_ite ) {
|
|
||||||
if ( false === isset( $ticket_type_ite['id'] ) &&
|
|
||||||
isset( $ticket_type_ite['remove'] ) ) {
|
|
||||||
//ignoring new tickets that didn't go to api yet
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$tickets_types[$index++] = $this->_parse_tickets_type_post_to_api_structure(
|
|
||||||
$ticket_type_ite,
|
|
||||||
$event
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$body['ticket_types'] = $tickets_types;
|
|
||||||
|
|
||||||
return $body;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the fields of a Ticket Type to the structure used by API
|
|
||||||
*/
|
|
||||||
protected function _parse_tickets_type_post_to_api_structure( $ticket_type_ite, $event ) {
|
|
||||||
$utc_current_time = $this->_registry->get( 'date.time' )->format_to_javascript();
|
|
||||||
if ( isset( $ticket_type_ite['id'] ) ) {
|
|
||||||
$ticket_type['id'] = $ticket_type_ite['id'];
|
|
||||||
$ticket_type['created_at'] = $ticket_type_ite['created_at'];
|
|
||||||
} else {
|
|
||||||
$ticket_type['created_at'] = $utc_current_time;
|
|
||||||
}
|
|
||||||
if ( isset( $ticket_type_ite['remove'] ) ) {
|
|
||||||
$ticket_type['deleted_at'] = $utc_current_time;
|
|
||||||
}
|
|
||||||
$ticket_type['name'] = $ticket_type_ite['ticket_name'];
|
|
||||||
$ticket_type['description'] = $ticket_type_ite['description'];
|
|
||||||
$ticket_type['price'] = $ticket_type_ite['ticket_price'];
|
|
||||||
if ( 0 === strcasecmp( 'on', $ticket_type_ite['unlimited'] ) ) {
|
|
||||||
$ticket_type['quantity'] = null;
|
|
||||||
} else {
|
|
||||||
$ticket_type['quantity'] = $ticket_type_ite['quantity'];
|
|
||||||
}
|
|
||||||
$ticket_type['buy_min_qty'] = $ticket_type_ite['buy_min_limit'];
|
|
||||||
if ( ai1ec_is_blank( $ticket_type_ite['buy_max_limit'] ) ) {
|
|
||||||
$ticket_type['buy_max_qty'] = null;
|
|
||||||
} else {
|
|
||||||
$ticket_type['buy_max_qty'] = $ticket_type_ite['buy_max_limit'];
|
|
||||||
}
|
|
||||||
if ( 0 === strcasecmp( 'on', $ticket_type_ite['availibility'] ) ) {
|
|
||||||
//immediate availability
|
|
||||||
$timezone_start_time = $this->_registry->get( 'date.time' );
|
|
||||||
$timezone_start_time->set_timezone( $event->get('timezone_name') );
|
|
||||||
$ticket_type['immediately'] = true;
|
|
||||||
$ticket_type['sale_start_date'] = $timezone_start_time->format_to_javascript( $event->get('timezone_name') );
|
|
||||||
$ticket_type['sale_end_date'] = $event->get( 'end' )->format_to_javascript();
|
|
||||||
} else {
|
|
||||||
$ticket_type['immediately'] = false;
|
|
||||||
$ticket_type['sale_start_date'] = $ticket_type_ite['ticket_sale_start_date'];
|
|
||||||
$ticket_type['sale_end_date'] = $ticket_type_ite['ticket_sale_end_date'];
|
|
||||||
}
|
|
||||||
$ticket_type['updated_at'] = $utc_current_time;
|
|
||||||
$ticket_type['status'] = $ticket_type_ite['ticket_status'];
|
|
||||||
return $ticket_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unparse the fields of API structure to the Ticket Type
|
|
||||||
*/
|
|
||||||
protected function _unparse_tickets_type_from_api_structure( $ticket_type_api ) {
|
|
||||||
$ticket_type = $ticket_type_api;
|
|
||||||
$ticket_type->ticket_name = $ticket_type_api->name;
|
|
||||||
$ticket_type->ticket_price = $ticket_type_api->price;
|
|
||||||
$ticket_type->buy_min_limit = $ticket_type_api->buy_min_qty;
|
|
||||||
if ( null === $ticket_type_api->buy_max_qty ) {
|
|
||||||
$ticket_type->buy_max_limit = self::MAX_TICKET_TO_BUY_DEFAULT;
|
|
||||||
} else {
|
|
||||||
$ticket_type->buy_max_limit = $ticket_type_api->buy_max_qty;
|
|
||||||
}
|
|
||||||
if ( true === ( ( bool ) $ticket_type_api->immediately ) ) {
|
|
||||||
$ticket_type->availibility = 'on';
|
|
||||||
} else {
|
|
||||||
$ticket_type->availibility = 'off';
|
|
||||||
}
|
|
||||||
$ticket_type->ticket_sale_start_date = $ticket_type_api->sale_start_date; //YYYY-MM-YY HH:NN:SS
|
|
||||||
$ticket_type->ticket_sale_end_date = $ticket_type_api->sale_end_date; //YYYY-MM-YY HH:NN:SS
|
|
||||||
$ticket_type->ticket_status = $ticket_type_api->status;
|
|
||||||
if ( 'open' === $ticket_type_api->status ) {
|
|
||||||
$ticket_type->ticket_status_label = __( 'Open for sale', AI1EC_PLUGIN_NAME );
|
|
||||||
} else if ( 'closed' === $ticket_type_api->status ) {
|
|
||||||
$ticket_type->ticket_status_label = __( 'Sale ended', AI1EC_PLUGIN_NAME );
|
|
||||||
} else if ( 'canceled' === $ticket_type_api->status ) {
|
|
||||||
$ticket_type->ticket_status_label = __( 'Canceled', AI1EC_PLUGIN_NAME );
|
|
||||||
} else {
|
|
||||||
$ticket_type->ticket_status_label = $ticket_type_api->status;
|
|
||||||
}
|
|
||||||
if ( false === isset( $ticket_type_api->quantity ) ||
|
|
||||||
null === $ticket_type_api->quantity ) {
|
|
||||||
$ticket_type->unlimited = 'on';
|
|
||||||
} else {
|
|
||||||
$ticket_type->unlimited = 'off';
|
|
||||||
}
|
|
||||||
$ticket_type->ticket_type_id = $ticket_type_api->id;
|
|
||||||
$ticket_type->available = $ticket_type_api->available;
|
|
||||||
$ticket_type->availability = $this->_parse_availability_message( $ticket_type_api->availability );
|
|
||||||
|
|
||||||
//derived property to set the max quantity of dropdown
|
|
||||||
if ( $ticket_type->available !== null ) {
|
|
||||||
if ( $ticket_type->available > $ticket_type->buy_max_limit ) {
|
|
||||||
$ticket_type->buy_max_available = $ticket_type->buy_max_limit;
|
|
||||||
} else {
|
|
||||||
$ticket_type->buy_max_available = $ticket_type->available;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$ticket_type->buy_max_available = $ticket_type->buy_max_limit;
|
|
||||||
}
|
|
||||||
return $ticket_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function _parse_availability_message( $availability ){
|
|
||||||
if ( ai1ec_is_blank ( $availability ) ) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
switch ($availability) {
|
|
||||||
case 'past_event':
|
|
||||||
return __( 'Past Event' );
|
|
||||||
case 'event_closed':
|
|
||||||
return __( 'Event closed' );
|
|
||||||
case 'not_available_yet':
|
|
||||||
return __( 'Not available yet' );
|
|
||||||
case 'sale_closed':
|
|
||||||
return __( 'Sale closed' );
|
|
||||||
case 'sold_out':
|
|
||||||
return __( 'Sold out' );
|
|
||||||
default:
|
|
||||||
return __( 'Not available' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_event( $post_id ) {
|
|
||||||
$api_event_id = $this->get_api_event_id( $post_id );
|
|
||||||
if ( ! $api_event_id ) {
|
|
||||||
return (object) array( 'data' => array() );
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'GET', $this->get_api_event_url( $post_id ) . 'events/' . $api_event_id . '/edit' );
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
if ( isset( $response->body->ticket_types ) ) {
|
|
||||||
foreach ( $response->body->ticket_types as $ticket_api ) {
|
|
||||||
$this->_unparse_tickets_type_from_api_structure( $ticket_api );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (object) array( 'data' => $response->body );
|
|
||||||
} else {
|
|
||||||
$error_message = $this->_transform_error_message(
|
|
||||||
__( 'We were unable to get the Event Details from Time.ly Ticketing', AI1EC_PLUGIN_NAME ),
|
|
||||||
$response->raw, $response->url,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
return (object) array( 'data' => array(), 'error' => $error_message );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string JSON.
|
|
||||||
*/
|
|
||||||
public function get_ticket_types( $post_id, $get_canceled = true ) {
|
|
||||||
$api_event_id = $this->get_api_event_id( $post_id );
|
|
||||||
if ( ! $api_event_id ) {
|
|
||||||
return json_encode( array( 'data' => array() ) );
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'GET', $this->get_api_event_url( $post_id ) . 'events/' . $api_event_id . '/ticket_types',
|
|
||||||
array( 'get_canceled' => ( true === $get_canceled ? 1 : 0 ) )
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
if ( isset( $response->body->ticket_types ) ) {
|
|
||||||
foreach ( $response->body->ticket_types as $ticket_api ) {
|
|
||||||
$this->_unparse_tickets_type_from_api_structure( $ticket_api );
|
|
||||||
}
|
|
||||||
return json_encode( array( 'data' => $response->body->ticket_types ) );
|
|
||||||
} else {
|
|
||||||
return json_encode( array( 'data' => array() ) );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$error_message = $this->_transform_error_message(
|
|
||||||
__( 'We were unable to get the Tickets Details from Time.ly Ticketing', AI1EC_PLUGIN_NAME ),
|
|
||||||
$response->raw, $response->url,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
return json_encode( array( 'data' => array(), 'error' => $error_message ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return object Response body in JSON.
|
|
||||||
*/
|
|
||||||
public function get_tickets( $post_id ) {
|
|
||||||
$api_event_id = $this->get_api_event_id( $post_id );
|
|
||||||
if ( ! $api_event_id ) {
|
|
||||||
return json_encode( array( 'data' => array() ) );
|
|
||||||
}
|
|
||||||
$request = array(
|
|
||||||
'headers' => $this->_get_headers(),
|
|
||||||
'timeout' => parent::DEFAULT_TIMEOUT
|
|
||||||
);
|
|
||||||
$url = $this->get_api_event_url( $post_id ) . 'events/' . $api_event_id . '/tickets';
|
|
||||||
$response = wp_remote_get( $url, $request );
|
|
||||||
$response_code = wp_remote_retrieve_response_code( $response );
|
|
||||||
if ( 200 === $response_code ) {
|
|
||||||
return $response['body'];
|
|
||||||
} else {
|
|
||||||
$error_message = $this->_transform_error_message(
|
|
||||||
__( 'We were unable to get the Tickets Attendees from Time.ly Ticketing', AI1EC_PLUGIN_NAME ),
|
|
||||||
$response, $url,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
return json_encode( array( 'data' => array(), 'error' => $error_message ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a Ticket Event was imported from an ICS Feed
|
|
||||||
*/
|
|
||||||
public function is_ticket_event_imported( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) && isset( $data[self::ATTR_ICS_API_URL] ) ) {
|
|
||||||
return ( ! ai1ec_is_blank ( $data[self::ATTR_ICS_API_URL] ) );
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the Ticket Event was created using a different account
|
|
||||||
* The user probably created the event from one account, signed out and
|
|
||||||
* is currently signed in with a new account
|
|
||||||
*/
|
|
||||||
public function is_ticket_event_from_another_account( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
if ( isset( $data[self::ATTR_ACCOUNT] ) ) {
|
|
||||||
return ( $this->get_current_account() != $data[self::ATTR_ACCOUNT] );
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the API account where the event was created
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
* @param bool $default_null True to return NULL if the value does not exist, false to return the configured API URL
|
|
||||||
*/
|
|
||||||
public function get_api_event_account( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
if ( isset( $data[self::ATTR_ACCOUNT] ) ) {
|
|
||||||
return $data[self::ATTR_ACCOUNT];
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the response that came from the API is the event not found
|
|
||||||
*/
|
|
||||||
private function _is_event_notfound_error( $response ) {
|
|
||||||
if ( isset( $response->response_code ) && 404 === $response->response_code ) {
|
|
||||||
if ( isset( $response->body ) ) {
|
|
||||||
if ( is_array( $response->body ) &&
|
|
||||||
isset( $response->body['message'] ) ) {
|
|
||||||
if ( false !== stripos( $response->body['message'], 'event not found') ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return NULL in case of success or an error string in case of error
|
|
||||||
*/
|
|
||||||
public function update_api_event_fields( WP_Post $post, $api_fields_values, $post_action = 'trash', $ajax_action = false ) {
|
|
||||||
$post_id = $post->ID;
|
|
||||||
$api_event_id = $this->get_api_event_id( $post_id );
|
|
||||||
if ( ! $api_event_id ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
$event = $this->_registry->get( 'model.event', $post_id );
|
|
||||||
} catch ( Ai1ec_Event_Not_Found_Exception $excpt ) {
|
|
||||||
$message = __( 'Event not found inside the database.', AI1EC_PLUGIN_NAME );
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store( $message, 'error', 0, array( Ai1ec_Notification_Admin::RCPT_ADMIN ), false );
|
|
||||||
return $message;
|
|
||||||
}
|
|
||||||
if ( 'update' === $post_action ) {
|
|
||||||
$error = $this->_prevent_update_ticket_event( $event, $ajax_action );
|
|
||||||
if ( null !== $error ) {
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( $this->is_ticket_event_imported( $post_id ) ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if ( $this->is_ticket_event_from_another_account( $post_id ) ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$headers = $this->_get_headers();
|
|
||||||
$body_data = $this->parse_event_fields_to_api_structure(
|
|
||||||
$event,
|
|
||||||
$post,
|
|
||||||
null, //does not update ticket types, just chaging the api fields specified
|
|
||||||
$api_fields_values
|
|
||||||
);
|
|
||||||
$response = $this->request_api( 'POST',
|
|
||||||
AI1EC_API_URL . 'events/' . $api_event_id,
|
|
||||||
$body_data,
|
|
||||||
true //true to decode response body
|
|
||||||
);
|
|
||||||
if ( ! $this->is_response_success( $response ) ) {
|
|
||||||
if ( $this->_is_event_notfound_error( $response ) ) {
|
|
||||||
if ( isset( $api_fields_values['status'] ) &&
|
|
||||||
'trash' === $api_fields_values['status'] ) {
|
|
||||||
//this is an exception, the event was deleted on API server, but for some reason
|
|
||||||
//the metada was not unset, in this case leave the event be
|
|
||||||
//move to trash
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$message = $this->save_error_notification( $response, __( 'We were unable to Update the Event on Time.ly Network', AI1EC_PLUGIN_NAME ) );
|
|
||||||
return $message;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes the API event
|
|
||||||
* @return NULL in case of success or an error string in case of error
|
|
||||||
*/
|
|
||||||
public function delete_api_event( $post_id, $post_action = 'delete', $ajax_action = false ) {
|
|
||||||
$api_event_id = $this->get_api_event_id( $post_id );
|
|
||||||
if ( ! $api_event_id ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if ( 'update' === $post_action ) {
|
|
||||||
try {
|
|
||||||
$event = $this->_registry->get( 'model.event', $post_id );
|
|
||||||
} catch ( Ai1ec_Event_Not_Found_Exception $excpt ) {
|
|
||||||
$message = __( 'Event not found inside the database.', AI1EC_PLUGIN_NAME );
|
|
||||||
$notification = $this->_registry->get( 'notification.admin' );
|
|
||||||
$notification->store( $message, 'error', 0, array( Ai1ec_Notification_Admin::RCPT_ADMIN ), false );
|
|
||||||
return $message;
|
|
||||||
}
|
|
||||||
$error = $this->_prevent_update_ticket_event( $event, $ajax_action );
|
|
||||||
if ( null !== $error ) {
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( $this->is_ticket_event_imported( $post_id ) ) {
|
|
||||||
$this->clear_event_metadata( $post_id );
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if ( $this->is_ticket_event_from_another_account( $post_id ) ) {
|
|
||||||
$this->clear_event_metadata( $post_id );
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$response = $this->request_api( 'DELETE',
|
|
||||||
AI1EC_API_URL . 'events/' . $api_event_id,
|
|
||||||
true //true to decode response body
|
|
||||||
);
|
|
||||||
if ( $this->is_response_success( $response ) ) {
|
|
||||||
$this->clear_event_metadata( $post_id );
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
if ( $this->_is_event_notfound_error( $response ) ) {
|
|
||||||
$this->clear_event_metadata( $post_id );
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
$message = $this->save_error_notification( $response, __( 'We were unable to remove the Event on Time.ly Network', AI1EC_PLUGIN_NAME ) );
|
|
||||||
return $message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear the event metadata used by Event from the post id
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
*/
|
|
||||||
public function clear_event_metadata( $post_id ) {
|
|
||||||
delete_post_meta( $post_id, self::API_EVENT_DATA );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_api_event_data( $post_id ) {
|
|
||||||
$data = get_post_meta(
|
|
||||||
$post_id,
|
|
||||||
self::API_EVENT_DATA,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if ( ai1ec_is_blank ( $data ) ) {
|
|
||||||
return null;
|
|
||||||
} else if ( is_numeric( $data ) ) {
|
|
||||||
//migrate the old metadata into one
|
|
||||||
$new_data[self::ATTR_EVENT_ID] = $data;
|
|
||||||
$value = get_post_meta( $post_id, '_ai1ec_thumbnail_id', true );
|
|
||||||
if ( false === ai1ec_is_blank( $value ) ) {
|
|
||||||
$new_data[self::ATTR_THUMBNAIL_ID] = $value;
|
|
||||||
}
|
|
||||||
$value = get_post_meta( $post_id, '_ai1ec_ics_checkout_url', true );
|
|
||||||
if ( false === ai1ec_is_blank( $value ) ) {
|
|
||||||
$new_data[self::ATTR_ICS_CHECKOUT_URL] = $value;
|
|
||||||
}
|
|
||||||
$value = get_post_meta( $post_id, '_ai1ec_ics_api_url' , true );
|
|
||||||
if ( ai1ec_is_blank( $value ) ) {
|
|
||||||
//not imported ticket event
|
|
||||||
$new_data[self::ATTR_ACCOUNT] = $this->get_current_account();
|
|
||||||
$new_data[self::ATTR_CALENDAR_ID] = $this->get_current_calendar();
|
|
||||||
} else {
|
|
||||||
$new_data[self::ATTR_ICS_API_URL] = $value;
|
|
||||||
}
|
|
||||||
$new_data[self::ATTR_CURRENCY] = 'USD';
|
|
||||||
update_post_meta( $post_id, self::API_EVENT_DATA, $new_data );
|
|
||||||
return $new_data;
|
|
||||||
} else if ( is_array( $data ) ) {
|
|
||||||
return $data;
|
|
||||||
} else {
|
|
||||||
wp_die( 'Error geting the api data' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the id of the event on the API
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
*/
|
|
||||||
public function get_api_event_id( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
return $data[self::ATTR_EVENT_ID];
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the API URL of the event
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
* @param bool $default_null True to return NULL if the value does not exist, false to return the configured API URL
|
|
||||||
*/
|
|
||||||
public function get_api_event_url ( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
if ( isset( $data[self::ATTR_ICS_API_URL] ) ) {
|
|
||||||
return $data[self::ATTR_ICS_API_URL];
|
|
||||||
} else {
|
|
||||||
return AI1EC_API_URL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the Currency of the event
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
*/
|
|
||||||
public function get_api_event_currency ( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
if ( isset( $data[self::ATTR_CURRENCY] ) ) {
|
|
||||||
return $data[self::ATTR_CURRENCY];
|
|
||||||
} else {
|
|
||||||
return 'USD';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the Checkout url of the event
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
*/
|
|
||||||
public function get_api_event_checkout_url ( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
if ( isset( $data[self::ATTR_ICS_CHECKOUT_URL] ) ) {
|
|
||||||
return $data[self::ATTR_ICS_CHECKOUT_URL];
|
|
||||||
} else {
|
|
||||||
return AI1EC_TICKETS_CHECKOUT_URL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the Buy Ticket URL of the event
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
*/
|
|
||||||
public function get_api_event_buy_ticket_url ( $post_id ) {
|
|
||||||
$data = $this->get_api_event_data( $post_id );
|
|
||||||
if ( isset( $data[self::ATTR_EVENT_ID] ) ) {
|
|
||||||
$api_event_id = $data[self::ATTR_EVENT_ID];
|
|
||||||
if ( isset( $data[self::ATTR_ICS_CHECKOUT_URL] ) ) {
|
|
||||||
$checkout_url = $data[self::ATTR_ICS_CHECKOUT_URL];
|
|
||||||
} else {
|
|
||||||
$checkout_url = AI1EC_TICKETS_CHECKOUT_URL;
|
|
||||||
}
|
|
||||||
return str_replace( '{event_id}', $api_event_id, $checkout_url );
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get tax options modal
|
|
||||||
* @param int $event_id Event ID (optional)
|
|
||||||
*/
|
|
||||||
public function get_tax_options_modal( $post_id = null ) {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
$event_id = $this->get_api_event_id( $post_id );
|
|
||||||
$response = $this->request_api( 'GET',
|
|
||||||
AI1EC_API_URL . 'calendars/' . $calendar_id . '/tax_options' .
|
|
||||||
( is_null( $event_id ) ? '' : '?event_id=' . $event_id )
|
|
||||||
);
|
|
||||||
return (object) array( 'data' => $response->raw, 'error' => false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get tax options modal
|
|
||||||
* @param int $event_id Event ID (optional)
|
|
||||||
*/
|
|
||||||
public function get_tax_options_modal_ep() {
|
|
||||||
$calendar_id = $this->_get_ticket_calendar();
|
|
||||||
$response = $this->request_api( 'GET',
|
|
||||||
AI1EC_API_URL . 'eventpromote/' . $calendar_id . '/tax_options'
|
|
||||||
);
|
|
||||||
return (object) array( 'data' => $response->raw, 'error' => false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the API event data
|
|
||||||
* @param int $post_id Post ID
|
|
||||||
* @param int $api_event_id (optional) Id of the event on the API
|
|
||||||
* @param string $ics_api_url (optional) API URL of the event on the API (used when importing an ICS feed)
|
|
||||||
* @param string $ics_checkout_url (optional) API CHECKOUT URL of the event on the API (used when importing an ICS feed)
|
|
||||||
* @param string $currency (optional) Currency code of the event
|
|
||||||
* @param string $thumbnail_id (optional) Id of the Thumbnail (Featured Image id)
|
|
||||||
*/
|
|
||||||
public function save_api_event_data( $post_id, $api_event_id, $ics_api_url = null, $ics_checkout_url = null, $currency = null, $thumbnail_id = null ) {
|
|
||||||
if ( ai1ec_is_blank( $api_event_id ) ) {
|
|
||||||
throw new Error( 'Api event id should never be null' );
|
|
||||||
}
|
|
||||||
$api_data[self::ATTR_EVENT_ID] = $api_event_id;
|
|
||||||
$api_data[self::ATTR_ICS_API_URL] = $ics_api_url;
|
|
||||||
$api_data[self::ATTR_ICS_CHECKOUT_URL] = $ics_checkout_url;
|
|
||||||
$api_data[self::ATTR_CURRENCY] = $currency;
|
|
||||||
$api_data[self::ATTR_THUMBNAIL_ID] = $thumbnail_id;
|
|
||||||
if ( ai1ec_is_blank( $ics_api_url ) ) {
|
|
||||||
$api_data[self::ATTR_ACCOUNT] = $this->get_current_account();
|
|
||||||
$api_data[self::ATTR_CALENDAR_ID] = $this->get_current_calendar();
|
|
||||||
}
|
|
||||||
$previous_data = $this->get_api_event_data( $post_id );
|
|
||||||
$new_data = array();
|
|
||||||
if ( is_array( $previous_data ) ) {
|
|
||||||
foreach ( $previous_data as $key => $value) {
|
|
||||||
$new_data[$key] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach ( $api_data as $key => $value ) {
|
|
||||||
if ( ai1ec_is_blank( $value ) ) {
|
|
||||||
unset( $new_data[$key] );
|
|
||||||
} else {
|
|
||||||
$new_data[$key] = $api_data[$key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return update_post_meta( $post_id, self::API_EVENT_DATA, $new_data, $previous_data );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base application model.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_App extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate base objects.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry
|
|
||||||
* @internal param \Ai1ec_Registry_Object $system Injectable system object.
|
|
||||||
*/
|
|
||||||
public function __construct( Ai1ec_Registry_Object $registry ) {
|
|
||||||
parent::__construct( $registry );
|
|
||||||
$this->_initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post construction routine.
|
|
||||||
*
|
|
||||||
* Override this method to perform post-construction tasks.
|
|
||||||
*
|
|
||||||
* @return void Return from this method is ignored.
|
|
||||||
*/
|
|
||||||
protected function _initialize() {}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Model representing an event or an event instance.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.1
|
|
||||||
* @instantiator Ai1ec_Factory_Event.create_event_instance
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Compatibility extends Ai1ec_Event {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter.
|
|
||||||
*
|
|
||||||
* @param string $name Property name.
|
|
||||||
*
|
|
||||||
* @return mixed Property value.
|
|
||||||
*/
|
|
||||||
public function __get( $name ) {
|
|
||||||
$value = $this->get( $name );
|
|
||||||
if ( null !== $value ) {
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
return $this->get_runtime( $name );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Isset magic function.
|
|
||||||
*
|
|
||||||
* @param string $name Property name.
|
|
||||||
*
|
|
||||||
* @return bool True of false.
|
|
||||||
*/
|
|
||||||
public function __isset( $name ) {
|
|
||||||
$method_name = 'get' . $name;
|
|
||||||
if ( method_exists( $this, $method_name ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return ( null !== $this->$name );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Twig timespan short method.
|
|
||||||
*
|
|
||||||
* @return string Value.
|
|
||||||
*/
|
|
||||||
public function gettimespan_short() {
|
|
||||||
return $this->_registry->get( 'view.event.time' )
|
|
||||||
->get_timespan_html( $this, 'short' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Twig is_allday method.
|
|
||||||
*
|
|
||||||
* @return bool Value.
|
|
||||||
*/
|
|
||||||
public function getis_allday() {
|
|
||||||
return $this->is_allday();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Twig is_multiday method.
|
|
||||||
*
|
|
||||||
* @return bool Value.
|
|
||||||
*/
|
|
||||||
public function getis_multiday() {
|
|
||||||
return $this->is_multiday();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns Event instance permalink for FER compatibility.
|
|
||||||
*
|
|
||||||
* @return string Event instance permalink.
|
|
||||||
*/
|
|
||||||
public function getpermalink() {
|
|
||||||
return $this->get_runtime( 'instance_permalink' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns Event timespan for popup.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getpopup_timespan() {
|
|
||||||
return $this->_registry->get( 'twig.ai1ec-extension' )
|
|
||||||
->timespan( $this, 'short' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns Avatar not wrapped in <a> tag.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getavatar_not_wrapped() {
|
|
||||||
return $this->getavatar( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns Event avatar URL.
|
|
||||||
*
|
|
||||||
* @return string Event avatar URL.
|
|
||||||
* @throws Ai1ec_Bootstrap_Exception
|
|
||||||
*/
|
|
||||||
public function getavatar_url() {
|
|
||||||
return $this->_registry->get(
|
|
||||||
'view.event.avatar'
|
|
||||||
)->get_event_avatar_url( $this );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,895 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Model representing an event or an event instance.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @instantiator Ai1ec_Factory_Event.create_event_instance
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Event_Entity Data store object reference.
|
|
||||||
*/
|
|
||||||
protected $_entity = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Map of fields that require special care during set/get
|
|
||||||
* operations. Values have following meanings:
|
|
||||||
* [0] - both way care required;
|
|
||||||
* [1] - only `set` operations require care;
|
|
||||||
* [-1] - only `get` (for storage) operations require care.
|
|
||||||
*/
|
|
||||||
protected $_swizzable = array(
|
|
||||||
'cost' => 0,
|
|
||||||
'start' => -1,
|
|
||||||
'end' => -1,
|
|
||||||
'timezone_name' => -1,
|
|
||||||
'recurrence_dates' => 1,
|
|
||||||
'exception_dates' => 1,
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Runtime properties
|
|
||||||
*/
|
|
||||||
protected $_runtime_props = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool|null Boolean cache-definition indicating if event is multiday.
|
|
||||||
*/
|
|
||||||
protected $_is_multiday = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper to get property value.
|
|
||||||
*
|
|
||||||
* @param string $property Name of property to get.
|
|
||||||
* @param mixed $default Default value to return.
|
|
||||||
*
|
|
||||||
* @return mixed Actual property.
|
|
||||||
*/
|
|
||||||
public function get( $property, $default = null ) {
|
|
||||||
return $this->_entity->get( $property, $default );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get properties generated at runtime
|
|
||||||
*
|
|
||||||
* @param string $property
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function get_runtime( $property, $default = '' ) {
|
|
||||||
return isset( $this->_runtime_props[$property] ) ?
|
|
||||||
$this->_runtime_props[$property] :
|
|
||||||
$default;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set properties generated at runtime
|
|
||||||
*
|
|
||||||
* @param string $property
|
|
||||||
* @param string $value
|
|
||||||
*/
|
|
||||||
public function set_runtime( $property, $value ) {
|
|
||||||
$this->_runtime_props[$property] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle property initiation.
|
|
||||||
*
|
|
||||||
* Decides, how to extract value stored in permanent storage.
|
|
||||||
*
|
|
||||||
* @param string $property Name of property to handle
|
|
||||||
* @param mixed $value Value, read from permanent storage
|
|
||||||
*
|
|
||||||
* @return bool Success
|
|
||||||
*/
|
|
||||||
public function set( $property, $value ) {
|
|
||||||
if (
|
|
||||||
isset( $this->_swizzable[$property] ) &&
|
|
||||||
$this->_swizzable[$property] >= 0
|
|
||||||
) {
|
|
||||||
$method = '_handle_property_construct_' . $property;
|
|
||||||
$value = $this->{$method}( $value );
|
|
||||||
}
|
|
||||||
$this->_entity->set( $property, $value );
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the event is all day, during the specified number of days
|
|
||||||
*
|
|
||||||
* @param number $length
|
|
||||||
*/
|
|
||||||
public function set_all_day( $length = 1 ) {
|
|
||||||
// set allday as true
|
|
||||||
$this->set( 'allday', true );
|
|
||||||
$start = $this->get( 'start' );
|
|
||||||
// reset time component
|
|
||||||
$start->set_time( 0, 0, 0 );
|
|
||||||
$end = $this->_registry->get( 'date.time', $start );
|
|
||||||
// set the correct length
|
|
||||||
$end->adjust_day( $length );
|
|
||||||
$this->set( 'end', $end );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the event as if it has no end time
|
|
||||||
*/
|
|
||||||
public function set_no_end_time() {
|
|
||||||
$this->set( 'instant_event', true );
|
|
||||||
$start = $this->get( 'start' );
|
|
||||||
$end = $this->_registry->get( 'date.time', $start );
|
|
||||||
$end->set_time(
|
|
||||||
$start->format( 'H' ),
|
|
||||||
$start->format( 'i' ) + 15,
|
|
||||||
$start->format( 's' )
|
|
||||||
);
|
|
||||||
$this->set( 'end', $end );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set object fields from arbitrary array.
|
|
||||||
*
|
|
||||||
* @param array $data Supposedly map of fields to initiate.
|
|
||||||
*
|
|
||||||
* @return Ai1ec_Event Instance of self for chaining.
|
|
||||||
*/
|
|
||||||
public function initialize_from_array( array $data ) {
|
|
||||||
|
|
||||||
// =======================================================
|
|
||||||
// = Assign each event field the value from the database =
|
|
||||||
// =======================================================
|
|
||||||
foreach ( $this->_entity->list_properties() as $property ) {
|
|
||||||
if ( 'post' !== $property && isset( $data[$property] ) ) {
|
|
||||||
$this->set( $property, $data[$property] );
|
|
||||||
unset( $data[$property] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( isset( $data['post'] ) ) {
|
|
||||||
$this->set( 'post', (object)$data['post'] );
|
|
||||||
} else {
|
|
||||||
// ========================================
|
|
||||||
// = Remaining fields are the post fields =
|
|
||||||
// ========================================
|
|
||||||
$this->set( 'post', (object)$data );
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete the events from all tables
|
|
||||||
*/
|
|
||||||
public function delete() {
|
|
||||||
// delete post (this will trigger deletion of cached events, and
|
|
||||||
// remove the event from events table)
|
|
||||||
wp_delete_post( $this->get( 'post_id' ), true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize object from ID.
|
|
||||||
*
|
|
||||||
* Attempts to retrieve entity from database and if succeeds - uses
|
|
||||||
* {@see self::initialize_from_array} to initiate actual values.
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post (event) to initiate.
|
|
||||||
* @param int|bool $instance ID of event instance, false for base event.
|
|
||||||
*
|
|
||||||
* @return Ai1ec_Event Instance of self for chaining.
|
|
||||||
*
|
|
||||||
* @throws Ai1ec_Event_Not_Found_Exception If entity is not locatable.
|
|
||||||
*/
|
|
||||||
public function initialize_from_id( $post_id, $instance = false ) {
|
|
||||||
$post = get_post( $post_id );
|
|
||||||
if ( ! $post || $post->post_status == 'auto-draft' ) {
|
|
||||||
throw new Ai1ec_Event_Not_Found_Exception(
|
|
||||||
'Post with ID \'' . $post_id .
|
|
||||||
'\' could not be retrieved from the database.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$post_id = (int)$post_id;
|
|
||||||
$dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
|
|
||||||
$left_join = '';
|
|
||||||
$select_sql = '
|
|
||||||
e.post_id,
|
|
||||||
e.timezone_name,
|
|
||||||
e.recurrence_rules,
|
|
||||||
e.exception_rules,
|
|
||||||
e.allday,
|
|
||||||
e.instant_event,
|
|
||||||
e.recurrence_dates,
|
|
||||||
e.exception_dates,
|
|
||||||
e.venue,
|
|
||||||
e.country,
|
|
||||||
e.address,
|
|
||||||
e.city,
|
|
||||||
e.province,
|
|
||||||
e.postal_code,
|
|
||||||
e.show_map,
|
|
||||||
e.contact_name,
|
|
||||||
e.contact_phone,
|
|
||||||
e.contact_email,
|
|
||||||
e.contact_url,
|
|
||||||
e.cost,
|
|
||||||
e.ticket_url,
|
|
||||||
e.ical_feed_url,
|
|
||||||
e.ical_source_url,
|
|
||||||
e.ical_organizer,
|
|
||||||
e.ical_contact,
|
|
||||||
e.ical_uid,
|
|
||||||
e.longitude,
|
|
||||||
e.latitude,
|
|
||||||
e.show_coordinates,
|
|
||||||
GROUP_CONCAT( ttc.term_id ) AS categories,
|
|
||||||
GROUP_CONCAT( ttt.term_id ) AS tags
|
|
||||||
';
|
|
||||||
|
|
||||||
if (
|
|
||||||
false !== $instance &&
|
|
||||||
is_numeric( $instance ) &&
|
|
||||||
$instance > 0
|
|
||||||
) {
|
|
||||||
$select_sql .= ', IF( aei.start IS NOT NULL, aei.start, e.start ) as start,' .
|
|
||||||
' IF( aei.start IS NOT NULL, aei.end, e.end ) as end ';
|
|
||||||
|
|
||||||
$instance = (int)$instance;
|
|
||||||
$this->set( 'instance_id', $instance );
|
|
||||||
$left_join = 'LEFT JOIN ' . $dbi->get_table_name( 'ai1ec_event_instances' ) .
|
|
||||||
' aei ON aei.id = ' . $instance . ' AND e.post_id = aei.post_id ';
|
|
||||||
} else {
|
|
||||||
$select_sql .= ', e.start as start, e.end as end, e.allday ';
|
|
||||||
if ( -1 === (int)$instance ) {
|
|
||||||
$select_sql .= ', aei.id as instance_id ';
|
|
||||||
$left_join = 'LEFT JOIN ' .
|
|
||||||
$dbi->get_table_name( 'ai1ec_event_instances' ) .
|
|
||||||
' aei ON e.post_id = aei.post_id ' .
|
|
||||||
'AND e.start = aei.start AND e.end = aei.end ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================
|
|
||||||
// = Fetch event from database =
|
|
||||||
// =============================
|
|
||||||
$query = 'SELECT ' . $select_sql . '
|
|
||||||
FROM ' . $dbi->get_table_name( 'ai1ec_events' ) . ' e
|
|
||||||
LEFT JOIN ' .
|
|
||||||
$dbi->get_table_name( 'term_relationships' ) . ' tr
|
|
||||||
ON ( e.post_id = tr.object_id )
|
|
||||||
LEFT JOIN ' . $dbi->get_table_name( 'term_taxonomy' ) . ' ttc
|
|
||||||
ON (
|
|
||||||
tr.term_taxonomy_id = ttc.term_taxonomy_id AND
|
|
||||||
ttc.taxonomy = \'events_categories\'
|
|
||||||
)
|
|
||||||
LEFT JOIN ' . $dbi->get_table_name( 'term_taxonomy' ) . ' ttt
|
|
||||||
ON (
|
|
||||||
tr.term_taxonomy_id = ttt.term_taxonomy_id AND
|
|
||||||
ttt.taxonomy = \'events_tags\'
|
|
||||||
)
|
|
||||||
' . $left_join . '
|
|
||||||
WHERE e.post_id = ' . $post_id . '
|
|
||||||
GROUP BY e.post_id';
|
|
||||||
|
|
||||||
$event = $dbi->get_row( $query, ARRAY_A );
|
|
||||||
if ( null === $event || null === $event['post_id'] ) {
|
|
||||||
throw new Ai1ec_Event_Not_Found_Exception(
|
|
||||||
'Event with ID \'' . $post_id .
|
|
||||||
'\' could not be retrieved from the database.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$event['post'] = $post;
|
|
||||||
return $this->initialize_from_array( $event );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getenddate() {
|
|
||||||
$end = $this->get( 'end' );
|
|
||||||
if ( $this->is_allday() ) {
|
|
||||||
$end->set_time(
|
|
||||||
$end->format( 'H' ),
|
|
||||||
$end->format( 'i' ),
|
|
||||||
$end->format( 's' ) - 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $end;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns enddate specific info.
|
|
||||||
*
|
|
||||||
* @return array Date info structure.
|
|
||||||
*/
|
|
||||||
public function getenddate_info() {
|
|
||||||
$end = $this->getenddate();
|
|
||||||
return array(
|
|
||||||
'month' => $this->get( 'end' )->format_i18n( 'M' ),
|
|
||||||
'day' => $this->get( 'end' )->format_i18n( 'j' ),
|
|
||||||
'weekday' => $this->get( 'end' )->format_i18n( 'D' ),
|
|
||||||
'year' => $this->get( 'end' )->format_i18n( 'Y' ),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create new event object, using provided data for initialization.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Injected object registry.
|
|
||||||
* @param int|array|null $data Look up post with id $data, or
|
|
||||||
* initialize fields with associative
|
|
||||||
* array $data containing both post
|
|
||||||
* and event fields.
|
|
||||||
* @param int|bool $instance Optionally instance ID. When ID
|
|
||||||
* value is -1 then it is
|
|
||||||
* retrieved from db.
|
|
||||||
*
|
|
||||||
* @throws Ai1ec_Invalid_Argument_Exception When $data is not one
|
|
||||||
* of int|array|null.
|
|
||||||
* @throws Ai1ec_Event_Not_Found_Exception When $data relates to
|
|
||||||
* non-existent ID.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
function __construct(
|
|
||||||
Ai1ec_Registry_Object $registry,
|
|
||||||
$data = null,
|
|
||||||
$instance = false
|
|
||||||
) {
|
|
||||||
parent::__construct( $registry );
|
|
||||||
$this->_entity = $this->_registry->get( 'model.event.entity' );
|
|
||||||
if ( null === $data ) {
|
|
||||||
return; // empty object
|
|
||||||
} else if ( is_numeric( $data ) ) {
|
|
||||||
$this->initialize_from_id( $data, $instance );
|
|
||||||
} else if ( is_array( $data ) ) {
|
|
||||||
$this->initialize_from_array( $data );
|
|
||||||
} else {
|
|
||||||
throw new Ai1ec_Invalid_Argument_Exception(
|
|
||||||
'Argument to constructor must be integer, array or null' .
|
|
||||||
', not ' . var_export( $data, true )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $this->is_allday() ) {
|
|
||||||
try {
|
|
||||||
$timezone = $this->_registry->get( 'date.timezone' )
|
|
||||||
->get( $this->get( 'timezone_name' ) );
|
|
||||||
$this->_entity->set_preferred_timezone( $timezone );
|
|
||||||
} catch ( Exception $excpt ) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Twig method for retrieving avatar.
|
|
||||||
*
|
|
||||||
* @param bool $wrap_permalink Whether to wrap avatar in <a> element or not
|
|
||||||
*
|
|
||||||
* @return string Avatar markup
|
|
||||||
*/
|
|
||||||
public function getavatar( $wrap_permalink = true ) {
|
|
||||||
return $this->_registry->
|
|
||||||
get( 'view.event.avatar' )->get_event_avatar(
|
|
||||||
$this,
|
|
||||||
$this->_registry->get( 'view.calendar.fallbacks' )->get_all(),
|
|
||||||
'',
|
|
||||||
$wrap_permalink
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether Event has geo information.
|
|
||||||
*
|
|
||||||
* @return bool True or false.
|
|
||||||
*/
|
|
||||||
public function has_geoinformation() {
|
|
||||||
$latitude = floatval( $this->get( 'latitude') );
|
|
||||||
$longitude = floatval( $this->get( 'longitude' ) );
|
|
||||||
return (
|
|
||||||
(
|
|
||||||
$latitude >= 0.000000000000001 ||
|
|
||||||
$latitude <= -0.000000000000001
|
|
||||||
) &&
|
|
||||||
(
|
|
||||||
$longitude >= 0.000000000000001 ||
|
|
||||||
$longitude <= -0.000000000000001
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _handle_property_construct_recurrence_dates( $value ) {
|
|
||||||
if ( $value ) {
|
|
||||||
$this->_entity->set( 'recurrence_rules', 'RDATE=' . $value );
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _handle_property_construct_exception_dates( $value ) {
|
|
||||||
if ( $value ) {
|
|
||||||
$this->_entity->set( 'exception_rules', 'EXDATE=' . $value );
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle `cost` value reading from permanent storage.
|
|
||||||
*
|
|
||||||
* @param string $value Value stored in permanent storage
|
|
||||||
*
|
|
||||||
* @return bool Success: true, always
|
|
||||||
*/
|
|
||||||
protected function _handle_property_construct_cost( $value ) {
|
|
||||||
$test_value = false;
|
|
||||||
if (
|
|
||||||
isset( $value{1} ) && (
|
|
||||||
':' === $value{1} || ';' === $value{1}
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
$test_value = unserialize( $value );
|
|
||||||
}
|
|
||||||
$cost = $is_free = NULL;
|
|
||||||
if ( false === $test_value ) {
|
|
||||||
$cost = trim( $value );
|
|
||||||
$is_free = false;
|
|
||||||
} else {
|
|
||||||
extract( $test_value, EXTR_IF_EXISTS );
|
|
||||||
}
|
|
||||||
$this->_entity->set( 'is_free', (bool)$is_free );
|
|
||||||
return (string)$cost;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_uid_pattern() {
|
|
||||||
static $format = null;
|
|
||||||
if ( null === $format ) {
|
|
||||||
$site_url = parse_url( ai1ec_get_site_url() );
|
|
||||||
$format = 'ai1ec-%d@' . $site_url['host'];
|
|
||||||
if ( isset( $site_url['path'] ) ) {
|
|
||||||
$format .= $site_url['path'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $format;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get UID to be used for current event.
|
|
||||||
*
|
|
||||||
* The generated format is cached in static variable within this function
|
|
||||||
* to re-use when generating UIDs for different entries.
|
|
||||||
*
|
|
||||||
* @return string Generated UID.
|
|
||||||
*
|
|
||||||
* @staticvar string $format Cached format.
|
|
||||||
*/
|
|
||||||
public function get_uid() {
|
|
||||||
$ical_uid = $this->get( 'ical_uid' );
|
|
||||||
if ( ! empty( $ical_uid ) ) {
|
|
||||||
return $ical_uid;
|
|
||||||
}
|
|
||||||
return sprintf( $this->get_uid_pattern(), $this->get( 'post_id' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if event is free.
|
|
||||||
*
|
|
||||||
* @return bool Free status.
|
|
||||||
*/
|
|
||||||
public function is_free() {
|
|
||||||
return (bool)$this->get( 'is_free' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if event is taking all day.
|
|
||||||
*
|
|
||||||
* @return bool True for all-day long events.
|
|
||||||
*/
|
|
||||||
public function is_allday() {
|
|
||||||
return (bool)$this->get( 'allday' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if event has virtually no time.
|
|
||||||
*
|
|
||||||
* @return bool True for instant events.
|
|
||||||
*/
|
|
||||||
public function is_instant() {
|
|
||||||
return (bool)$this->get( 'instant_event' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if event is taking multiple days.
|
|
||||||
*
|
|
||||||
* Uses object-wide variable {@see self::$_is_multiday} to store
|
|
||||||
* calculated value after first call.
|
|
||||||
*
|
|
||||||
* @return bool True for multiday events.
|
|
||||||
*/
|
|
||||||
public function is_multiday() {
|
|
||||||
if ( null === $this->_is_multiday ) {
|
|
||||||
$start = $this->get( 'start' );
|
|
||||||
$end = $this->get( 'end' );
|
|
||||||
$diff = $end->diff_sec( $start );
|
|
||||||
$this->_is_multiday = $diff > 86400 &&
|
|
||||||
$start->format( 'Y-m-d' ) !== $end->format( 'Y-m-d' );
|
|
||||||
}
|
|
||||||
return $this->_is_multiday;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the duration of the event
|
|
||||||
*
|
|
||||||
* @return number
|
|
||||||
*/
|
|
||||||
public function get_duration() {
|
|
||||||
$duration = $this->get_runtime( 'duration', null );
|
|
||||||
if ( null === $duration ) {
|
|
||||||
$duration = $this->get( 'end' )->format() -
|
|
||||||
$this->get( 'start' )->format();
|
|
||||||
$this->set_runtime( 'duration', $duration );
|
|
||||||
}
|
|
||||||
return $duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create/update entity representation.
|
|
||||||
*
|
|
||||||
* Saves the current event data to the database. If $this->post_id exists,
|
|
||||||
* but $update is false, creates a new record in the ai1ec_events table of
|
|
||||||
* this event data, but does not try to create a new post. Else if $update
|
|
||||||
* is true, updates existing event record. If $this->post_id is empty,
|
|
||||||
* creates a new post AND record in the ai1ec_events table for this event.
|
|
||||||
*
|
|
||||||
* @param bool $update Whether to update an existing event or create a
|
|
||||||
* new one
|
|
||||||
* @param bool $backward_compatibility The (wpdb) ofr the new wordpress 4.4
|
|
||||||
* now inserts NULL as null values. The previous version, if you insert a NULL
|
|
||||||
* value in an int value, the values saved would be 0 instead of null.
|
|
||||||
* @return int The post_id of the new or existing event.
|
|
||||||
*/
|
|
||||||
function save( $update = false, $backward_compatibility = true ) {
|
|
||||||
do_action( 'ai1ec_pre_save_event', $this, $update );
|
|
||||||
if ( ! $update ) {
|
|
||||||
$response = apply_filters( 'ai1ec_event_save_new', $this );
|
|
||||||
if ( is_wp_error( $response ) ) {
|
|
||||||
throw new Ai1ec_Event_Create_Exception(
|
|
||||||
'Failed to create event: ' . $response->get_error_message()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
$columns = $this->prepare_store_entity();
|
|
||||||
$format = $this->prepare_store_format( $columns, $backward_compatibility );
|
|
||||||
$table_name = $dbi->get_table_name( 'ai1ec_events' );
|
|
||||||
$post_id = $columns['post_id'];
|
|
||||||
|
|
||||||
if ( $this->get( 'end' )->is_empty() ) {
|
|
||||||
$this->set_no_end_time();
|
|
||||||
}
|
|
||||||
if ( $post_id ) {
|
|
||||||
$success = false;
|
|
||||||
if ( ! $update ) {
|
|
||||||
$success = $dbi->insert(
|
|
||||||
$table_name,
|
|
||||||
$columns,
|
|
||||||
$format
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$success = $dbi->update(
|
|
||||||
$table_name,
|
|
||||||
$columns,
|
|
||||||
array( 'post_id' => $columns['post_id'] ),
|
|
||||||
$format,
|
|
||||||
array( '%d' )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ( false === $success ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// ===================
|
|
||||||
// = Insert new post =
|
|
||||||
// ===================
|
|
||||||
$post_id = wp_insert_post( $this->get( 'post' ), false );
|
|
||||||
if ( 0 === $post_id ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$this->set( 'post_id', $post_id );
|
|
||||||
$columns['post_id'] = $post_id;
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// = Insert new event data =
|
|
||||||
// =========================
|
|
||||||
if ( false === $dbi->insert( $table_name, $columns, $format ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$taxonomy = $this->_registry->get(
|
|
||||||
'model.event.taxonomy',
|
|
||||||
$post_id
|
|
||||||
);
|
|
||||||
$cats = $this->get( 'categories' );
|
|
||||||
if (
|
|
||||||
is_array( $cats ) &&
|
|
||||||
! empty( $cats )
|
|
||||||
) {
|
|
||||||
$taxonomy->set_categories( $cats );
|
|
||||||
}
|
|
||||||
$tags = $this->get( 'tags' );
|
|
||||||
if (
|
|
||||||
is_array( $tags ) &&
|
|
||||||
! empty( $tags )
|
|
||||||
) {
|
|
||||||
$taxonomy->set_tags( $tags );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
$feed = $this->get( 'feed' ) &&
|
|
||||||
isset( $feed->feed_id )
|
|
||||||
) {
|
|
||||||
$taxonomy->set_feed( $feed );
|
|
||||||
}
|
|
||||||
|
|
||||||
// give other plugins / extensions the ability to do things
|
|
||||||
// when saving, like fetching authors which i removed as it's not core.
|
|
||||||
do_action( 'ai1ec_save_event' );
|
|
||||||
|
|
||||||
$instance_model = $this->_registry->get( 'model.event.instance' );
|
|
||||||
$instance_model->recreate( $this );
|
|
||||||
|
|
||||||
do_action( 'ai1ec_event_saved', $post_id, $this, $update );
|
|
||||||
return $post_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare fields format flags to use in database operations.
|
|
||||||
*
|
|
||||||
* @param array $columns Array of columns with data to insert.
|
|
||||||
*
|
|
||||||
* @return array List of format flags to use in integrations with DBI.
|
|
||||||
*/
|
|
||||||
public function prepare_store_format( array &$columns, $backward_compatibility = true ) {
|
|
||||||
$format = array(
|
|
||||||
'%d', // post_id
|
|
||||||
'%d', // start
|
|
||||||
'%d', // end
|
|
||||||
'%s', // timezone_name
|
|
||||||
'%d', // allday
|
|
||||||
'%d', // instant_event
|
|
||||||
'%s', // recurrence_rules
|
|
||||||
'%s', // exception_rules
|
|
||||||
'%s', // recurrence_dates
|
|
||||||
'%s', // exception_dates
|
|
||||||
'%s', // venue
|
|
||||||
'%s', // country
|
|
||||||
'%s', // address
|
|
||||||
'%s', // city
|
|
||||||
'%s', // province
|
|
||||||
'%s', // postal_code
|
|
||||||
'%d', // show_map
|
|
||||||
'%s', // contact_name
|
|
||||||
'%s', // contact_phone
|
|
||||||
'%s', // contact_email
|
|
||||||
'%s', // contact_url
|
|
||||||
'%s', // cost
|
|
||||||
'%s', // ticket_url
|
|
||||||
'%s', // ical_feed_url
|
|
||||||
'%s', // ical_source_url
|
|
||||||
'%s', // ical_uid
|
|
||||||
'%d', // show_coordinates
|
|
||||||
'%f', // latitude
|
|
||||||
'%f', // longitude
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $backward_compatibility ) {
|
|
||||||
$columns_count = count( $columns );
|
|
||||||
if ( count( $format ) !== $columns_count ) {
|
|
||||||
throw new Ai1ec_Event_Not_Found_Exception(
|
|
||||||
'Data columns count differs from format columns count'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$index = 0;
|
|
||||||
foreach ( $columns as $key => $value ) {
|
|
||||||
if ( '%d' === $format[ $index ] ) {
|
|
||||||
if ( is_null( $value ) ) {
|
|
||||||
$columns[ $key ] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $format;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare event entity {@see self::$_entity} for persistent storage.
|
|
||||||
*
|
|
||||||
* Creates an array of database fields and corresponding values.
|
|
||||||
*
|
|
||||||
* @return array Map of fields to store.
|
|
||||||
*/
|
|
||||||
public function prepare_store_entity() {
|
|
||||||
$entity = array(
|
|
||||||
'post_id' => $this->storage_format( 'post_id' ),
|
|
||||||
'start' => $this->storage_format( 'start' ),
|
|
||||||
'end' => $this->storage_format( 'end' ),
|
|
||||||
'timezone_name' => $this->storage_format( 'timezone_name' ),
|
|
||||||
'allday' => $this->storage_format( 'allday' ),
|
|
||||||
'instant_event' => $this->storage_format( 'instant_event' ),
|
|
||||||
'recurrence_rules' => $this->storage_format( 'recurrence_rules' ),
|
|
||||||
'exception_rules' => $this->storage_format( 'exception_rules' ),
|
|
||||||
'recurrence_dates' => $this->storage_format( 'recurrence_dates' ),
|
|
||||||
'exception_dates' => $this->storage_format( 'exception_dates' ),
|
|
||||||
'venue' => $this->storage_format( 'venue' ),
|
|
||||||
'country' => $this->storage_format( 'country' ),
|
|
||||||
'address' => $this->storage_format( 'address' ),
|
|
||||||
'city' => $this->storage_format( 'city' ),
|
|
||||||
'province' => $this->storage_format( 'province' ),
|
|
||||||
'postal_code' => $this->storage_format( 'postal_code' ),
|
|
||||||
'show_map' => $this->storage_format( 'show_map' ),
|
|
||||||
'contact_name' => $this->storage_format( 'contact_name' ),
|
|
||||||
'contact_phone' => $this->storage_format( 'contact_phone' ),
|
|
||||||
'contact_email' => $this->storage_format( 'contact_email' ),
|
|
||||||
'contact_url' => $this->storage_format( 'contact_url' ),
|
|
||||||
'cost' => $this->storage_format( 'cost' ),
|
|
||||||
'ticket_url' => $this->storage_format( 'ticket_url' ),
|
|
||||||
'ical_feed_url' => $this->storage_format( 'ical_feed_url' ),
|
|
||||||
'ical_source_url' => $this->storage_format( 'ical_source_url' ),
|
|
||||||
'ical_uid' => $this->storage_format( 'ical_uid' ),
|
|
||||||
'show_coordinates' => $this->storage_format( 'show_coordinates' ),
|
|
||||||
'latitude' => $this->storage_format( 'latitude', '' ),
|
|
||||||
'longitude' => $this->storage_format( 'longitude', '' ),
|
|
||||||
);
|
|
||||||
return $entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compact field for writing to persistent storage.
|
|
||||||
*
|
|
||||||
* @param string $field Name of field to compact.
|
|
||||||
* @param mixed $default Default value to use for undescribed fields.
|
|
||||||
*
|
|
||||||
* @return mixed Value or $default.
|
|
||||||
*/
|
|
||||||
public function storage_format( $field, $default = null ) {
|
|
||||||
$value = $this->_entity->get( $field, $default );
|
|
||||||
if (
|
|
||||||
isset( $this->_swizzable[$field] ) &&
|
|
||||||
$this->_swizzable[$field] <= 0
|
|
||||||
) {
|
|
||||||
$value = $this->{ '_handle_property_destruct_' . $field }( $value );
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allow properties to be modified after cloning.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __clone() {
|
|
||||||
$this->_entity = clone $this->_entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode timezone to use for event.
|
|
||||||
*
|
|
||||||
* Following algorythm is used to detect a value:
|
|
||||||
* - take value provided in input;
|
|
||||||
* - if empty - take value associated with start time;
|
|
||||||
* - if empty - take current environment timezone.
|
|
||||||
*
|
|
||||||
* @param string $timezone_name Timezone provided in input.
|
|
||||||
*
|
|
||||||
* @return string Timezone name to use for event in future.
|
|
||||||
*/
|
|
||||||
protected function _handle_property_destruct_timezone_name(
|
|
||||||
$timezone_name
|
|
||||||
) {
|
|
||||||
if ( empty( $timezone_name ) ) {
|
|
||||||
$timezone_name = $this->get( 'start' )->get_timezone();
|
|
||||||
if ( empty( $timezone_name ) ) {
|
|
||||||
$timezone_name = $this->_registry->get( 'date.timezone' )
|
|
||||||
->get_default_timezone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $timezone_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format datetime to UNIX timestamp for storage.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Date_Time $start Datetime object to compact.
|
|
||||||
*
|
|
||||||
* @return int UNIX timestamp.
|
|
||||||
*/
|
|
||||||
protected function _handle_property_destruct_start( Ai1ec_Date_Time $start ) {
|
|
||||||
return $start->format_to_gmt();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format datetime to UNIX timestamp for storage.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Date_Time $end Datetime object to compact.
|
|
||||||
*
|
|
||||||
* @return int UNIX timestamp.
|
|
||||||
*/
|
|
||||||
protected function _handle_property_destruct_end( Ai1ec_Date_Time $end ) {
|
|
||||||
return $end->format_to_gmt();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle `cost` writing to permanent storage.
|
|
||||||
*
|
|
||||||
* @param string $cost Value of cost.
|
|
||||||
*
|
|
||||||
* @return string Serialized value to store.
|
|
||||||
*/
|
|
||||||
protected function _handle_property_destruct_cost( $cost ) {
|
|
||||||
$cost = array(
|
|
||||||
'cost' => $cost,
|
|
||||||
'is_free' => false,
|
|
||||||
);
|
|
||||||
if ( $this->get( 'is_free' ) ) {
|
|
||||||
$cost['is_free'] = true;
|
|
||||||
}
|
|
||||||
return serialize( $cost );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the submitter information array
|
|
||||||
* @return array (
|
|
||||||
* is_organizer => 1 if the organizer is the submitter,
|
|
||||||
* email => if is_organizer is 0, them this property has the email of the submitter,
|
|
||||||
* name => if is_organizer is 0, them this property has the name of the submitter
|
|
||||||
* )
|
|
||||||
*/
|
|
||||||
public function get_submitter_info() {
|
|
||||||
$post_id = $this->get( 'post_id' );
|
|
||||||
if ( empty( $post_id ) ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
$submitter_info = get_post_meta(
|
|
||||||
$post_id,
|
|
||||||
'_submitter_info',
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if ( false == ai1ec_is_blank( $submitter_info ) ) {
|
|
||||||
$submitter_info = json_decode( $submitter_info, true );
|
|
||||||
if ( is_array( $submitter_info ) ) {
|
|
||||||
return $submitter_info;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the submitter information into post metadata
|
|
||||||
*/
|
|
||||||
public function save_submitter_info( $is_submitter, $submitter_email, $submitter_name ) {
|
|
||||||
$post_id = $this->get( 'post_id' );
|
|
||||||
if ( empty( $post_id ) ) {
|
|
||||||
throw new Exception( 'Post id empty' );
|
|
||||||
}
|
|
||||||
$save = false;
|
|
||||||
if ( 1 === intval( $is_submitter ) ) {
|
|
||||||
$submitter_info['is_organizer'] = 1;
|
|
||||||
if ( false === ai1ec_is_blank( $this->get( 'contact_email' ) ) ) {
|
|
||||||
$save = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$submitter_info['is_organizer'] = 0;
|
|
||||||
if ( false === ai1ec_is_blank( $submitter_email ) ) {
|
|
||||||
$submitter_info['email'] = trim( $submitter_email );
|
|
||||||
$submitter_info['name'] = trim( $submitter_name );
|
|
||||||
$save = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( $save ) {
|
|
||||||
update_post_meta( $post_id, '_submitter_info', json_encode( $submitter_info ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,512 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles create/update operations.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Creating extends Ai1ec_Base {
|
|
||||||
|
|
||||||
protected function is_valid_event( $post ) {
|
|
||||||
// verify this came from the our screen and with proper authorization,
|
|
||||||
// because save_post can be triggered at other times
|
|
||||||
if (
|
|
||||||
! isset( $_POST[AI1EC_POST_TYPE] ) ||
|
|
||||||
! wp_verify_nonce( $_POST[AI1EC_POST_TYPE], 'ai1ec' )
|
|
||||||
) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
isset( $post->post_status ) &&
|
|
||||||
'auto-draft' === $post->post_status
|
|
||||||
) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify if this is not inline-editing
|
|
||||||
if (
|
|
||||||
isset( $_REQUEST['action'] ) &&
|
|
||||||
'inline-save' === $_REQUEST['action']
|
|
||||||
) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify that the post_type is that of an event
|
|
||||||
if ( $post->post_type !== AI1EC_POST_TYPE ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function _parse_post_to_event( $post_id ) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* =====================================================================
|
|
||||||
*
|
|
||||||
* CHANGE CODE BELOW TO HAVE FOLLOWING PROPERTIES:
|
|
||||||
* - be initializiable from model;
|
|
||||||
* - have sane defaults;
|
|
||||||
* - avoid that cluster of isset and ternary operator.
|
|
||||||
*
|
|
||||||
* =====================================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
$all_day = isset( $_POST['ai1ec_all_day_event'] ) ? 1 : 0;
|
|
||||||
$instant_event = isset( $_POST['ai1ec_instant_event'] ) ? 1 : 0;
|
|
||||||
$timezone_name = isset( $_POST['ai1ec_timezone_name'] ) ? sanitize_text_field( $_POST['ai1ec_timezone_name'] ) : 'sys.default';
|
|
||||||
$start_time = isset( $_POST['ai1ec_start_time'] ) ? sanitize_text_field( $_POST['ai1ec_start_time'] ) : '';
|
|
||||||
$end_time = isset( $_POST['ai1ec_end_time'] ) ? sanitize_text_field( $_POST['ai1ec_end_time'] ) : '';
|
|
||||||
$venue = isset( $_POST['ai1ec_venue'] ) ? sanitize_text_field( $_POST['ai1ec_venue'] ) : '';
|
|
||||||
$address = isset( $_POST['ai1ec_address'] ) ? sanitize_text_field( $_POST['ai1ec_address'] ) : '';
|
|
||||||
$city = isset( $_POST['ai1ec_city'] ) ? sanitize_text_field( $_POST['ai1ec_city'] ) : '';
|
|
||||||
$province = isset( $_POST['ai1ec_province'] ) ? sanitize_text_field( $_POST['ai1ec_province'] ) : '';
|
|
||||||
$postal_code = isset( $_POST['ai1ec_postal_code'] ) ? sanitize_text_field( $_POST['ai1ec_postal_code'] ) : '';
|
|
||||||
$country = isset( $_POST['ai1ec_country'] ) ? sanitize_text_field( $_POST['ai1ec_country'] ) : '';
|
|
||||||
$google_map = isset( $_POST['ai1ec_google_map'] ) ? 1 : 0;
|
|
||||||
$cost = isset( $_POST['ai1ec_cost'] ) ? sanitize_text_field( $_POST['ai1ec_cost'] ) : '';
|
|
||||||
$is_free = isset( $_POST['ai1ec_is_free'] ) ? (bool)$_POST['ai1ec_is_free'] : false;
|
|
||||||
$ticket_url = isset( $_POST['ai1ec_ticket_url'] ) ? sanitize_text_field( $_POST['ai1ec_ticket_url'] ) : '';
|
|
||||||
$contact_name = isset( $_POST['ai1ec_contact_name'] ) ? sanitize_text_field( $_POST['ai1ec_contact_name'] ) : '';
|
|
||||||
$contact_phone = isset( $_POST['ai1ec_contact_phone'] ) ? sanitize_text_field( $_POST['ai1ec_contact_phone'] ) : '';
|
|
||||||
$contact_email = isset( $_POST['ai1ec_contact_email'] ) ? sanitize_text_field( $_POST['ai1ec_contact_email'] ) : '';
|
|
||||||
$contact_url = isset( $_POST['ai1ec_contact_url'] ) ? sanitize_text_field( $_POST['ai1ec_contact_url'] ) : '';
|
|
||||||
$show_coordinates = isset( $_POST['ai1ec_input_coordinates'] )? 1 : 0;
|
|
||||||
$longitude = isset( $_POST['ai1ec_longitude'] ) ? sanitize_text_field( $_POST['ai1ec_longitude'] ) : '';
|
|
||||||
$latitude = isset( $_POST['ai1ec_latitude'] ) ? sanitize_text_field( $_POST['ai1ec_latitude'] ) : '';
|
|
||||||
$cost_type = isset( $_POST['ai1ec_cost_type'] ) ? sanitize_text_field( $_POST['ai1ec_cost_type'] ) : '';
|
|
||||||
$rrule = null;
|
|
||||||
$exrule = null;
|
|
||||||
$exdate = null;
|
|
||||||
$rdate = null;
|
|
||||||
|
|
||||||
if ( 'external' !== $cost_type ) {
|
|
||||||
$ticket_url = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_remap_recurrence_dates();
|
|
||||||
// if rrule is set, convert it from local to UTC time
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_repeat'] ) &&
|
|
||||||
! empty( $_POST['ai1ec_repeat'] )
|
|
||||||
) {
|
|
||||||
$rrule = $_POST['ai1ec_rrule'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// add manual dates
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_exdate'] ) &&
|
|
||||||
! empty( $_POST['ai1ec_exdate'] )
|
|
||||||
) {
|
|
||||||
$exdate = $_POST['ai1ec_exdate'];
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_rdate'] ) &&
|
|
||||||
! empty( $_POST['ai1ec_rdate'] )
|
|
||||||
) {
|
|
||||||
$rdate = $_POST['ai1ec_rdate'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// if exrule is set, convert it from local to UTC time
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_exclude'] ) &&
|
|
||||||
! empty( $_POST['ai1ec_exclude'] ) &&
|
|
||||||
( null !== $rrule || null !== $rdate ) // no point for exclusion, if repetition is not set
|
|
||||||
) {
|
|
||||||
$exrule = $this->_registry->get( 'recurrence.rule' )->merge_exrule(
|
|
||||||
$_POST['ai1ec_exrule'],
|
|
||||||
$rrule
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$is_new = false;
|
|
||||||
try {
|
|
||||||
$event = $this->_registry->get(
|
|
||||||
'model.event',
|
|
||||||
$post_id ? $post_id : null
|
|
||||||
);
|
|
||||||
} catch ( Ai1ec_Event_Not_Found_Exception $excpt ) {
|
|
||||||
// Post exists, but event data hasn't been saved yet. Create new event
|
|
||||||
// object.
|
|
||||||
$is_new = true;
|
|
||||||
$event = $this->_registry->get( 'model.event' );
|
|
||||||
}
|
|
||||||
$formatted_timezone = $this->_registry->get( 'date.timezone' )
|
|
||||||
->get_name( $timezone_name );
|
|
||||||
if ( empty( $timezone_name ) || ! $formatted_timezone ) {
|
|
||||||
$timezone_name = 'sys.default';
|
|
||||||
}
|
|
||||||
|
|
||||||
unset( $formatted_timezone );
|
|
||||||
$start_time_entry = $this->_registry
|
|
||||||
->get( 'date.time', $start_time, $timezone_name );
|
|
||||||
$end_time_entry = $this->_registry
|
|
||||||
->get( 'date.time', $end_time, $timezone_name );
|
|
||||||
|
|
||||||
$timezone_name = $start_time_entry->get_timezone();
|
|
||||||
if ( null === $timezone_name ) {
|
|
||||||
$timezone_name = $start_time_entry->get_default_format_timezone();
|
|
||||||
}
|
|
||||||
|
|
||||||
$event->set( 'post_id', $post_id );
|
|
||||||
$event->set( 'start', $start_time_entry );
|
|
||||||
if ( $instant_event ) {
|
|
||||||
$event->set_no_end_time();
|
|
||||||
} else {
|
|
||||||
$event->set( 'end', $end_time_entry );
|
|
||||||
$event->set( 'instant_event', false );
|
|
||||||
}
|
|
||||||
$event->set( 'timezone_name', $timezone_name );
|
|
||||||
$event->set( 'allday', $all_day );
|
|
||||||
$event->set( 'venue', $venue );
|
|
||||||
$event->set( 'address', $address );
|
|
||||||
$event->set( 'city', $city );
|
|
||||||
$event->set( 'province', $province );
|
|
||||||
$event->set( 'postal_code', $postal_code );
|
|
||||||
$event->set( 'country', $country );
|
|
||||||
$event->set( 'show_map', $google_map );
|
|
||||||
$event->set( 'cost', $cost );
|
|
||||||
$event->set( 'is_free', $is_free );
|
|
||||||
$event->set( 'ticket_url', $ticket_url );
|
|
||||||
$event->set( 'contact_name', $contact_name );
|
|
||||||
$event->set( 'contact_phone', $contact_phone );
|
|
||||||
$event->set( 'contact_email', $contact_email );
|
|
||||||
$event->set( 'contact_url', $contact_url );
|
|
||||||
$event->set( 'recurrence_rules', $rrule );
|
|
||||||
$event->set( 'exception_rules', $exrule );
|
|
||||||
$event->set( 'exception_dates', $exdate );
|
|
||||||
$event->set( 'recurrence_dates', $rdate );
|
|
||||||
$event->set( 'show_coordinates', $show_coordinates );
|
|
||||||
$event->set( 'longitude', trim( $longitude ) );
|
|
||||||
$event->set( 'latitude', trim( $latitude ) );
|
|
||||||
$event->set( 'ical_uid', $event->get_uid() );
|
|
||||||
|
|
||||||
return array(
|
|
||||||
'event' => $event,
|
|
||||||
'is_new' => $is_new
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves meta post data.
|
|
||||||
*
|
|
||||||
* @wp_hook save_post
|
|
||||||
*
|
|
||||||
* @param int $post_id Post ID.
|
|
||||||
* @param object $post Post object.
|
|
||||||
* @param update
|
|
||||||
*
|
|
||||||
* @return object|null Saved Ai1ec_Event object if successful or null.
|
|
||||||
*/
|
|
||||||
public function save_post( $post_id, $post, $update ) {
|
|
||||||
|
|
||||||
if ( false === $this->is_valid_event( $post ) ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LABEL:magicquotes
|
|
||||||
// remove WordPress `magical` slashes - we work around it ourselves
|
|
||||||
$_POST = stripslashes_deep( $_POST );
|
|
||||||
|
|
||||||
$data = $this->_parse_post_to_event( $post_id );
|
|
||||||
if ( ! $data ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
$event = $data['event'];
|
|
||||||
$is_new = $data['is_new'];
|
|
||||||
|
|
||||||
$banner_image = isset( $_POST['ai1ec_banner_image'] ) ? sanitize_text_field( $_POST['ai1ec_banner_image'] ) : '';
|
|
||||||
$cost_type = isset( $_POST['ai1ec_cost_type'] ) ? sanitize_text_field( $_POST['ai1ec_cost_type'] ) : '';
|
|
||||||
|
|
||||||
update_post_meta( $post_id, 'ai1ec_banner_image', $banner_image );
|
|
||||||
if ( $cost_type ) {
|
|
||||||
update_post_meta( $post_id, '_ai1ec_cost_type', $cost_type );
|
|
||||||
}
|
|
||||||
$api = $this->_registry->get( 'model.api.api-ticketing' );
|
|
||||||
if ( $update === false ) {
|
|
||||||
//this method just creates the API event, the update action
|
|
||||||
//is treated by another hook (pre_update_event inside api )
|
|
||||||
if ( 'tickets' === $cost_type ) {
|
|
||||||
$result = $api->store_event( $event, $post, false );
|
|
||||||
if ( true !== $result ) {
|
|
||||||
$_POST['_ticket_store_event_error'] = $result;
|
|
||||||
} else {
|
|
||||||
update_post_meta(
|
|
||||||
$post_id,
|
|
||||||
'_ai1ec_timely_tickets_url',
|
|
||||||
$api->get_api_event_buy_ticket_url( $event->get( 'post_id' ) )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( 'tickets' === $cost_type ) {
|
|
||||||
update_post_meta(
|
|
||||||
$post_id,
|
|
||||||
'_ai1ec_timely_tickets_url',
|
|
||||||
$api->get_api_event_buy_ticket_url( $event->get( 'post_id' ) )
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
delete_post_meta(
|
|
||||||
$post_id,
|
|
||||||
'_ai1ec_timely_tickets_url'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// let other extensions save their fields.
|
|
||||||
do_action( 'ai1ec_save_post', $event );
|
|
||||||
|
|
||||||
$event->save( ! $is_new );
|
|
||||||
|
|
||||||
// LABEL:magicquotes
|
|
||||||
// restore `magic` WordPress quotes to maintain compatibility
|
|
||||||
$_POST = add_magic_quotes( $_POST );
|
|
||||||
|
|
||||||
$api = $this->_registry->get( 'model.api.api-registration' );
|
|
||||||
$api->check_settings();
|
|
||||||
|
|
||||||
return $event;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function get_sendback_page( $post_id ) {
|
|
||||||
$sendback = wp_get_referer();
|
|
||||||
$page_base = Ai1ec_Wp_Uri_Helper::get_pagebase( $sendback ); //$_SERVER['REQUEST_URI'] );
|
|
||||||
if ( 'post.php' === $page_base ) {
|
|
||||||
return get_edit_post_link( $post_id, 'url' );
|
|
||||||
} else {
|
|
||||||
return admin_url( 'edit.php?post_type=ai1ec_event' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PRE (ticket event) update.
|
|
||||||
* Just handle the Ticket Events, other kind of post are ignored
|
|
||||||
* @wp_hook pre_post_update
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function pre_post_update ( $post_id, $new_post_data ) {
|
|
||||||
|
|
||||||
// LABEL:magicquotes
|
|
||||||
// remove WordPress `magical` slashes - we work around it ourselves
|
|
||||||
$_POST = stripslashes_deep( $_POST );
|
|
||||||
|
|
||||||
$api = $this->_registry->get( 'model.api.api-ticketing' );
|
|
||||||
$action = $this->current_action();
|
|
||||||
switch( $action ) {
|
|
||||||
case 'inline-save': //quick edit from edit page
|
|
||||||
$fields = array();
|
|
||||||
if ( false === ai1ec_is_blank( $_REQUEST['post_title'] ) ) {
|
|
||||||
$fields['title'] = sanitize_text_field( $_REQUEST['post_title'] );
|
|
||||||
}
|
|
||||||
if ( false === ai1ec_is_blank( $_REQUEST['_status'] ) ) {
|
|
||||||
$fields['status'] = $_REQUEST['_status'];
|
|
||||||
}
|
|
||||||
if ( isset( $_REQUEST['keep_private'] ) && 'private' === $_REQUEST['keep_private'] ) {
|
|
||||||
$fields['visibility'] = 'private';
|
|
||||||
} else if ( isset( $_REQUEST['post_password'] ) && false === ai1ec_is_blank( $_REQUEST['post_password'] ) ) {
|
|
||||||
$fields['visibility'] = 'password';
|
|
||||||
}
|
|
||||||
if ( 0 < count( $fields ) ) {
|
|
||||||
$post = get_post( $post_id );
|
|
||||||
$ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;
|
|
||||||
$message = $api->update_api_event_fields( $post, $fields, 'update', $ajax );
|
|
||||||
if ( null !== $message ) {
|
|
||||||
if ( $ajax ) {
|
|
||||||
wp_die( $message );
|
|
||||||
} else {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case 'edit': //bulk edition from edit page
|
|
||||||
$fields = array();
|
|
||||||
if ( false === ai1ec_is_blank( $_REQUEST['_status'] ) ) {
|
|
||||||
$fields['status'] = $_REQUEST['_status'];
|
|
||||||
}
|
|
||||||
if ( 0 < count( $fields ) ) {
|
|
||||||
$post = get_post( $post_id );
|
|
||||||
$ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;
|
|
||||||
$message = $api->update_api_event_fields( $post, $fields, 'update', $ajax );
|
|
||||||
if ( null !== $message ) {
|
|
||||||
if ( $ajax ) {
|
|
||||||
wp_die( $message );
|
|
||||||
} else {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case 'editpost': //edition from post page
|
|
||||||
$new_post_data['ID'] = $post_id;
|
|
||||||
$post = new WP_Post( (object) $new_post_data );
|
|
||||||
if ( false === $this->is_valid_event( $post ) ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$data = $this->_parse_post_to_event( $post_id );
|
|
||||||
if ( ! $data ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$event = $data['event'];
|
|
||||||
$cost_type = isset( $_REQUEST['ai1ec_cost_type'] ) ? $_REQUEST['ai1ec_cost_type'] : '';
|
|
||||||
if ( 'tickets' === $cost_type ) {
|
|
||||||
$result = $api->store_event( $event, $post, true );
|
|
||||||
if ( true !== $result ) {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$message = $api->delete_api_event( $post_id, 'update', false );
|
|
||||||
if ( null !== $message ) {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LABEL:magicquotes
|
|
||||||
// restore `magic` WordPress quotes to maintain compatibility
|
|
||||||
$_POST = add_magic_quotes( $_POST );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function current_action() {
|
|
||||||
$action = '';
|
|
||||||
if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) {
|
|
||||||
$action = 'delete';
|
|
||||||
} else {
|
|
||||||
if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] ) {
|
|
||||||
$action = $_REQUEST['action'];
|
|
||||||
}
|
|
||||||
if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] ) {
|
|
||||||
$action = $_REQUEST['action2'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $action;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* _create_duplicate_post method
|
|
||||||
*
|
|
||||||
* Create copy of event by calling {@uses wp_insert_post} function.
|
|
||||||
* Using 'post_parent' to add hierarchy.
|
|
||||||
*
|
|
||||||
* @param array $data Event instance data to copy
|
|
||||||
*
|
|
||||||
* @return int|bool New post ID or false on failure
|
|
||||||
**/
|
|
||||||
public function create_duplicate_post() {
|
|
||||||
if ( ! isset( $_POST['post_ID'] ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$clean_fields = array(
|
|
||||||
'ai1ec_repeat' => NULL,
|
|
||||||
'ai1ec_rrule' => '',
|
|
||||||
'ai1ec_exrule' => '',
|
|
||||||
'ai1ec_exdate' => '',
|
|
||||||
'post_ID' => NULL,
|
|
||||||
'post_name' => NULL,
|
|
||||||
'ai1ec_instance_id' => NULL,
|
|
||||||
);
|
|
||||||
$old_post_id = $_POST['post_ID'];
|
|
||||||
$instance_id = $_POST['ai1ec_instance_id'];
|
|
||||||
foreach ( $clean_fields as $field => $to_value ) {
|
|
||||||
if ( NULL === $to_value ) {
|
|
||||||
unset( $_POST[$field] );
|
|
||||||
} else {
|
|
||||||
$_POST[$field] = $to_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$_POST = _wp_translate_postdata( false, $_POST );
|
|
||||||
$_POST['post_parent'] = $old_post_id;
|
|
||||||
if ( isset( $_POST['post_title'] ) ) {
|
|
||||||
$_POST['post_title'] = sanitize_text_field( $_POST['post_title'] );
|
|
||||||
}
|
|
||||||
$post_id = wp_insert_post( $_POST );
|
|
||||||
$this->_registry->get( 'model.event.parent' )->event_parent(
|
|
||||||
$post_id,
|
|
||||||
$old_post_id,
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
return $post_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cleans calendar shortcodes from event content.
|
|
||||||
*
|
|
||||||
* @param array $data An array of slashed post data.
|
|
||||||
* @param array $postarr An array of sanitized, but otherwise unmodified post data.
|
|
||||||
*
|
|
||||||
* @return array An array of slashed post data.
|
|
||||||
*/
|
|
||||||
public function wp_insert_post_data( $data ) {
|
|
||||||
global $shortcode_tags;
|
|
||||||
if (
|
|
||||||
! isset( $data['post_type'] ) ||
|
|
||||||
! isset( $data['post_content'] ) ||
|
|
||||||
AI1EC_POST_TYPE !== $data['post_type'] ||
|
|
||||||
empty( $shortcode_tags ) ||
|
|
||||||
! is_array( $shortcode_tags ) ||
|
|
||||||
false === strpos( $data['post_content'], '[' )
|
|
||||||
) {
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
$pattern = get_shortcode_regex();
|
|
||||||
$data['post_content'] = preg_replace_callback(
|
|
||||||
"/$pattern/s",
|
|
||||||
array( $this, 'strip_shortcode_tag' ),
|
|
||||||
$data['post_content']
|
|
||||||
);
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reutrns shortcode or stripped content for given shortcode.
|
|
||||||
* Currently regex callback function passes as $tag argument 7-element long
|
|
||||||
* array.
|
|
||||||
* First element ($tag[0]) is not modified full shortcode text.
|
|
||||||
* Third element ($tag[2]) is pure shortcode identifier.
|
|
||||||
* Sixth element ($tag[5]) contains shortcode content if any
|
|
||||||
* [ai1ec_test]content[/ai1ec].
|
|
||||||
*
|
|
||||||
* @param array $tag Incoming data.
|
|
||||||
*
|
|
||||||
* @return string Shortcode replace tag.
|
|
||||||
*/
|
|
||||||
public function strip_shortcode_tag( $tag ) {
|
|
||||||
if (
|
|
||||||
count( $tag ) < 7 ||
|
|
||||||
'ai1ec' !== substr( $tag[2], 0, 5 ) ||
|
|
||||||
! apply_filters( 'ai1ec_content_remove_shortcode_' . $tag[2], false )
|
|
||||||
) {
|
|
||||||
return $tag[0];
|
|
||||||
}
|
|
||||||
return $tag[5];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _remap_recurrence_dates() {
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_exclude'] ) &&
|
|
||||||
'EXDATE' === substr( $_POST['ai1ec_exrule'], 0, 6 )
|
|
||||||
) {
|
|
||||||
$_POST['ai1ec_exdate'] = substr( $_POST['ai1ec_exrule'], 7 );
|
|
||||||
unset( $_POST['ai1ec_exclude'], $_POST['ai1ec_exrule'] );
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_repeat'] ) &&
|
|
||||||
'RDATE' === substr( $_POST['ai1ec_rrule'], 0, 5 )
|
|
||||||
) {
|
|
||||||
$_POST['ai1ec_rdate'] = substr( $_POST['ai1ec_rrule'], 6 );
|
|
||||||
unset( $_POST['ai1ec_repeat'], $_POST['ai1ec_rrule'] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,371 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event internal structure representation. Plain value object.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @instantiator new
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Entity extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get list of object properties.
|
|
||||||
*
|
|
||||||
* Special value `registry` ({@see Ai1ec_Registry_Object}) is excluded.
|
|
||||||
*
|
|
||||||
* @return array List of accessible properties.
|
|
||||||
*
|
|
||||||
* @staticvar array $known List of properties.
|
|
||||||
*/
|
|
||||||
public function list_properties() {
|
|
||||||
static $known = null;
|
|
||||||
if ( null === $known ) {
|
|
||||||
$known = array();
|
|
||||||
foreach ( $this as $name => $value ) {
|
|
||||||
$name = substr( $name, 1 );
|
|
||||||
if ( 'registry' === $name ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$known[] = $name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $known;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle cloning properly to resist property changes.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __clone() {
|
|
||||||
$this->_start = $this->_registry->get( 'date.time', $this->_start );
|
|
||||||
$this->_end = $this->_registry->get( 'date.time', $this->_end );
|
|
||||||
$this->_post = clone $this->_post;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Change stored property.
|
|
||||||
*
|
|
||||||
* @param string $name Name of property to change.
|
|
||||||
* @param mixed $value Arbitrary value to use.
|
|
||||||
*
|
|
||||||
* @return Ai1ec_Event_Entity Instance of self for chaining.
|
|
||||||
*
|
|
||||||
* @staticvar array $time_fields Map of fields holding a value of
|
|
||||||
* {@see Ai1ec_Date_Time}, which
|
|
||||||
* require modification instead of
|
|
||||||
* replacement.
|
|
||||||
*/
|
|
||||||
public function set( $name, $value ) {
|
|
||||||
static $time_fields = array(
|
|
||||||
'start' => true,
|
|
||||||
'end' => true,
|
|
||||||
);
|
|
||||||
if ( 'registry' === $name ) {
|
|
||||||
return $this; // short-circuit: protection mean.
|
|
||||||
}
|
|
||||||
if ( 'timezone_name' === $name && empty( $value ) ) {
|
|
||||||
return $this; // protection against invalid TZ values.
|
|
||||||
}
|
|
||||||
$field = '_' . $name;
|
|
||||||
if ( isset( $time_fields[$name] ) ) {
|
|
||||||
// object of Ai1ec_Date_Time type is now handled in it itself
|
|
||||||
$this->{$field}->set_date_time(
|
|
||||||
$value,
|
|
||||||
( null === $this->_timezone_name )
|
|
||||||
? 'UTC'
|
|
||||||
: $this->_timezone_name
|
|
||||||
);
|
|
||||||
$this->adjust_preferred_timezone();
|
|
||||||
} else {
|
|
||||||
$this->{$field} = $value;
|
|
||||||
}
|
|
||||||
if ( 'timezone_name' === $name ) {
|
|
||||||
$this->_start->set_timezone( $value );
|
|
||||||
$this->_end ->set_timezone( $value );
|
|
||||||
$this->adjust_preferred_timezone();
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Optionally adjust preferred (display) timezone.
|
|
||||||
*
|
|
||||||
* @return bool|DateTimeZone False or new timezone.
|
|
||||||
*
|
|
||||||
* @staticvar bool $do_adjust True when adjustment should be performed.
|
|
||||||
*/
|
|
||||||
public function adjust_preferred_timezone() {
|
|
||||||
static $do_adjust = null;
|
|
||||||
if ( null === $do_adjust ) {
|
|
||||||
$do_adjust = !$this->_registry
|
|
||||||
->get( 'model.settings' )
|
|
||||||
->get( 'always_use_calendar_timezone', false );
|
|
||||||
}
|
|
||||||
if ( ! $do_adjust ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$timezone = $this->_registry->get( 'date.timezone' )->get(
|
|
||||||
$this->_timezone_name
|
|
||||||
);
|
|
||||||
$this->set_preferred_timezone( $timezone );
|
|
||||||
return $timezone;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set preferred timezone to datetime fields.
|
|
||||||
*
|
|
||||||
* @param DateTimeZone $timezone Preferred timezone instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function set_preferred_timezone( DateTimeZone $timezone ) {
|
|
||||||
$this->_start->set_preferred_timezone( $timezone );
|
|
||||||
$this->_end ->set_preferred_timezone( $timezone );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a value of some property.
|
|
||||||
*
|
|
||||||
* @param string $name Name of property to get.
|
|
||||||
* @param mixed $default Value to return if property is not defined.
|
|
||||||
*
|
|
||||||
* @return mixed Found value or $default.
|
|
||||||
*/
|
|
||||||
public function get( $name, $default = null ) {
|
|
||||||
if ( ! isset( $this->{ '_' . $name } ) ) {
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
return $this->{ '_' . $name };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize values to some sane defaults.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Injected registry.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct( Ai1ec_Registry_Object $registry ) {
|
|
||||||
parent::__construct( $registry );
|
|
||||||
$this->_start = $this->_registry->get( 'date.time' );
|
|
||||||
$this->_end = $this->_registry->get( 'date.time', '+1 hour' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var object Instance of WP_Post object.
|
|
||||||
*/
|
|
||||||
private $_post;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int Post ID.
|
|
||||||
*/
|
|
||||||
private $_post_id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int|null Uniquely identifies the recurrence instance of this event
|
|
||||||
* object. Value may be null.
|
|
||||||
*/
|
|
||||||
private $_instance_id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Name of timezone to use for event times.
|
|
||||||
*/
|
|
||||||
private $_timezone_name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Date_Time Start date-time specifier
|
|
||||||
*/
|
|
||||||
private $_start;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Date_Time End date-time specifier
|
|
||||||
*/
|
|
||||||
private $_end;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool Whether this copy of the event was broken up for rendering and
|
|
||||||
* the start time is not its "real" start time.
|
|
||||||
*/
|
|
||||||
private $_start_truncated;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool Whether this copy of the event was broken up for rendering and
|
|
||||||
* the end time is not its "real" end time.
|
|
||||||
*/
|
|
||||||
private $_end_truncated;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int If event is all-day long
|
|
||||||
*/
|
|
||||||
private $_allday;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int If event has no duration
|
|
||||||
*/
|
|
||||||
private $_instant_event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ==========================
|
|
||||||
* = Recurrence information =
|
|
||||||
* ==========================
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Recurrence rules
|
|
||||||
*/
|
|
||||||
private $_recurrence_rules;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Exception rules
|
|
||||||
*/
|
|
||||||
private $_exception_rules;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Recurrence dates
|
|
||||||
*/
|
|
||||||
private $_recurrence_dates;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Exception dates
|
|
||||||
*/
|
|
||||||
private $_exception_dates;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Venue name - free text
|
|
||||||
*/
|
|
||||||
private $_venue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Country name - free text
|
|
||||||
*/
|
|
||||||
private $_country;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Address information - free text
|
|
||||||
*/
|
|
||||||
private $_address;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string City name - free text
|
|
||||||
*/
|
|
||||||
private $_city;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Province free text definition
|
|
||||||
*/
|
|
||||||
private $_province;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int Postal code
|
|
||||||
*/
|
|
||||||
private $_postal_code;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int Set to true to display map
|
|
||||||
*/
|
|
||||||
private $_show_map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int Set to true to show coordinates in description
|
|
||||||
*/
|
|
||||||
private $_show_coordinates;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var float GEO information - longitude
|
|
||||||
*/
|
|
||||||
private $_longitude;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var float GEO information - latitude
|
|
||||||
*/
|
|
||||||
private $_latitude;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Event contact information - contact person
|
|
||||||
*/
|
|
||||||
private $_contact_name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Event contact information - phone number
|
|
||||||
*/
|
|
||||||
private $_contact_phone;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Event contact information - email address
|
|
||||||
*/
|
|
||||||
private $_contact_email;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Event contact information - external URL.
|
|
||||||
*/
|
|
||||||
private $_contact_url;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Defines event cost.
|
|
||||||
*/
|
|
||||||
private $_cost;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool Indicates, whereas event is free.
|
|
||||||
*/
|
|
||||||
private $_is_free;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Link to buy tickets
|
|
||||||
*/
|
|
||||||
private $_ticket_url;
|
|
||||||
|
|
||||||
// ====================================
|
|
||||||
// = iCalendar feed (.ics) properties =
|
|
||||||
// ====================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string URI of source ICAL feed.
|
|
||||||
*/
|
|
||||||
private $_ical_feed_url;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string|null URI of source ICAL entity.
|
|
||||||
*/
|
|
||||||
private $_ical_source_url;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Organiser details
|
|
||||||
*/
|
|
||||||
private $_ical_organizer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Contact details
|
|
||||||
*/
|
|
||||||
private $_ical_contact;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string|int UID of ICAL feed
|
|
||||||
*/
|
|
||||||
private $_ical_uid;
|
|
||||||
|
|
||||||
// ===============================
|
|
||||||
// = taxonomy-related properties =
|
|
||||||
// ===============================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Associated event tag names (*not* IDs), joined by commas.
|
|
||||||
*/
|
|
||||||
private $_tags;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Associated event category IDs, joined by commas.
|
|
||||||
*/
|
|
||||||
private $_categories;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Associated event feed object
|
|
||||||
*/
|
|
||||||
private $_feed;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates a failure that happens during event save operation.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.1
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Create_Exception extends Exception {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,440 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Kigkonsult\Icalcreator\Util\UtilRecur;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event instance management model.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Instance extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Dbi Instance of database abstraction.
|
|
||||||
*/
|
|
||||||
protected $_dbi = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DBI utils.
|
|
||||||
*
|
|
||||||
* @var Ai1ec_Dbi_Utils
|
|
||||||
*/
|
|
||||||
protected $_dbi_utils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store locally instance of Ai1ec_Dbi.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Injected object registry.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function __construct( Ai1ec_Registry_Object $registry ) {
|
|
||||||
parent::__construct( $registry );
|
|
||||||
$this->_dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
$this->_dbi_utils = $this->_registry->get( 'dbi.dbi-utils' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove entries for given post. Optionally delete particular instance.
|
|
||||||
*
|
|
||||||
* @param int $post_id Event ID to remove instances for.
|
|
||||||
* @param int|null $instance_id Instance ID, or null for all.
|
|
||||||
*
|
|
||||||
* @return int|bool Number of entries removed, or false on failure.
|
|
||||||
*/
|
|
||||||
public function clean( $post_id, $instance_id = null ) {
|
|
||||||
$where = array( 'post_id' => $post_id );
|
|
||||||
$format = array( '%d' );
|
|
||||||
if ( null !== $instance_id ) {
|
|
||||||
$where['id'] = $instance_id;
|
|
||||||
$format[] = '%d';
|
|
||||||
}
|
|
||||||
return $this->_dbi->delete( 'ai1ec_event_instances', $where, $format );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove and then create instance entries for given event.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event $event Instance of event to recreate entries for.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function recreate( Ai1ec_Event $event ) {
|
|
||||||
$old_instances = $this->_load_instances( $event->get( 'post_id' ) );
|
|
||||||
$instances = $this->_create_instances_collection( $event );
|
|
||||||
$insert = array();
|
|
||||||
foreach ( $instances as $instance ) {
|
|
||||||
if ( ! isset( $old_instances[$instance['start'] . ':' . $instance['end']] ) ) {
|
|
||||||
$insert[] = $instance;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
unset( $old_instances[$instance['start'] . ':' . $instance['end']] );
|
|
||||||
}
|
|
||||||
$this->_remove_instances_by_ids( array_values( $old_instances ) );
|
|
||||||
$this->_add_instances( $insert );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create list of recurrent instances.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event $event Event to generate instances for.
|
|
||||||
* @param array $event_instance First instance contents.
|
|
||||||
* @param int $_start Timestamp of first occurence.
|
|
||||||
* @param int $duration Event duration in seconds.
|
|
||||||
* @param string $timezone Target timezone.
|
|
||||||
*
|
|
||||||
* @return array List of event instances.
|
|
||||||
*/
|
|
||||||
public function create_instances_by_recurrence(
|
|
||||||
Ai1ec_Event $event,
|
|
||||||
array $event_instance,
|
|
||||||
$_start,
|
|
||||||
$duration,
|
|
||||||
$timezone
|
|
||||||
) {
|
|
||||||
$restore_timezone = date_default_timezone_get();
|
|
||||||
$recurrence_parser = $this->_registry->get( 'recurrence.rule' );
|
|
||||||
$events = array();
|
|
||||||
|
|
||||||
$start = $event_instance['start'];
|
|
||||||
$wdate = $startdate = $enddate
|
|
||||||
= $this->_parsed_date_array( $_start, $timezone );
|
|
||||||
$enddate['year'] = $enddate['year'] + 10;
|
|
||||||
$exclude_dates = array();
|
|
||||||
$exception_rules = $event->get( 'exception_dates' );
|
|
||||||
$recurrence_dates = array();
|
|
||||||
$recurrence_rules = $event->get( 'recurrence_dates' );
|
|
||||||
if ( $recurrence_rules ) {
|
|
||||||
$recurrence_dates = $this->_populate_recurring_dates(
|
|
||||||
$recurrence_rules,
|
|
||||||
$startdate,
|
|
||||||
$timezone
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ( $exception_rules ) {
|
|
||||||
$exclude_dates = $this->_populate_recurring_dates(
|
|
||||||
$exception_rules,
|
|
||||||
$startdate,
|
|
||||||
$timezone
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if ( $event->get( 'exception_rules' ) ) {
|
|
||||||
// creat an array for the rules
|
|
||||||
$exception_rules = $recurrence_parser
|
|
||||||
->build_recurrence_rules_array(
|
|
||||||
$event->get( 'exception_rules' )
|
|
||||||
);
|
|
||||||
unset($exception_rules['EXDATE']);
|
|
||||||
if ( ! empty( $exception_rules ) ) {
|
|
||||||
$exception_rules = UtilRecur::setRexrule(
|
|
||||||
$exception_rules
|
|
||||||
);
|
|
||||||
$result = array();
|
|
||||||
date_default_timezone_set( $timezone );
|
|
||||||
// The first array is the result and it is passed by reference
|
|
||||||
UtilRecur::recur2date(
|
|
||||||
$exclude_dates,
|
|
||||||
$exception_rules,
|
|
||||||
$wdate,
|
|
||||||
$startdate,
|
|
||||||
$enddate
|
|
||||||
);
|
|
||||||
// Get start date time
|
|
||||||
$startHour = isset( $startdate['hour'] ) ? sprintf( "%02d", $startdate['hour'] ) : '00';
|
|
||||||
$startMinute = isset( $startdate['min'] ) ? sprintf( "%02d", $startdate['min'] ) : '00';
|
|
||||||
$startSecond = isset( $startdate['sec'] ) ? sprintf( "%02d", $startdate['sec'] ) : '00';
|
|
||||||
$startTime = $startHour . $startMinute . $startSecond;
|
|
||||||
// Convert to timestamp
|
|
||||||
if ( is_array( $exclude_dates ) ) {
|
|
||||||
$new_exclude_dates = array();
|
|
||||||
foreach ( $exclude_dates as $key => $value ) {
|
|
||||||
$timestamp = strtotime( $key . 'T' . $startTime );
|
|
||||||
$new_exclude_dates[$timestamp] = $value;
|
|
||||||
}
|
|
||||||
$exclude_dates = $new_exclude_dates;
|
|
||||||
}
|
|
||||||
date_default_timezone_set( $restore_timezone );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$recurrence_rules = $recurrence_parser
|
|
||||||
->build_recurrence_rules_array(
|
|
||||||
$event->get( 'recurrence_rules' )
|
|
||||||
);
|
|
||||||
|
|
||||||
$recurrence_rules = UtilRecur::setRexrule( $recurrence_rules );
|
|
||||||
if ( $recurrence_rules ) {
|
|
||||||
date_default_timezone_set( $timezone );
|
|
||||||
UtilRecur::recur2date(
|
|
||||||
$recurrence_dates,
|
|
||||||
$recurrence_rules,
|
|
||||||
$wdate,
|
|
||||||
$startdate,
|
|
||||||
$enddate
|
|
||||||
);
|
|
||||||
|
|
||||||
// Get start date time
|
|
||||||
$startHour = isset( $startdate['hour'] ) ? sprintf( "%02d", $startdate['hour'] ) : '00';
|
|
||||||
$startMinute = isset( $startdate['min'] ) ? sprintf( "%02d", $startdate['min'] ) : '00';
|
|
||||||
$startSecond = isset( $startdate['sec'] ) ? sprintf( "%02d", $startdate['sec'] ) : '00';
|
|
||||||
$startTime = $startHour . $startMinute . $startSecond;
|
|
||||||
// Convert to timestamp
|
|
||||||
if ( is_array( $recurrence_dates ) ) {
|
|
||||||
$new_recurrence_dates = array();
|
|
||||||
foreach ( $recurrence_dates as $key => $value ) {
|
|
||||||
$timestamp = strtotime( $key . 'T' . $startTime );
|
|
||||||
$new_recurrence_dates[$timestamp] = $value;
|
|
||||||
}
|
|
||||||
$recurrence_dates = $new_recurrence_dates;
|
|
||||||
}
|
|
||||||
date_default_timezone_set( $restore_timezone );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! is_array( $recurrence_dates ) ) {
|
|
||||||
$recurrence_dates = array();
|
|
||||||
}
|
|
||||||
$recurrence_dates = array_keys( $recurrence_dates );
|
|
||||||
// Add the instances
|
|
||||||
foreach ( $recurrence_dates as $timestamp ) {
|
|
||||||
// The arrays are in the form timestamp => true so an isset call is what we need
|
|
||||||
if ( ! isset( $exclude_dates[$timestamp] ) ) {
|
|
||||||
$event_instance['start'] = $timestamp;
|
|
||||||
$event_instance['end'] = $timestamp + $duration;
|
|
||||||
$events[$timestamp] = $event_instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $events;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate and store instance entries in database for given event.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event $event Instance of event to create entries for.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function create( Ai1ec_Event $event ) {
|
|
||||||
$instances = $this->_create_instances_collection( $event );
|
|
||||||
$this->_add_instances( $instances );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if given date match dates in EXDATES rule.
|
|
||||||
*
|
|
||||||
* @param string $date Date to check.
|
|
||||||
* @param string $ics_rule ICS EXDATES rule.
|
|
||||||
* @param string $timezone Timezone to evaluate value in.
|
|
||||||
*
|
|
||||||
* @return bool True if given date is in rule.
|
|
||||||
*/
|
|
||||||
public function date_match_exdates( $date, $ics_rule, $timezone ) {
|
|
||||||
$ranges = $this->_get_date_ranges( $ics_rule, $timezone );
|
|
||||||
foreach ( $ranges as $interval ) {
|
|
||||||
if ( $date >= $interval[0] && $date <= $interval[1] ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ( $date <= $interval[0] ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare date range list for fast exdate search.
|
|
||||||
*
|
|
||||||
* NOTICE: timezone is relevant in only first run.
|
|
||||||
*
|
|
||||||
* @param string $date_list ICS list provided from data model.
|
|
||||||
* @param string $timezone Timezone in which to evaluate.
|
|
||||||
*
|
|
||||||
* @return array List of date ranges, sorted in increasing order.
|
|
||||||
*/
|
|
||||||
protected function _get_date_ranges( $date_list, $timezone ) {
|
|
||||||
static $ranges = array();
|
|
||||||
if ( ! isset( $ranges[$date_list] ) ) {
|
|
||||||
$ranges[$date_list] = array();
|
|
||||||
$exploded = explode( ',', $date_list );
|
|
||||||
sort( $exploded );
|
|
||||||
foreach ( $exploded as $date ) {
|
|
||||||
// COMMENT on `rtrim( $date, 'Z' )`:
|
|
||||||
// user selects exclusion date in event timezone thus it
|
|
||||||
// must be parsed as such as opposed to UTC which happen
|
|
||||||
// when 'Z' is preserved.
|
|
||||||
$date = $this->_registry
|
|
||||||
->get( 'date.time', rtrim( $date, 'Z' ), $timezone )
|
|
||||||
->format_to_gmt();
|
|
||||||
$ranges[$date_list][] = array(
|
|
||||||
$date,
|
|
||||||
$date + (24 * 60 * 60) - 1
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $ranges[$date_list];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _populate_recurring_dates( $rule, array $start_struct, $timezone ) {
|
|
||||||
$start = clone $start_struct['_dt'];
|
|
||||||
$dates = array();
|
|
||||||
foreach ( explode( ',', $rule ) as $date ) {
|
|
||||||
$i_date = clone $start;
|
|
||||||
$spec = sscanf( $date, '%04d%02d%02d' );
|
|
||||||
$i_date->set_date(
|
|
||||||
$spec[0],
|
|
||||||
$spec[1],
|
|
||||||
$spec[2]
|
|
||||||
);
|
|
||||||
$dates[$i_date->format_to_gmt()] = $i_date;
|
|
||||||
}
|
|
||||||
return $dates;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _parsed_date_array( $startdate, $timezone ) {
|
|
||||||
$datetime = $this->_registry->get( 'date.time', $startdate, $timezone );
|
|
||||||
$parsed = array(
|
|
||||||
'year' => intval( $datetime->format( 'Y' ) ),
|
|
||||||
'month' => intval( $datetime->format( 'm' ) ),
|
|
||||||
'day' => intval( $datetime->format( 'd' ) ),
|
|
||||||
'hour' => intval( $datetime->format( 'H' ) ),
|
|
||||||
'min' => intval( $datetime->format( 'i' ) ),
|
|
||||||
'sec' => intval( $datetime->format( 's' ) ),
|
|
||||||
'tz' => $datetime->get_timezone(),
|
|
||||||
'_dt' => $datetime,
|
|
||||||
);
|
|
||||||
return $parsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns current instances map.
|
|
||||||
*
|
|
||||||
* @param int post_id Post ID.
|
|
||||||
*
|
|
||||||
* @return array Array of data.
|
|
||||||
*/
|
|
||||||
protected function _load_instances( $post_id ) {
|
|
||||||
$query = $this->_dbi->prepare(
|
|
||||||
'SELECT `id`, `start`, `end` FROM ' .
|
|
||||||
$this->_dbi->get_table_name( 'ai1ec_event_instances' ) .
|
|
||||||
' WHERE post_id = %d',
|
|
||||||
$post_id
|
|
||||||
);
|
|
||||||
$results = $this->_dbi->get_results( $query );
|
|
||||||
$instances = array();
|
|
||||||
foreach ( $results as $result ) {
|
|
||||||
$instances[(int)$result->start . ':' . (int)$result->end] = (int)$result->id;
|
|
||||||
}
|
|
||||||
return $instances;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate and store instance entries in database for given event.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event $event Instance of event to create entries for.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
protected function _create_instances_collection( Ai1ec_Event $event ) {
|
|
||||||
$events = array();
|
|
||||||
$event_item = array(
|
|
||||||
'post_id' => $event->get( 'post_id' ),
|
|
||||||
'start' => $event->get( 'start' )->format_to_gmt(),
|
|
||||||
'end' => $event->get( 'end' )->format_to_gmt(),
|
|
||||||
);
|
|
||||||
$duration = $event->get( 'end' )->diff_sec( $event->get( 'start' ) );
|
|
||||||
|
|
||||||
$_start = $event->get( 'start' )->format_to_gmt();
|
|
||||||
$_end = $event->get( 'end' )->format_to_gmt();
|
|
||||||
|
|
||||||
// Always cache initial instance
|
|
||||||
$events[$_start] = $event_item;
|
|
||||||
|
|
||||||
if ( $event->get( 'recurrence_rules' ) || $event->get( 'recurrence_dates' ) ) {
|
|
||||||
$start_timezone = $this->_registry->get( 'model.option' )
|
|
||||||
->get( 'timezone_string' );
|
|
||||||
if ( empty( $start_timezone ) ) {
|
|
||||||
$start_timezone = $this->_registry->get( 'date.timezone' )->get_default_timezone();
|
|
||||||
}
|
|
||||||
|
|
||||||
$events += $this->create_instances_by_recurrence(
|
|
||||||
$event,
|
|
||||||
$event_item,
|
|
||||||
$_start,
|
|
||||||
$duration,
|
|
||||||
$start_timezone
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$search_helper = $this->_registry->get( 'model.search' );
|
|
||||||
foreach ( $events as &$event_item ) {
|
|
||||||
// Find out if this event instance is already accounted for by an
|
|
||||||
// overriding 'RECURRENCE-ID' of the same iCalendar feed (by comparing the
|
|
||||||
// UID, start date, recurrence). If so, then do not create duplicate
|
|
||||||
// instance of event.
|
|
||||||
$start = $event_item['start'];
|
|
||||||
$matching_event_id = null;
|
|
||||||
if ( $event->get( 'ical_uid' ) ) {
|
|
||||||
$matching_event_id = $search_helper->get_matching_event_id(
|
|
||||||
$event->get( 'ical_uid' ),
|
|
||||||
$event->get( 'ical_feed_url' ),
|
|
||||||
$event->get( 'start' ),
|
|
||||||
false,
|
|
||||||
$event->get( 'post_id' )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no other instance was found
|
|
||||||
if ( null !== $matching_event_id ) {
|
|
||||||
$event_item = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return array_filter( $events );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes ai1ec_event_instances entries using their IDS.
|
|
||||||
*
|
|
||||||
* @param array $ids Collection of IDS.
|
|
||||||
*
|
|
||||||
* @return bool Result.
|
|
||||||
*/
|
|
||||||
protected function _remove_instances_by_ids( array $ids ) {
|
|
||||||
if ( empty( $ids ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$query = 'DELETE FROM ' . $this->_dbi->get_table_name(
|
|
||||||
'ai1ec_event_instances'
|
|
||||||
) . ' WHERE id IN (';
|
|
||||||
$ids = array_filter( array_map( 'intval', $ids ) );
|
|
||||||
$query .= implode( ',', $ids ) . ')';
|
|
||||||
$this->_dbi->query( $query );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds new instances collection.
|
|
||||||
*
|
|
||||||
* @param array $instances Collection of instances.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function _add_instances( array $instances ) {
|
|
||||||
$chunks = array_chunk( $instances, 50 );
|
|
||||||
foreach ( $chunks as $chunk ) {
|
|
||||||
$query = 'INSERT INTO ' . $this->_dbi->get_table_name(
|
|
||||||
'ai1ec_event_instances'
|
|
||||||
) . '(`post_id`, `start`, `end`) VALUES';
|
|
||||||
$chunk = array_map(
|
|
||||||
array( $this->_dbi_utils, 'array_value_to_sql_value' ),
|
|
||||||
$chunk
|
|
||||||
);
|
|
||||||
$query .= implode( ',', $chunk );
|
|
||||||
$this->_dbi->query( $query );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some argument was of invalid type.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Invalid_Argument_Exception extends Ai1ec_Exception {
|
|
||||||
}
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Model representing a legacy event.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @instantiator new
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Legacy extends Ai1ec_Event {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array map of method => class for legacy code.
|
|
||||||
*/
|
|
||||||
protected static $_classes = array(
|
|
||||||
'get_category_colors' => 'taxonomy',
|
|
||||||
'get_color_style' => 'taxonomy',
|
|
||||||
'get_categories_html' => 'taxonomy',
|
|
||||||
'get_tags_html' => 'taxonomy',
|
|
||||||
'get_category_text_color' => 'taxonomy',
|
|
||||||
'get_category_bg_color' => 'taxonomy',
|
|
||||||
'get_faded_color' => 'color',
|
|
||||||
'get_rgba_color' => 'color',
|
|
||||||
'get_event_avatar' => 'avatar',
|
|
||||||
'get_event_avatar_url' => 'avatar',
|
|
||||||
'get_post_thumbnail_url' => 'avatar',
|
|
||||||
'get_content_img_url' => 'avatar',
|
|
||||||
'get_short_location' => 'location',
|
|
||||||
'get_location' => 'location',
|
|
||||||
'get_map_view' => 'location',
|
|
||||||
'get_latlng' => 'location',
|
|
||||||
'get_gmap_url' => 'location',
|
|
||||||
'get_tickets_url_label' => 'ticket',
|
|
||||||
'get_contact_html' => 'ticket',
|
|
||||||
'get_timespan_html' => 'time',
|
|
||||||
'get_exclude_html' => 'time',
|
|
||||||
'get_back_to_calendar_button_html' => 'content',
|
|
||||||
'get_post_excerpt' => 'content',
|
|
||||||
);
|
|
||||||
|
|
||||||
public function get_long_end_date( $adjust = 0 ) {
|
|
||||||
$time = $this->_registry->get( 'view.event.time' );
|
|
||||||
$end = $this->_registry->get( 'date.time', $this->get( 'end' ) );
|
|
||||||
if ( ! empty( $adjust ) ) {
|
|
||||||
$end->set_time(
|
|
||||||
$end->format( 'H' ),
|
|
||||||
$end->format( 'i' ),
|
|
||||||
$adjust
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $time->get_long_date( $end );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_long_start_date() {
|
|
||||||
$time = $this->_registry->get( 'view.event.time' );
|
|
||||||
return $time->get_long_date( $this->get( 'start' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_multiday() {
|
|
||||||
return $this->is_multiday();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_recurrence_html() {
|
|
||||||
$rrule = $this->_registry->get( 'recurrence.rule' );
|
|
||||||
return $rrule->rrule_to_text( $this->get( 'recurrence_rules' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_short_end_date() {
|
|
||||||
$time = $this->_registry->get( 'view.event.time' );
|
|
||||||
$end = $this->_registry->get( 'date.time', $this->get( 'end' ) );
|
|
||||||
$end->set_time(
|
|
||||||
$end->format( 'H' ),
|
|
||||||
$end->format( 'i' ),
|
|
||||||
-1
|
|
||||||
);
|
|
||||||
return $time->get_short_date( $end );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_short_end_time() {
|
|
||||||
$time = $this->_registry->get( 'view.event.time' );
|
|
||||||
return $time->get_short_time( $this->get( 'end' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_short_start_date() {
|
|
||||||
$time = $this->_registry->get( 'view.event.time' );
|
|
||||||
return $time->get_short_date( $this->get( 'start' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_short_start_time() {
|
|
||||||
$time = $this->_registry->get( 'view.event.time' );
|
|
||||||
return $time->get_short_time( $this->get( 'start' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles legacy property setters.
|
|
||||||
*
|
|
||||||
* @param string $property Name of property being set.
|
|
||||||
* @param mixed $value Value attempted to set.
|
|
||||||
*
|
|
||||||
* @return Ai1ec_Event Instance of self for chaining.
|
|
||||||
*/
|
|
||||||
public function __set( $property, $value ) {
|
|
||||||
return $this->set( $property, $value );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle property accessors.
|
|
||||||
*
|
|
||||||
* @param string $name Property name
|
|
||||||
*
|
|
||||||
* @return mixed Property value
|
|
||||||
*/
|
|
||||||
public function __get( $name ) {
|
|
||||||
$method = 'get_' . $name;
|
|
||||||
if ( method_exists( $this, $name ) ) {
|
|
||||||
return $this->{$method}();
|
|
||||||
}
|
|
||||||
return $this->get( $name );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle legacy methods calls.
|
|
||||||
*
|
|
||||||
* @param string $method Legacy method name.
|
|
||||||
* @param array $arguments Arguments passed to method.
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*
|
|
||||||
* @throws Ai1ec_Invalid_Argument_Exception If there is no method handler.
|
|
||||||
*/
|
|
||||||
public function __call( $method, $arguments ) {
|
|
||||||
if ( ! isset( self::$_classes[$method] ) ) {
|
|
||||||
throw new Ai1ec_Invalid_Argument_Exception(
|
|
||||||
'Requested method \'' . $method . '\' is unknown'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
array_unshift( $arguments, $this );
|
|
||||||
$class = 'view.event.' . self::$_classes[$method];
|
|
||||||
return $this->_registry->dispatch(
|
|
||||||
$class,
|
|
||||||
$method,
|
|
||||||
$arguments
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event not found.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Not_Found_Exception extends Exception {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,366 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Class which represnt event parent/child relationship.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Parent extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* event_parent method
|
|
||||||
*
|
|
||||||
* Get/set event parent
|
|
||||||
*
|
|
||||||
* @param int $event_id ID of checked event
|
|
||||||
* @param int $parent_id ID of new parent [optional=NULL, acts as getter]
|
|
||||||
* @param int $instance_id ID of old instance id
|
|
||||||
*
|
|
||||||
* @return int|bool Value depends on mode:
|
|
||||||
* Getter: {@see self::get_parent_event()} for details
|
|
||||||
* Setter: true on success.
|
|
||||||
*/
|
|
||||||
public function event_parent(
|
|
||||||
$event_id,
|
|
||||||
$parent_id = null,
|
|
||||||
$instance_id = null
|
|
||||||
) {
|
|
||||||
$meta_key = '_ai1ec_event_parent';
|
|
||||||
if ( null === $parent_id ) {
|
|
||||||
return $this->get_parent_event( $event_id );
|
|
||||||
}
|
|
||||||
$meta_value = json_encode( array(
|
|
||||||
'created' => $this->_registry->get( 'date.system' )->current_time(),
|
|
||||||
'instance' => $instance_id,
|
|
||||||
) );
|
|
||||||
return add_post_meta( $event_id, $meta_key, $meta_value, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get parent ID for given event
|
|
||||||
*
|
|
||||||
* @param int $current_id Current event ID
|
|
||||||
*
|
|
||||||
* @return int|bool ID of parent event or bool(false)
|
|
||||||
*/
|
|
||||||
public function get_parent_event( $current_id ) {
|
|
||||||
static $parents = null;
|
|
||||||
if ( null === $parents ) {
|
|
||||||
$parents = $this->_registry->get( 'cache.memory' );
|
|
||||||
}
|
|
||||||
$current_id = (int)$current_id;
|
|
||||||
if ( null === ( $parent_id = $parents->get( $current_id ) ) ) {
|
|
||||||
$db = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
/* @var $db Ai1ec_Dbi */
|
|
||||||
$query = '
|
|
||||||
SELECT parent.ID, parent.post_status
|
|
||||||
FROM
|
|
||||||
' . $db->get_table_name( 'posts' ) . ' AS child
|
|
||||||
INNER JOIN ' . $db->get_table_name( 'posts' ) . ' AS parent
|
|
||||||
ON ( parent.ID = child.post_parent )
|
|
||||||
WHERE child.ID = ' . $current_id;
|
|
||||||
$parent = $db->get_row( $query );
|
|
||||||
if (
|
|
||||||
empty( $parent ) ||
|
|
||||||
'trash' === $parent->post_status
|
|
||||||
) {
|
|
||||||
$parent_id = false;
|
|
||||||
} else {
|
|
||||||
$parent_id = $parent->ID;
|
|
||||||
}
|
|
||||||
$parents->set( $current_id, $parent_id );
|
|
||||||
unset( $query );
|
|
||||||
}
|
|
||||||
return $parent_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of modified (children) event objects
|
|
||||||
*
|
|
||||||
* @param int $parent_id ID of parent event
|
|
||||||
* @param bool $include_trash Includes trashed when `true` [optional=false]
|
|
||||||
*
|
|
||||||
* @return array List (might be empty) of Ai1ec_Event objects
|
|
||||||
*/
|
|
||||||
public function get_child_event_objects(
|
|
||||||
$parent_id,
|
|
||||||
$include_trash = false
|
|
||||||
) {
|
|
||||||
$db = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
/* @var $db Ai1ec_Dbi */
|
|
||||||
$parent_id = (int)$parent_id;
|
|
||||||
$sql_query = 'SELECT ID FROM ' . $db->get_table_name( 'posts' ) .
|
|
||||||
' WHERE post_parent = ' . $parent_id;
|
|
||||||
$children = (array)$db->get_col( $sql_query );
|
|
||||||
$objects = array();
|
|
||||||
foreach ( $children as $child_id ) {
|
|
||||||
try {
|
|
||||||
$instance = $this->_registry->get( 'model.event', $child_id );
|
|
||||||
if (
|
|
||||||
$include_trash ||
|
|
||||||
'trash' !== $instance->get( 'post' )->post_status
|
|
||||||
) {
|
|
||||||
$objects[$child_id] = $instance;
|
|
||||||
}
|
|
||||||
} catch ( Ai1ec_Event_Not_Found_Exception $exception ) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $objects;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* admin_init_post method
|
|
||||||
*
|
|
||||||
* Bind to admin_action_editpost action to override default save
|
|
||||||
* method when user is editing single instance.
|
|
||||||
* New post is created with some fields unset.
|
|
||||||
*/
|
|
||||||
public function admin_init_post( ) {
|
|
||||||
if (
|
|
||||||
isset( $_POST['ai1ec_instance_id'] ) &&
|
|
||||||
isset( $_POST['action'] ) &&
|
|
||||||
'editpost' === $_POST['action']
|
|
||||||
) {
|
|
||||||
$old_post_id = $_POST['post_ID'];
|
|
||||||
$instance_id = $_POST['ai1ec_instance_id'];
|
|
||||||
$post_id = $this->_registry->get( 'model.event.creating' )
|
|
||||||
->create_duplicate_post();
|
|
||||||
if ( false !== $post_id ) {
|
|
||||||
$this->_handle_instances(
|
|
||||||
$this->_registry->get( 'model.event', $post_id ),
|
|
||||||
$this->_registry->get( 'model.event', $old_post_id ),
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
$this->_registry->get( 'model.event.instance' )->clean(
|
|
||||||
$old_post_id,
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
$location = add_query_arg(
|
|
||||||
'message',
|
|
||||||
1,
|
|
||||||
get_edit_post_link( $post_id, 'url' )
|
|
||||||
);
|
|
||||||
wp_redirect(
|
|
||||||
apply_filters(
|
|
||||||
'redirect_post_location',
|
|
||||||
$location,
|
|
||||||
$post_id
|
|
||||||
)
|
|
||||||
);
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inject base event edit link for modified instances
|
|
||||||
*
|
|
||||||
* Modified instances are events, belonging to some parent having recurrence
|
|
||||||
* rule, and having some of it's properties altered.
|
|
||||||
*
|
|
||||||
* @param array $actions List of defined actions
|
|
||||||
* @param stdClass $post Instance being rendered (WP_Post class instance in WP 3.5+)
|
|
||||||
*
|
|
||||||
* @return array Optionally modified $actions list
|
|
||||||
*/
|
|
||||||
public function post_row_actions( $actions, $post ) {
|
|
||||||
if ( $this->_registry->get( 'acl.aco' )->is_our_post_type( $post ) ) {
|
|
||||||
$parent_post_id = $this->event_parent( $post->ID );
|
|
||||||
if (
|
|
||||||
$parent_post_id &&
|
|
||||||
NULL !== ( $parent_post = get_post( $parent_post_id ) ) &&
|
|
||||||
isset( $parent_post->post_status ) &&
|
|
||||||
'trash' !== $parent_post->post_status
|
|
||||||
) {
|
|
||||||
$parent_link = get_edit_post_link(
|
|
||||||
$parent_post_id,
|
|
||||||
'display'
|
|
||||||
);
|
|
||||||
$actions['ai1ec_parent'] = sprintf(
|
|
||||||
'<a href="%s" title="%s">%s</a>',
|
|
||||||
wp_nonce_url( $parent_link ),
|
|
||||||
sprintf(
|
|
||||||
__( 'Edit “%s”', AI1EC_PLUGIN_NAME ),
|
|
||||||
apply_filters(
|
|
||||||
'the_title',
|
|
||||||
$parent_post->post_title,
|
|
||||||
$parent_post->ID
|
|
||||||
)
|
|
||||||
),
|
|
||||||
__( 'Base Event', AI1EC_PLUGIN_NAME )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $actions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* add_exception_date method
|
|
||||||
*
|
|
||||||
* Add exception (date) to event.
|
|
||||||
*
|
|
||||||
* @param int $post_id Event edited post ID
|
|
||||||
* @param mixed $date Parseable date representation to exclude
|
|
||||||
*
|
|
||||||
* @return bool Success
|
|
||||||
*/
|
|
||||||
public function add_exception_date( $post_id, Ai1ec_Date_Time $date ) {
|
|
||||||
$event = $this->_registry->get( 'model.event', $post_id );
|
|
||||||
$dates_list = explode( ',', $event->get( 'exception_dates' ) );
|
|
||||||
if ( empty( $dates_list[0] ) ) {
|
|
||||||
unset( $dates_list[0] );
|
|
||||||
}
|
|
||||||
$date->set_time( 0, 0, 0 );
|
|
||||||
$dates_list[] = $date->format(
|
|
||||||
'Ymd\THis\Z'
|
|
||||||
);
|
|
||||||
$event->set( 'exception_dates', implode( ',', $dates_list ) );
|
|
||||||
return $event->save( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles instances saving and switching if needed. If original event
|
|
||||||
* and created event have different start dates proceed in old style
|
|
||||||
* otherwise find next instance, switch original start date to next
|
|
||||||
* instance start date. If there are no next instances mark event as
|
|
||||||
* non recurring. Filter also exception dates if are past.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event $created_event Created event object.
|
|
||||||
* @param Ai1ec_Event $original_event Original event object.
|
|
||||||
*
|
|
||||||
* @return void Method does not return.
|
|
||||||
*/
|
|
||||||
protected function _handle_instances(
|
|
||||||
Ai1ec_Event $created_event,
|
|
||||||
Ai1ec_Event $original_event,
|
|
||||||
$instance_id
|
|
||||||
) {
|
|
||||||
$ce_start = $created_event->get( 'start' );
|
|
||||||
$oe_start = $original_event->get( 'start' );
|
|
||||||
if (
|
|
||||||
$ce_start->format() !== $oe_start->format()
|
|
||||||
) {
|
|
||||||
$this->add_exception_date(
|
|
||||||
$original_event->get( 'post_id' ),
|
|
||||||
$ce_start
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$next_instance = $this->_find_next_instance(
|
|
||||||
$original_event->get( 'post_id' ),
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
if ( ! $next_instance ) {
|
|
||||||
$original_event->set( 'recurrence_rules', null );
|
|
||||||
$original_event->save( true );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$original_event->set(
|
|
||||||
'start',
|
|
||||||
$this->_registry->get( 'date.time', $next_instance->get( 'start' ) )
|
|
||||||
);
|
|
||||||
$original_event->set(
|
|
||||||
'end',
|
|
||||||
$this->_registry->get( 'date.time', $next_instance->get( 'end' ) )
|
|
||||||
);
|
|
||||||
$edates = $this->_filter_exception_dates( $original_event );
|
|
||||||
$original_event->set( 'exception_dates', implode( ',', $edates ) );
|
|
||||||
$recurrence_rules = $original_event->get( 'recurrence_rules' );
|
|
||||||
$rules_info = $this->_registry->get( 'recurrence.rule' )
|
|
||||||
->build_recurrence_rules_array( $recurrence_rules );
|
|
||||||
if ( isset( $rules_info['COUNT'] ) ) {
|
|
||||||
$next_instances_count = $this->_count_next_instances(
|
|
||||||
$original_event->get( 'post_id' ),
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
$rules_info['COUNT'] = (int)$next_instances_count + count( $edates );
|
|
||||||
$rules = '';
|
|
||||||
if ( $rules_info['COUNT'] <= 1 ) {
|
|
||||||
$rules_info = array();
|
|
||||||
}
|
|
||||||
foreach ( $rules_info as $key => $value ) {
|
|
||||||
$rules .= $key . '=' . $value . ';';
|
|
||||||
}
|
|
||||||
$original_event->set(
|
|
||||||
'recurrence_rules',
|
|
||||||
$rules
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$original_event->save( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns next instance.
|
|
||||||
*
|
|
||||||
* @param int $post_id Post ID.
|
|
||||||
* @param int $instance_id Instance ID.
|
|
||||||
*
|
|
||||||
* @return null|Ai1ec_Event Result.
|
|
||||||
*/
|
|
||||||
protected function _find_next_instance( $post_id, $instance_id ) {
|
|
||||||
$dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
$table_instances = $dbi->get_table_name( 'ai1ec_event_instances' );
|
|
||||||
$table_posts = $dbi->get_table_name( 'posts' );
|
|
||||||
$query = $dbi->prepare(
|
|
||||||
'SELECT i.id FROM ' . $table_instances . ' i JOIN ' .
|
|
||||||
$table_posts . ' p ON (p.ID = i.post_id) ' .
|
|
||||||
'WHERE i.post_id = %d AND i.id > %d ' .
|
|
||||||
'AND p.post_status = \'publish\' ' .
|
|
||||||
'ORDER BY id ASC LIMIT 1',
|
|
||||||
$post_id,
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
$next_instance_id = $dbi->get_var( $query );
|
|
||||||
if ( ! $next_instance_id ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return $this->_registry->get( 'model.search' )
|
|
||||||
->get_event( $post_id, $next_instance_id );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Counts future instances.
|
|
||||||
*
|
|
||||||
* @param int $post_id Post ID.
|
|
||||||
* @param int $instance_id Instance ID.
|
|
||||||
*
|
|
||||||
* @return int Result.
|
|
||||||
*/
|
|
||||||
protected function _count_next_instances( $post_id, $instance_id ) {
|
|
||||||
$dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
$table_instances = $dbi->get_table_name( 'ai1ec_event_instances' );
|
|
||||||
$table_posts = $dbi->get_table_name( 'posts' );
|
|
||||||
$query = $dbi->prepare(
|
|
||||||
'SELECT COUNT(i.id) FROM ' . $table_instances . ' i JOIN ' .
|
|
||||||
$table_posts . ' p ON (p.ID = i.post_id) ' .
|
|
||||||
'WHERE i.post_id = %d AND i.id > %d ' .
|
|
||||||
'AND p.post_status = \'publish\'',
|
|
||||||
$post_id,
|
|
||||||
$instance_id
|
|
||||||
);
|
|
||||||
return (int)$dbi->get_var( $query );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filters past or out of range exception dates.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Event $event Event.
|
|
||||||
*
|
|
||||||
* @return array Filtered exception dates.
|
|
||||||
*/
|
|
||||||
protected function _filter_exception_dates( Ai1ec_Event $event ) {
|
|
||||||
$start = (int)$event->get( 'start' )->format();
|
|
||||||
$exception_dates = explode( ',', $event->get( 'exception_dates' ) );
|
|
||||||
$dates = array();
|
|
||||||
foreach ( $exception_dates as $date ) {
|
|
||||||
$ex_date = (int)$this->_registry->get( 'date.time', $date )->format();
|
|
||||||
if ( $ex_date > $start ) {
|
|
||||||
$dates[] = $date;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $dates;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modal class representing an event or an event instance.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @instantiator new
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Ai1ec_Event_Taxonomy extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Name of categories taxonomy.
|
|
||||||
*/
|
|
||||||
const CATEGORIES = 'events_categories';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Name of tags taxonomy.
|
|
||||||
*/
|
|
||||||
const TAGS = 'events_tags';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Name of feeds taxonomy.
|
|
||||||
*/
|
|
||||||
const FEEDS = 'events_feeds';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int ID of related post object
|
|
||||||
*/
|
|
||||||
protected $_post_id = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store event ID in local variable.
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post being managed.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct( Ai1ec_Registry_Object $registry, $post_id = 0 ) {
|
|
||||||
parent::__construct( $registry );
|
|
||||||
$this->_post_id = (int)$post_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get ID of term. Optionally create it if it doesn't exist.
|
|
||||||
*
|
|
||||||
* @param string $term Name of term to create.
|
|
||||||
* @param string $taxonomy Name of taxonomy to contain term within.
|
|
||||||
* @param bool $is_id Set to true if $term is ID.
|
|
||||||
* @param array $attrs Attributes to creatable entity.
|
|
||||||
*
|
|
||||||
* @return array|bool Associative array with term_id
|
|
||||||
* and taxonomy keys or false on error
|
|
||||||
*/
|
|
||||||
public function initiate_term(
|
|
||||||
$term,
|
|
||||||
$taxonomy,
|
|
||||||
$is_id = false,
|
|
||||||
array $attrs = array()
|
|
||||||
) {
|
|
||||||
// cast to int to have it working with term_exists
|
|
||||||
$term = ( $is_id ) ? (int) $term : $term;
|
|
||||||
$term_to_check = term_exists( $term, $taxonomy );
|
|
||||||
$to_return = array(
|
|
||||||
'taxonomy' => $taxonomy
|
|
||||||
);
|
|
||||||
// if term doesn't exist, create it.
|
|
||||||
if ( 0 === $term_to_check || null === $term_to_check ) {
|
|
||||||
$alias_to_use = apply_filters( 'ai1ec_ics_import_alias', $term );
|
|
||||||
// the filter will either return null, the term_id to use or the original $term
|
|
||||||
// if the filter is not run. Thus in need to check that $term !== $alias_to_use
|
|
||||||
if ( $alias_to_use && $alias_to_use !== $term ) {
|
|
||||||
$to_return['term_id'] = (int) $alias_to_use;
|
|
||||||
// check that the term matches the taxonomy
|
|
||||||
$tax = $this->get_taxonomy_for_term_id( term_exists( (int) $alias_to_use ) );
|
|
||||||
$to_return['taxonomy'] = $tax->taxonomy;
|
|
||||||
} else {
|
|
||||||
$term_to_check = wp_insert_term( $term, $taxonomy, $attrs );
|
|
||||||
if ( is_wp_error( $term_to_check ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$term_to_check = (object)$term_to_check;
|
|
||||||
$to_return['term_id'] = (int)$term_to_check->term_id;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$term_id = is_array( $term_to_check )
|
|
||||||
? $term_to_check['term_id']
|
|
||||||
: $term_to_check;
|
|
||||||
$to_return['term_id'] = (int)$term_id;
|
|
||||||
// when importing categories, use the mapping of the current site
|
|
||||||
// so place the term in the current taxonomy
|
|
||||||
if ( self::CATEGORIES === $taxonomy ) {
|
|
||||||
// check that the term matches the taxonomy
|
|
||||||
$tax = $this->get_taxonomy_for_term_id( $term_id );
|
|
||||||
$to_return['taxonomy'] = $tax->taxonomy;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return $to_return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper for terms setting to post.
|
|
||||||
*
|
|
||||||
* @param array $terms List of terms to set.
|
|
||||||
* @param string $taxonomy Name of taxonomy to set terms to.
|
|
||||||
* @param bool $append When true post may have multiple same instances.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function set_terms( array $terms, $taxonomy, $append = false ) {
|
|
||||||
$result = wp_set_post_terms(
|
|
||||||
$this->_post_id,
|
|
||||||
$terms,
|
|
||||||
$taxonomy,
|
|
||||||
$append
|
|
||||||
);
|
|
||||||
if ( is_wp_error( $result ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update event categories.
|
|
||||||
*
|
|
||||||
* @param array $categories List of category IDs.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function set_categories( array $categories ) {
|
|
||||||
return $this->set_terms( $categories, self::CATEGORIES );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update event tags.
|
|
||||||
*
|
|
||||||
* @param array $tags List of tag IDs.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function set_tags( array $tags ) {
|
|
||||||
return $this->set_terms( $tags, self::TAGS );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update event feed description.
|
|
||||||
*
|
|
||||||
* @param object $feed Feed object.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function set_feed( $feed ) {
|
|
||||||
$feed_name = $feed->feed_url;
|
|
||||||
// If the feed is not from an imported file, parse the url.
|
|
||||||
if ( ! isset( $feed->feed_imported_file ) ) {
|
|
||||||
$url_components = parse_url( $feed->feed_url );
|
|
||||||
$feed_name = $url_components['host'];
|
|
||||||
}
|
|
||||||
$term = $this->initiate_term(
|
|
||||||
$feed_name,
|
|
||||||
self::FEEDS,
|
|
||||||
false,
|
|
||||||
array(
|
|
||||||
'description' => $feed->feed_url,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
if ( false === $term ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$term_id = $term['term_id'];
|
|
||||||
return $this->set_terms( array( $term_id ), self::FEEDS );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the taxonomy name from term id
|
|
||||||
*
|
|
||||||
* @param int $term
|
|
||||||
*
|
|
||||||
* @return stdClass The taxonomy nane
|
|
||||||
*/
|
|
||||||
public function get_taxonomy_for_term_id( $term_id ) {
|
|
||||||
$db = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
return $db->get_row(
|
|
||||||
$db->prepare(
|
|
||||||
'SELECT terms_taxonomy.taxonomy FROM ' . $db->get_table_name( 'terms' ) .
|
|
||||||
' AS terms INNER JOIN ' .
|
|
||||||
$db->get_table_name( 'term_taxonomy' ) .
|
|
||||||
' AS terms_taxonomy USING(term_id) '.
|
|
||||||
'WHERE terms.term_id = %d LIMIT 1', $term_id )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles trash/delete operations.
|
|
||||||
*
|
|
||||||
* NOTICE: only operations on events entries themselve is handled.
|
|
||||||
* If plugins need some extra handling - they must bind to appropriate
|
|
||||||
* actions on their will.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Event_Trashing extends Ai1ec_Base {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trash/untrash/deletes child posts
|
|
||||||
*
|
|
||||||
* @param id $post_id
|
|
||||||
* @param string $action
|
|
||||||
*/
|
|
||||||
protected function _manage_children( $post_id, $action ) {
|
|
||||||
try {
|
|
||||||
$ai1ec_event = $this->_registry->get( 'model.event', $post_id );
|
|
||||||
if (
|
|
||||||
$ai1ec_event->get( 'post' ) &&
|
|
||||||
$ai1ec_event->get( 'recurrence_rules' )
|
|
||||||
) {
|
|
||||||
// when untrashing also get trashed object
|
|
||||||
$children = $this->_registry->get( 'model.event.parent' )
|
|
||||||
->get_child_event_objects( $ai1ec_event->get( 'post_id' ), $action === 'untrash' );
|
|
||||||
$function = 'wp_' . $action . '_post';
|
|
||||||
foreach ( $children as $child ) {
|
|
||||||
$function( $child->get( 'post_id' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch ( Ai1ec_Event_Not_Found_Exception $exception ) {
|
|
||||||
// ignore - not an event
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trashes child posts
|
|
||||||
*
|
|
||||||
* @param int $post_id
|
|
||||||
*/
|
|
||||||
public function trash_children( $post_id ) {
|
|
||||||
$this->_manage_children( $post_id, 'trash' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete child posts
|
|
||||||
*
|
|
||||||
* @param int $post_id
|
|
||||||
*/
|
|
||||||
public function delete_children( $post_id ) {
|
|
||||||
$this->_manage_children( $post_id, 'delete' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Untrashes child posts
|
|
||||||
*
|
|
||||||
* @param int $post_id
|
|
||||||
*/
|
|
||||||
public function untrash_children( $post_id ) {
|
|
||||||
$this->_manage_children( $post_id, 'untrash' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PRE (event) trashing.
|
|
||||||
*
|
|
||||||
* @wp_hook trash_post
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post, which was trashed.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function trash_post( $post_id ) {
|
|
||||||
$api = $this->_registry->get( 'model.api.api-ticketing' );
|
|
||||||
$post = get_post( $post_id );
|
|
||||||
$restored_status = get_post_meta( $post_id, '_wp_trash_meta_status', true );
|
|
||||||
$fields = array(
|
|
||||||
'status' => 'trash'
|
|
||||||
);
|
|
||||||
$ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;
|
|
||||||
$message = $api->update_api_event_fields( $post, $fields, 'trash', $ajax );
|
|
||||||
if ( null !== $message ) {
|
|
||||||
if ( $ajax ) {
|
|
||||||
wp_die( $message );
|
|
||||||
} else {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle POST (event) trashing.
|
|
||||||
*
|
|
||||||
* @wp_hook trashed_post
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post, which was trashed.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function trashed_post( $post_id ) {
|
|
||||||
return $this->trash_children( $post_id );
|
|
||||||
}
|
|
||||||
|
|
||||||
private function get_sendback_page( $post_id ) {
|
|
||||||
$sendback = wp_get_referer();
|
|
||||||
$page_base = Ai1ec_Wp_Uri_Helper::get_pagebase( $sendback ); //$_SERVER['REQUEST_URI'] );
|
|
||||||
if ( 'post.php' === $page_base ) {
|
|
||||||
return get_edit_post_link( $post_id, 'url' );
|
|
||||||
} else {
|
|
||||||
return admin_url( 'edit.php?post_type=ai1ec_event' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PRE (event) untrashing.
|
|
||||||
*
|
|
||||||
* @wp_hook untrash_post
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post, which was untrashed.
|
|
||||||
*
|
|
||||||
* @return bool Success. Interrupt the action with exit is
|
|
||||||
* the integration with API fails
|
|
||||||
*/
|
|
||||||
public function untrash_post ( $post_id ) {
|
|
||||||
$api = $this->_registry->get( 'model.api.api-ticketing' );
|
|
||||||
$post = get_post( $post_id );
|
|
||||||
$restored_status = get_post_meta( $post_id, '_wp_trash_meta_status', true );
|
|
||||||
$fields = array(
|
|
||||||
'status' => $restored_status
|
|
||||||
);
|
|
||||||
$ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;
|
|
||||||
$message = $api->update_api_event_fields( $post, $fields, 'untrash', $ajax );
|
|
||||||
if ( null !== $message ) {
|
|
||||||
if ( $ajax ) {
|
|
||||||
wp_die( $message );
|
|
||||||
} else {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle POST (event) untrashing.
|
|
||||||
*
|
|
||||||
* @wp_hook untrashed_post
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post, which was untrashed.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function untrashed_post( $post_id ) {
|
|
||||||
return $this->untrash_children( $post_id );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PRE (event) deletion.
|
|
||||||
*
|
|
||||||
* Executed before post is deleted, but after meta is removed.
|
|
||||||
*
|
|
||||||
* @wp_hook delete_post
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post, which was trashed.
|
|
||||||
*
|
|
||||||
* @return bool Success. Interrupt the action with exit is
|
|
||||||
* the integration with API fails
|
|
||||||
*/
|
|
||||||
public function before_delete_post( $post_id ) {
|
|
||||||
$api = $this->_registry->get( 'model.api.api-ticketing' );
|
|
||||||
$ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;
|
|
||||||
$message = $api->delete_api_event( $post_id, 'delete', $ajax );
|
|
||||||
if ( null !== $message ) {
|
|
||||||
if ( $ajax ) {
|
|
||||||
wp_die( $message );
|
|
||||||
} else {
|
|
||||||
wp_redirect( $this->get_sendback_page( $post_id ) );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle POST (event) deletion.
|
|
||||||
*
|
|
||||||
* Executed before post is deleted, but after meta is removed.
|
|
||||||
*
|
|
||||||
* @wp_hook delete_post
|
|
||||||
*
|
|
||||||
* @param int $post_id ID of post, which was trashed.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
public function delete( $post_id ) {
|
|
||||||
$post_id = (int)$post_id;
|
|
||||||
$where = array( 'post_id' => (int)$post_id );
|
|
||||||
$format = array( '%d' );
|
|
||||||
$dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
$success = $this->delete_children( $post_id );
|
|
||||||
$success = $dbi->delete( 'ai1ec_events', $where, $format );
|
|
||||||
$success = $this->_registry->get( 'model.event.instance' )->clean( $post_id );
|
|
||||||
unset( $where, $dbi );
|
|
||||||
return $success;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Authors filtering implementation.
|
|
||||||
*
|
|
||||||
* @instantiator new
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
class Ai1ec_Filter_Authors extends Ai1ec_Filter_Int {
|
|
||||||
|
|
||||||
public function get_field() {
|
|
||||||
return 'p.post_author';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Categories filtering implementation.
|
|
||||||
*
|
|
||||||
* @instantiator new
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
class Ai1ec_Filter_Categories extends Ai1ec_Filter_Taxonomy {
|
|
||||||
|
|
||||||
public function get_taxonomy() {
|
|
||||||
return 'events_categories';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Posts (events) filtering implementation.
|
|
||||||
*
|
|
||||||
* @instantiator new
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
class Ai1ec_Filter_Posts_By_Instance extends Ai1ec_Filter_Int {
|
|
||||||
|
|
||||||
public function get_field() {
|
|
||||||
return 'i.id';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for integers-based filters.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
abstract class Ai1ec_Filter_Int implements Ai1ec_Filter_Interface {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Registry_Object Injected object registry.
|
|
||||||
*/
|
|
||||||
protected $_registry = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array Sanitized input values with only positive integers kept.
|
|
||||||
*/
|
|
||||||
protected $_values = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sanitize input values upon construction.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Injected registry.
|
|
||||||
* @param array $filter_values Values to sanitize.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct(
|
|
||||||
Ai1ec_Registry_Object $registry,
|
|
||||||
array $filter_values = array()
|
|
||||||
) {
|
|
||||||
$this->_registry = $registry;
|
|
||||||
$this->_values = array_filter(
|
|
||||||
array_map(
|
|
||||||
array( $this->_registry->get( 'primitive.int' ), 'positive' ),
|
|
||||||
$filter_values
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* These simple filters does not require new joins.
|
|
||||||
*
|
|
||||||
* @return string Empty string is returned.
|
|
||||||
*/
|
|
||||||
public function get_join() {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get condition part of query for single field.
|
|
||||||
*
|
|
||||||
* @param string $inner_operator Inner logics to use. It is ignored.
|
|
||||||
*
|
|
||||||
* @return string Conditional snippet for query.
|
|
||||||
*/
|
|
||||||
public function get_where( $inner_operator = null ) {
|
|
||||||
if ( empty( $this->_values ) ) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
return $this->get_field() . ' IN ( ' . join( ',', $this->_values ) . ' )';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Require ancestors to override this to build correct conditional snippet.
|
|
||||||
*
|
|
||||||
* @return string Column alias to use in condition.
|
|
||||||
*/
|
|
||||||
abstract public function get_field();
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter provider interface.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
interface Ai1ec_Filter_Interface {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store user-input locally.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Injected registry.
|
|
||||||
* @param array $filter_values User provided input.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct(
|
|
||||||
Ai1ec_Registry_Object $registry,
|
|
||||||
array $filter_values = array()
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return SQL snippet for `FROM` part.
|
|
||||||
*
|
|
||||||
* @return string Valid SQL snippet for `FROM` part.
|
|
||||||
*/
|
|
||||||
public function get_join();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return SQL snippet for `WHERE` part.
|
|
||||||
*
|
|
||||||
* Snippet should not be put in brackets - this will be performed
|
|
||||||
* in upper level.
|
|
||||||
*
|
|
||||||
* @return string Valid SQL snippet.
|
|
||||||
*/
|
|
||||||
public function get_where();
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Posts (events) filtering implementation.
|
|
||||||
*
|
|
||||||
* @instantiator new
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
class Ai1ec_Filter_Posts extends Ai1ec_Filter_Int {
|
|
||||||
|
|
||||||
public function get_field() {
|
|
||||||
return 'e.post_id';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tags filtering implementation.
|
|
||||||
*
|
|
||||||
* @instantiator new
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
class Ai1ec_Filter_Tags extends Ai1ec_Filter_Taxonomy {
|
|
||||||
|
|
||||||
public function get_taxonomy() {
|
|
||||||
return 'events_tags';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for taxonomies filtering.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network Inc.
|
|
||||||
* @since 2.0
|
|
||||||
*
|
|
||||||
* @package AI1EC
|
|
||||||
* @subpackage AI1EC.Filter
|
|
||||||
*/
|
|
||||||
abstract class Ai1ec_Filter_Taxonomy extends Ai1ec_Filter_Int {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Dbi Instance of database interface.
|
|
||||||
*/
|
|
||||||
protected $_dbi = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sanitize input values upon construction.
|
|
||||||
*
|
|
||||||
* @param Ai1ec_Registry_Object $registry Injected registry.
|
|
||||||
* @param array $filter_values Values to sanitize.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct(
|
|
||||||
Ai1ec_Registry_Object $registry,
|
|
||||||
array $filter_values = array()
|
|
||||||
) {
|
|
||||||
parent::__construct( $registry, $filter_values );
|
|
||||||
$this->_dbi = $this->_registry->get( 'dbi.dbi' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build SQL snippet for `FROM` particle.
|
|
||||||
*
|
|
||||||
* @return string Valid SQL snippet.
|
|
||||||
*/
|
|
||||||
public function get_join() {
|
|
||||||
if ( empty( $this->_values ) ) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
$sql_query =
|
|
||||||
'LEFT JOIN `{{RELATIONSHIPS_TABLE}}` AS `{{RELATIONSHIP_ALIAS}}` ' .
|
|
||||||
'ON ( `e` . `post_id` = `{{RELATIONSHIP_ALIAS}}` . `object_id` ) ' .
|
|
||||||
'LEFT JOIN `{{TAXONOMY_TABLE}}` AS `{{TAXONOMY_ALIAS}}` ' .
|
|
||||||
'ON (' .
|
|
||||||
'`{{RELATIONSHIP_ALIAS}}` . `term_taxonomy_id` = ' .
|
|
||||||
'`{{TAXONOMY_ALIAS}}` . `term_taxonomy_id` ' .
|
|
||||||
'AND `{{TAXONOMY_ALIAS}}` . taxonomy = {{TAXONOMY}} ' .
|
|
||||||
')';
|
|
||||||
return str_replace(
|
|
||||||
array(
|
|
||||||
'{{RELATIONSHIPS_TABLE}}',
|
|
||||||
'{{RELATIONSHIP_ALIAS}}',
|
|
||||||
'{{TAXONOMY_TABLE}}',
|
|
||||||
'{{TAXONOMY_ALIAS}}',
|
|
||||||
'{{TAXONOMY}}',
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
$this->_dbi->get_table_name( 'term_relationships' ),
|
|
||||||
$this->_table_alias( 'term_relationships' ),
|
|
||||||
$this->_dbi->get_table_name( 'term_taxonomy' ),
|
|
||||||
$this->_table_alias( 'term_taxonomy' ),
|
|
||||||
'\'' . addslashes( $this->get_taxonomy() ) . '\'',
|
|
||||||
),
|
|
||||||
$sql_query
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Required by parent class. Using internal abstractions.
|
|
||||||
*
|
|
||||||
* @return string Field name to use in `WHERE` particle.
|
|
||||||
*/
|
|
||||||
public function get_field() {
|
|
||||||
return $this->_table_alias( 'term_taxonomy' ) . '.term_id';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the qualified name for the taxonomy.
|
|
||||||
*
|
|
||||||
* @return string Valid taxonomy name (see `term_taxonomy` table).
|
|
||||||
*/
|
|
||||||
abstract public function get_taxonomy();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate table alias given taxonomy.
|
|
||||||
*
|
|
||||||
* @param string $table Table to generate alias for.
|
|
||||||
*
|
|
||||||
* @return string Table alias.
|
|
||||||
*/
|
|
||||||
protected function _table_alias( $table ) {
|
|
||||||
return $table . '_' . $this->get_taxonomy();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Post meta entries management.
|
|
||||||
*
|
|
||||||
* Meta entries management based on {@see Ai1ec_Meta} class.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Meta_Post extends Ai1ec_Meta {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User meta entries management.
|
|
||||||
*
|
|
||||||
* Meta entries management based on {@see Ai1ec_Meta} class.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
class Ai1ec_Meta_User extends Ai1ec_Meta {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get meta value for current user.
|
|
||||||
*
|
|
||||||
* @param string $meta_key Name of meta entry to get for current user.
|
|
||||||
* @param mixed $default Value to return if no entry found.
|
|
||||||
*
|
|
||||||
* @return mixed Current user's option or $default if none found.
|
|
||||||
*/
|
|
||||||
public function get_current( $meta_key, $default = null ) {
|
|
||||||
$user_id = 0;
|
|
||||||
if ( is_callable( 'wp_get_current_user' ) ) {
|
|
||||||
$user = wp_get_current_user();
|
|
||||||
$user_id = (int)$user->ID;
|
|
||||||
unset( $user );
|
|
||||||
}
|
|
||||||
if ( $user_id <= 0 ) {
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
return $this->get( $user_id, $meta_key, $default );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* user_selected_tz method
|
|
||||||
*
|
|
||||||
* Get/set user selected (preferred) timezone.
|
|
||||||
* If only {@see $user_id} is provided - method acts as getter.
|
|
||||||
* Otherwise it acts as setter.
|
|
||||||
*
|
|
||||||
* @param int $user_id ID of user whose timezone is being checked/changed
|
|
||||||
* @param string $new_value New timezone string value to set user preferrence
|
|
||||||
* @param bool $force_update Set to true to force value update instead of add
|
|
||||||
*
|
|
||||||
* @return mixed Return value depends on activity:
|
|
||||||
* - [getter] string User preferred timezone name (might be empty string)
|
|
||||||
* - [setter] bool Success of preferrence change
|
|
||||||
*/
|
|
||||||
public function user_selected_tz(
|
|
||||||
$user_id,
|
|
||||||
$new_value = NULL,
|
|
||||||
$force_update = false
|
|
||||||
) {
|
|
||||||
$meta_key = 'ai1ec_timezone';
|
|
||||||
$user_id = (int)$user_id;
|
|
||||||
$old_value = $this->get(
|
|
||||||
$user_id,
|
|
||||||
$meta_key,
|
|
||||||
NULL,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if ( NULL !== $new_value ) {
|
|
||||||
if ( ! in_array( $new_value, timezone_identifiers_list() ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$success = false;
|
|
||||||
if ( true === $force_update || ! empty( $old_value ) ) {
|
|
||||||
$success = update_user_meta(
|
|
||||||
$user_id,
|
|
||||||
$meta_key,
|
|
||||||
$new_value,
|
|
||||||
$old_value
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$success = add_user_meta(
|
|
||||||
$user_id,
|
|
||||||
$meta_key,
|
|
||||||
$new_value,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if ( false === $success ) {
|
|
||||||
return $this->user_selected_tz(
|
|
||||||
$user_id,
|
|
||||||
$new_value,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $success;
|
|
||||||
}
|
|
||||||
return $old_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class for meta entries management.
|
|
||||||
*
|
|
||||||
* Via use of cache allows object-based access to meta entries.
|
|
||||||
*
|
|
||||||
* @author Time.ly Network, Inc.
|
|
||||||
* @since 2.0
|
|
||||||
* @package Ai1EC
|
|
||||||
* @subpackage Ai1EC.Model
|
|
||||||
*/
|
|
||||||
abstract class Ai1ec_Meta extends Ai1ec_App {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string Name of base object for storage.
|
|
||||||
*/
|
|
||||||
protected $_object = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Ai1ec_Cache_Memory In-memory cache operator.
|
|
||||||
*/
|
|
||||||
protected $_cache = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize instance-specific in-memory cache storage.
|
|
||||||
*
|
|
||||||
* @return void Method does not return.
|
|
||||||
*/
|
|
||||||
protected function _initialize() {
|
|
||||||
$class = get_class( $this );
|
|
||||||
$this->_object = strtolower(
|
|
||||||
substr( $class, strlen( __CLASS__ ) + 1 )
|
|
||||||
);
|
|
||||||
$this->_cache = $this->_registry->get( 'cache.memory' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create new entry if it does not exist and cache provided value.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to store.
|
|
||||||
* @param string $key Key particle for ID to store.
|
|
||||||
* @param mixed $value Serializable value to store.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
final public function add( $object_id, $key, $value ) {
|
|
||||||
if ( ! $this->_add( $object_id, $key, $value ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$this->_cache->set( $this->_cache_key( $object_id, $key ), $value );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update existing entry and cache it's value.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to store.
|
|
||||||
* @param string $key Key particle for ID to store.
|
|
||||||
* @param mixed $value Serializable value to store.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
final public function update( $object_id, $key, $value ) {
|
|
||||||
if ( ! $this->_update( $object_id, $key, $value ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$this->_cache->set( $this->_cache_key( $object_id, $key ), $value );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get object value - from cache or actual store.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to get.
|
|
||||||
* @param string $key Key particle for ID to get.
|
|
||||||
* @param mixed $default Value to return if nothing found.
|
|
||||||
*
|
|
||||||
* @return mixed Value stored or {$default}.
|
|
||||||
*/
|
|
||||||
final public function get( $object_id, $key, $default = null ) {
|
|
||||||
$cache_key = $this->_cache_key( $object_id, $key );
|
|
||||||
$value = $this->_cache->get( $cache_key, $default );
|
|
||||||
if ( $default === $value ) {
|
|
||||||
$value = $this->_get( $object_id, $key );
|
|
||||||
$this->_cache->set( $cache_key, $value );
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create or update an entry cache new value.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to store.
|
|
||||||
* @param string $key Key particle for ID to store.
|
|
||||||
* @param mixed $value Serializable value to store.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
final public function set( $object_id, $key, $value ) {
|
|
||||||
if ( ! $this->get( $object_id, $key ) ) {
|
|
||||||
if ( ! $this->_add( $object_id, $key, $value ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( ! $this->_update( $object_id, $key, $value ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->_cache->set( $this->_cache_key( $object_id, $key ), $value );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove object entry based on ID and key.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to remove.
|
|
||||||
* @param string $key Key particle for ID to remove.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
final public function delete( $object_id, $key ) {
|
|
||||||
$this->_cache->delete( $this->_cache_key( $object_id, $key ) );
|
|
||||||
return $this->_delete( $object_id, $key );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get object value from actual store.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to get.
|
|
||||||
* @param string $key Key particle for ID to get.
|
|
||||||
*
|
|
||||||
* @return mixed Value as found.
|
|
||||||
*/
|
|
||||||
protected function _get( $object_id, $key ) {
|
|
||||||
$function = 'get_' . $this->_object . '_meta';
|
|
||||||
return $function( $object_id, $key, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create new entry if it does not exist.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to store.
|
|
||||||
* @param string $key Key particle for ID to store.
|
|
||||||
* @param mixed $value Serializable value to store.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
protected function _add( $object_id, $key, $value ) {
|
|
||||||
$function = 'add_' . $this->_object . '_meta';
|
|
||||||
return $function( $object_id, $key, $value, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update existing entry.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to store.
|
|
||||||
* @param string $key Key particle for ID to store.
|
|
||||||
* @param mixed $value Serializable value to store.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
protected function _update( $object_id, $key, $value ) {
|
|
||||||
$function = 'update_' . $this->_object . '_meta';
|
|
||||||
return $function( $object_id, $key, $value );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove object entry based on ID and key.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object to remove.
|
|
||||||
* @param string $key Key particle for ID to remove.
|
|
||||||
*
|
|
||||||
* @return bool Success.
|
|
||||||
*/
|
|
||||||
protected function _delete( $object_id, $key ) {
|
|
||||||
$function = 'delete_' . $this->_object . '_meta';
|
|
||||||
return $function( $object_id, $key );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate key for use with cache engine.
|
|
||||||
*
|
|
||||||
* @param string $object_id ID of object.
|
|
||||||
* @param string $key Key particle for ID.
|
|
||||||
*
|
|
||||||
* @return string Single identifier for given keys.
|
|
||||||
*/
|
|
||||||
protected function _cache_key( $object_id, $key ) {
|
|
||||||
static $separator = "\0";
|
|
||||||
return $object_id . $separator . $key;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user