Merge remote-tracking branch 'refs/remotes/origin/3.0'
authorAlexander Ebert <ebert@woltlab.com>
Sun, 15 Apr 2018 18:54:59 +0000 (20:54 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sun, 15 Apr 2018 18:54:59 +0000 (20:54 +0200)
# Conflicts:
# com.woltlab.wcf/option.xml
# constants.php

# wcfsetup/install/files/lib/system/html/output/node/HtmlOutputNodeImg.class.php
# wcfsetup/install/lang/de.xml
# wcfsetup/install/lang/en.xml

1  2 
com.woltlab.wcf/option.xml
constants.php
wcfsetup/install/files/lib/system/html/output/node/HtmlOutputNodeImg.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 34de4cfb08d14288d2d54b0c2f3c12c344a8d357,04a7d87ebf46107c7d35875c1aba594a70811e90..37f08a80953bb17ec4242291460276f336c696c5
@@@ -1074,11 -1000,11 +1074,16 @@@ Pinterest</defaultvalue
                        <!-- /message.general.share -->
                        
                        <!-- message.general.image -->
+                       <option name="image_allow_external_source">
+                               <categoryname>message.general.image</categoryname>
+                               <optiontype>boolean</optiontype>
+                               <defaultvalue>0</defaultvalue>
+                       </option>
 +                      <option name="message_force_secure_images">
 +                              <categoryname>message.general.image</categoryname>
 +                              <optiontype>boolean</optiontype>
 +                              <defaultvalue>0</defaultvalue>
 +                      </option>
                        <option name="module_image_proxy">
                                <categoryname>message.general.image</categoryname>
                                <optiontype>boolean</optiontype>
diff --cc constants.php
index 22745d1824163024300717b713548cf6c29fbeb0,067872b6222f8163265b3be9fc87ed1e21958c38..5518ab92fcd03ec24045115d672f6b019df06164
@@@ -221,19 -216,4 +221,20 @@@ define('LANGUAGE_USE_INFORMAL_VARIANT'
  define('SHOW_STYLE_CHANGER', 0);
  define('ARTICLE_SORT_ORDER', 'DESC');
  define('USE_PAGE_TITLE_ON_LANDING_PAGE', 1);
 +define('OG_IMAGE', '');
 +define('HEAD_CODE', '');
 +define('AVATAR_DEFAULT_TYPE', 'initials');
 +define('ARTICLE_ENABLE_VISIT_TRACKING', 1);
 +define('ENABLE_AD_ROTATION', 1);
 +define('ENABLE_POLLING', 1);
 +define('ENABLE_DESKTOP_NOTIFICATIONS', 1);
 +define('FB_SHARE_APP_ID', '');
 +define('MODULE_CONTACT_FORM', 0);
 +define('SITEMAP_INDEX_TIME_FRAME', 365);
 +define('MODULE_TROPHY', 1);
 +define('ENABLE_DEVELOPER_TOOLS', 0);
 +define('FORCE_LOGIN', 0);
 +define('DESKTOP_NOTIFICATION_PACKAGE_ID', 1);
 +define('PAGE_LOGO_LINK_TO_APP_DEFAULT', 1);
 +define('MODULE_USER_COVER_PHOTO', 1);
+ define('IMAGE_ALLOW_EXTERNAL_SOURCE', 0);
index b271947416693c38d86791d3fa93567292c97405,10d47a60030bbddd87855bf628d912dff0eaca69..c6c8cc5cf8b7fc614464c368c3c405cee29609f9
@@@ -126,69 -106,20 +126,81 @@@ class HtmlOutputNodeImg extends Abstrac
                                                $element->setAttribute('srcset', $srcset);
                                        }
                                }
+                               else if (!IMAGE_ALLOW_EXTERNAL_SOURCE && !ApplicationHandler::getInstance()->isInternalURL($src)) {
+                                       $element->parentNode->insertBefore($element->ownerDocument->createTextNode('[IMG:'), $element);
+                                       
+                                       $link = $element->ownerDocument->createElement('a');
+                                       $link->setAttribute('href', $src);
+                                       $link->textContent = $src;
+                                       $element->parentNode->insertBefore($link, $element);
+                                       
+                                       $element->parentNode->insertBefore($element->ownerDocument->createTextNode(']'), $element);
+                                       
+                                       $element->parentNode->removeChild($element);
+                               }
 +                              else if (MESSAGE_FORCE_SECURE_IMAGES && Url::parse($src)['scheme'] === 'http') {
 +                                      // rewrite protocol to `https`
 +                                      $element->setAttribute('src', preg_replace('~^http~', 'https', $src));
 +                              }
 +                      }
 +              }
 +      }
 +      
 +      /**
 +       * Validates the domain name against the list of own domains
 +       * and whitelisted ones with wildcard support.
 +       * 
 +       * @param       string          $hostname
 +       * @return      boolean
 +       */
 +      protected function bypassProxy($hostname) {
 +              static $hosts = null;
 +              static $validHosts = [];
 +              
 +              if ($hosts === null) {
 +                      $whitelist = explode("\n", StringUtil::unifyNewlines(IMAGE_PROXY_HOST_WHITELIST));
 +                      foreach ($whitelist as $host) {
 +                              $isWildcard = false;
 +                              if (mb_strpos($host, '*') !== false) {
 +                                      $host = preg_replace('~^(\*\.)+~', '', $host);
 +                                      if (mb_strpos($host, '*') !== false || $host === '') {
 +                                              // bad host
 +                                              continue;
 +                                      }
 +                                      
 +                                      $isWildcard = true;
 +                              }
 +                              
 +                              $host = mb_strtolower($host);
 +                              if (!isset($hosts[$host])) $hosts[$host] = $isWildcard;
 +                      }
 +                      
 +                      foreach (ApplicationHandler::getInstance()->getApplications() as $application) {
 +                              $host = mb_strtolower($application->domainName);
 +                              if (!isset($hosts[$host])) $hosts[$host] = false;
 +                      }
 +              }
 +              
 +              $hostname = mb_strtolower($hostname);
 +              if (isset($hosts[$hostname]) || isset($validHosts[$hostname])) {
 +                      return true;
 +              }
 +              else {
 +                      // check wildcard hosts
 +                      foreach ($hosts as $host => $isWildcard) {
 +                              if ($isWildcard && mb_strpos($hostname, $host) !== false) {
 +                                      // the prepended dot will ensure that `example.com` matches only
 +                                      // on domains like `foo.example.com` but not on `bar-example.com`
 +                                      if (StringUtil::endsWith($hostname, '.' . $host)) {
 +                                              $validHosts[$hostname] = $hostname;
 +                                              
 +                                              return true;
 +                                      }
 +                              }
                        }
                }
 +              
 +              return false;
        }
        
        /**
index 89334074c5f1d29f3af7d8d1ac1ece01afcf83c0,25d4f96698ddd7c2ef7e080410fbb8defb23dbbd..44d9ea7b88f7e50f004e3ddec7572c148a5d1927
@@@ -1411,74 -1234,10 +1411,75 @@@ Als Benachrichtigungs-URL in der Konfig
                <item name="wcf.acp.option.article_sort_order"><![CDATA[Sortierungsreihenfolge]]></item>
                <item name="wcf.acp.option.article_sort_order.description"><![CDATA[Standard-Reihenfolge für die Liste der Artikel.]]></item>
                <item name="wcf.acp.option.use_page_title_on_landing_page"><![CDATA[Titel der Seite als Überschrift auf Startseite anzeigen]]></item>
 +              <item name="wcf.acp.option.head_code"><![CDATA[Head-Code]]></item>
 +              <item name="wcf.acp.option.head_code.description"><![CDATA[Der hier angegebene Code wird im Head-Tag jeder Seite ausgegeben. Der Head-Code eignet sich z.B. sehr gut für die Einbindung von zusätzlichen Meta-Tags.]]></item>
 +              <item name="wcf.acp.option.avatar_default_type"><![CDATA[Standard Avatar-Typ]]></item>
 +              <item name="wcf.acp.option.avatar_default_type.initials"><![CDATA[Initialen]]></item>
 +              <item name="wcf.acp.option.avatar_default_type.silhouette"><![CDATA[Silhouette]]></item>
 +              <item name="wcf.acp.option.article_enable_visit_tracking"><![CDATA[Gelesen-Markierung für Artikel aktivieren]]></item>
 +              <item name="wcf.acp.option.enable_ad_rotation"><![CDATA[Werbung abwechselnd anzeigen]]></item>
 +              <item name="wcf.acp.option.enable_ad_rotation.description"><![CDATA[Sollte einer Position mehr als eine Werbung zugewiesen sein, so wird bei jedem Aufruf eine zufällige Werbung angezeigt. Bei Deaktivierung dieser Option werden alle Werbungen parallel angezeigt.]]></item>
 +              <item name="wcf.acp.option.visitor_use_tiny_build"><![CDATA[Seitenbeschleunigung für Gäste aktivieren (Experimentell)]]></item>
 +              <item name="wcf.acp.option.visitor_use_tiny_build.description"><![CDATA[Aktiviert einen besonderen Modus in dem Gästen und Suchmaschinen stark reduzierte JavaScript-Dateien ausgeliefert werden, um das Laden als auch den Seitenaufbau zu beschleunigen.<br><strong>Warnung:</strong> Dieser Modus arbeitet sehr restriktiv und untersagt unter anderem jeglichen Schreibzugriff, bitte überprüfe{if !LANGUAGE_USE_INFORMAL_VARIANT}n Sie{/if}, ob alle installierten Plugins mit diesem Modus kompatibel sind.]]></item>
 +              <item name="wcf.acp.option.fb_share_app_id"><![CDATA[Facebook App ID]]></item>
 +              <item name="wcf.acp.option.fb_share_app_id.description"><![CDATA[Die App ID kann direkt über das <a href="{@$__wcf->getPath('wcf')}acp/dereferrer.php?url=https%3A%2F%2Fdevelopers.facebook.com%2Fdocs%2Fapps%2Fregister%3Flocale%3Dde_DE">App-Dashboard angefordert werden</a>, und wird für die Open Graph-Tags zum Teilen verwendet.]]></item>
 +              <item name="wcf.acp.option.enable_polling"><![CDATA[Hintergrund-Aktualisierung von Benachrichtigungen aktivieren]]></item>
 +              <item name="wcf.acp.option.enable_polling.description"><![CDATA[Neue Benachrichtigungen werden in periodischen Abständen automatisch abgerufen. Der Aktualisierungs-Intervall beträgt 5 Minuten und wird bei Inaktivität schrittweise auf 15 Minuten reduziert.]]></item>
 +              <item name="wcf.acp.option.enable_desktop_notifications"><![CDATA[Desktop-Benachrichtigungen verwenden]]></item>
 +              <item name="wcf.acp.option.enable_desktop_notifications.description"><![CDATA[Neue Benachrichtigungen, die im Hintergrund abgerufen wurden, werden als kleines Benachrichtigungsfenster unmittelbar angezeigt. Einige wenige Browser, z. B. Internet Explorer, unterstützen diese Funktion nicht.]]></item>
 +              <item name="wcf.acp.option.module_contact_form"><![CDATA[Kontaktformular aktivieren]]></item>
 +              <item name="wcf.acp.option.module_contact_form.description"><![CDATA[Aktiviert das Kontaktformular, nach Aktivierung können Sie die <a href="{link controller='ContactSettings'}{/link}">Eingabefelder und Empfänger</a> individuell konfigurieren.]]></item>
 +              <item name="wcf.acp.option.module_trophy"><![CDATA[Trophäen]]></item>
 +              <item name="wcf.acp.option.category.module.development"><![CDATA[Entwicklung]]></item>
 +              <item name="wcf.acp.option.category.module.development.notice"><![CDATA[Diese Optionen werden exklusiv für die Entwicklung und Fehlersuche verwendet, und sind nicht für den produktiven Einsatz geeignet.]]></item>
 +              <item name="wcf.acp.option.enable_developer_tools"><![CDATA[Entwickler-Werkzeuge aktivieren]]></item>
 +              <item name="wcf.acp.option.enable_developer_tools.description"><![CDATA[Aktiviert spezielle Werkzeuge die für die Plugin-Entwicklung verwendet werden. Diese Option sollte im Live-Betrieb abgeschaltet werden.]]></item>
 +              <item name="wcf.acp.option.force_login"><![CDATA[Anmeldung erzwingen]]></item>
 +              <item name="wcf.acp.option.force_login.description"><![CDATA[Besucher werden aufgefordert sich anzumelden, um auf die Inhalte zugreifen zu können.]]></item>
 +              <item name="wcf.acp.option.desktop_notification_package_id"><![CDATA[Primäre Domain für Desktop-Benachrichtigungen]]></item>
 +              <item name="wcf.acp.option.desktop_notification_package_id.description"><![CDATA[Desktop-Benachrichtigungen werden nur für die ausgewählte App aktiviert, einschließlich aller anderen Apps die auf der identischen Domain laufen.]]></item>
 +              <item name="wcf.acp.option.page_logo_link_to_app_default"><![CDATA[Seitenlogo verlinkt auf die Startseite der aktiven App]]></item>
 +              <item name="wcf.acp.option.page_logo_link_to_app_default.description"><![CDATA[Deaktiviere{if !LANGUAGE_USE_INFORMAL_VARIANT}n Sie{/if} diese Option, damit das Logo stets auf die globale Startseite verlinkt. Die Deaktivierung entspricht dem Verhalten in früheren Versionen.]]></item>
 +              <item name="wcf.acp.option.module_user_cover_photo"><![CDATA[Titelbilder aktivieren]]></item>
 +              <item name="wcf.acp.option.module_user_cover_photo.description"><![CDATA[Aktiviert die Darstellung und die Verwaltung von Titelbildern.]]></item>
+               <item name="wcf.acp.option.image_allow_external_source"><![CDATA[Bilder von externen Seiten erlauben]]></item>
        </category>
        
 +      <category name="wcf.acp.customOption">
 +              <item name="wcf.acp.customOption.list"><![CDATA[Eingabefelder]]></item>
 +              <item name="wcf.acp.customOption.optionType"><![CDATA[Feldtyp]]></item>
 +              <item name="wcf.acp.customOption.optionType.boolean"><![CDATA[Ja/Nein]]></item>
 +              <item name="wcf.acp.customOption.optionType.boolean.yes"><![CDATA[Ja]]></item>
 +              <item name="wcf.acp.customOption.optionType.boolean.no"><![CDATA[Nein]]></item>
 +              <item name="wcf.acp.customOption.optionType.checkboxes"><![CDATA[Checkboxen]]></item>
 +              <item name="wcf.acp.customOption.optionType.date"><![CDATA[Datum]]></item>
 +              <item name="wcf.acp.customOption.optionType.integer"><![CDATA[Ganze Zahl]]></item>
 +              <item name="wcf.acp.customOption.optionType.float"><![CDATA[Dezimalzahl]]></item>
 +              <item name="wcf.acp.customOption.optionType.multiSelect"><![CDATA[Multi-Select]]></item>
 +              <item name="wcf.acp.customOption.optionType.radioButton"><![CDATA[Radio-Buttons]]></item>
 +              <item name="wcf.acp.customOption.optionType.select"><![CDATA[Select]]></item>
 +              <item name="wcf.acp.customOption.optionType.text"><![CDATA[Einzeiliger Text]]></item>
 +              <item name="wcf.acp.customOption.optionType.textarea"><![CDATA[Mehrzeiliger Text]]></item>
 +              <item name="wcf.acp.customOption.optionType.message"><![CDATA[Mehrzeiliger Text (BBCode-Unterstützung)]]></item>
 +              <item name="wcf.acp.customOption.optionType.URL"><![CDATA[Link]]></item>
 +              <item name="wcf.acp.customOption.add"><![CDATA[Eingabefeld hinzufügen]]></item>
 +              <item name="wcf.acp.customOption.edit"><![CDATA[Eingabefeld bearbeiten]]></item>
 +              <item name="wcf.acp.customOption.error.validationFailed"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Du hast{else}Sie haben{/if} einen ungültigen Inhalt eingegeben.]]></item>
 +              <item name="wcf.acp.customOption.showOrder"><![CDATA[Reihenfolge]]></item>
 +              <item name="wcf.acp.customOption.delete.confirmMessage"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Willst du{else}Wollen Sie{/if} das Eingabefeld <span class="confirmationObject">{$option->optionTitle|language}</span> wirklich löschen?]]></item>
 +              <item name="wcf.acp.customOption.defaultValue"><![CDATA[Standardwert]]></item>
 +              <item name="wcf.acp.customOption.defaultValue.description"><![CDATA[Wert, der beim erstmaligen Ausfüllen als Standard vorgegeben ist.]]></item>
 +              <item name="wcf.acp.customOption.typeData"><![CDATA[Eigenschaften]]></item>
 +              <item name="wcf.acp.customOption.selectOptions"><![CDATA[Auswahloptionen]]></item>
 +              <item name="wcf.acp.customOption.selectOptions.description"><![CDATA[Hier {if LANGUAGE_USE_INFORMAL_VARIANT}kannst du{else}können Sie{/if} pro Zeile Auswahloptionen eintragen, beispielsweise bei einer Select-Box. {if LANGUAGE_USE_INFORMAL_VARIANT}Beachte{else}Beachten Sie{/if}, dass bei der Verwendung des Doppelpunktes der linke Teil der Zeile als interner Bezeichner verwendet wird. Dieser erlaubt es den Text zu ändern, ohne, dass die Auswahl von Benutzern verloren geht.]]></item>
 +              <item name="wcf.acp.customOption.validationPattern"><![CDATA[Regulärer Ausdruck zur Validierung]]></item>
 +              <item name="wcf.acp.customOption.validationPattern.description"><![CDATA[{if LANGUAGE_USE_INFORMAL_VARIANT}Trage{else}Tragen Sie{/if} hier den regulären Ausdruck ein, um die Eingabe der Benutzer zu validieren.]]></item>
 +              <item name="wcf.acp.customOption.required"><![CDATA[Das Feld muss zwingend ausgefüllt werden.]]></item>
 +      </category>
 +      
        <category name="wcf.acp.package">
 +              <item name="wcf.acp.package.apiVersions"><![CDATA[Unterstütze WoltLab Suite&trade; API-Versionen]]></item>
 +              <item name="wcf.acp.package.apiVersions.missing"><![CDATA[Dieses Paket stellt keine Informationen zur Kompatibilität bereit.]]></item>
                <item name="wcf.acp.package.application.installed"><![CDATA[Installierte Apps]]></item>
                <item name="wcf.acp.package.application.title"><![CDATA[Apps]]></item>
                <item name="wcf.acp.package.author"><![CDATA[Entwickler]]></item>
index aa44ca9cfe6f25036ac5d5b4cdf978b4986196d2,2363dda3904e10daf9de3f565a3276ddd6701951..3caf311ead50f440a8935f1587e3d64c3d702510
@@@ -1404,74 -1236,10 +1404,75 @@@ When prompted for the notification URL 
                <item name="wcf.acp.option.article_sort_order"><![CDATA[Sort Order]]></item>
                <item name="wcf.acp.option.article_sort_order.description"><![CDATA[Choose default sort order of articles.]]></item>
                <item name="wcf.acp.option.use_page_title_on_landing_page"><![CDATA[Use page title on landing page]]></item>
 +              <item name="wcf.acp.option.head_code"><![CDATA[Head Code]]></item>
 +              <item name="wcf.acp.option.head_code.description"><![CDATA[The entered code will be appended to the head tag of your site. You can use it to add additional meta tags.]]></item>
 +              <item name="wcf.acp.option.avatar_default_type"><![CDATA[Default Avatar Type]]></item>
 +              <item name="wcf.acp.option.avatar_default_type.initials"><![CDATA[Initials]]></item>
 +              <item name="wcf.acp.option.avatar_default_type.silhouette"><![CDATA[Silhouette]]></item>
 +              <item name="wcf.acp.option.article_enable_visit_tracking"><![CDATA[Enable “mark as read” for articles]]></item>
 +              <item name="wcf.acp.option.enable_ad_rotation"><![CDATA[Enable ad rotation]]></item>
 +              <item name="wcf.acp.option.enable_ad_rotation.description"><![CDATA[If there is more than one ad per placeholder, a random ad will be displayed every time. Disabling this option will display all ads simultaneously.]]></item>
 +              <item name="wcf.acp.option.visitor_use_tiny_build"><![CDATA[Enable accelerated guest view (experimental)]]></item>
 +              <item name="wcf.acp.option.visitor_use_tiny_build.description"><![CDATA[Enables a specialized view mode for guests and search engines alike, providing greatly reduced JavaScript files to achieve faster loading and page rendering.<br><strong>Warning:</strong> This mode is highly restricted and reduces the abilities of guests to interact with your site, such as creating new content. Please review your installed plugins before enabling to see if they are compatible with this setting.]]></item>
 +              <item name="wcf.acp.option.fb_share_app_id"><![CDATA[Facebook App ID]]></item>
 +              <item name="wcf.acp.option.fb_share_app_id.description"><![CDATA[You can obtain the app ID from your <a href="{@$__wcf->getPath('wcf')}acp/dereferrer.php?url=https%3A%2F%2Fdevelopers.facebook.com%2Fdocs%2Fapps%2Fregister%3Flocale%3Den_US">app’s dashboard</a>, and is used with the Open Graph tags for sharing.]]></item>
 +              <item name="wcf.acp.option.enable_polling"><![CDATA[Enable Background Notifications]]></item>
 +              <item name="wcf.acp.option.enable_polling.description"><![CDATA[Periodically retrieves new notifications in the background, requests are dispatched every 5 minutes. Interval decreases down to 15 minutes on inactivity.]]></item>
 +              <item name="wcf.acp.option.enable_desktop_notifications"><![CDATA[Enable Desktop Notifications]]></item>
 +              <item name="wcf.acp.option.enable_desktop_notifications.description"><![CDATA[Display a small window for new notifications that have been retrieved in the background. May not be supported in some browsers, e.g. Internet Explorer.]]></item>
 +              <item name="wcf.acp.option.module_contact_form"><![CDATA[Enable contact form]]></item>
 +              <item name="wcf.acp.option.module_contact_form.description"><![CDATA[Enables the contact form, once enabled you can customize the <a href="{link controller='ContactSettings'}{/link}">input fields and recipients</a> to better suit your needs.]]></item>
 +              <item name="wcf.acp.option.module_trophy"><![CDATA[Trophies]]></item>
 +              <item name="wcf.acp.option.category.module.development"><![CDATA[Development]]></item>
 +              <item name="wcf.acp.option.category.module.development.notice"><![CDATA[These options are used exclusively for development and debugging, they’re not suitable for use in production environments.]]></item>
 +              <item name="wcf.acp.option.enable_developer_tools"><![CDATA[Enable developer tools]]></item>
 +              <item name="wcf.acp.option.enable_developer_tools.description"><![CDATA[Enables a set of specialized tools that are used for plugin development. Should always be disabled in production environments.]]></item>
 +              <item name="wcf.acp.option.force_login"><![CDATA[Force login]]></item>
 +              <item name="wcf.acp.option.force_login.description"><![CDATA[Visitors are required to log-in themselves to access the page.]]></item>
 +              <item name="wcf.acp.option.desktop_notification_package_id"><![CDATA[Primary Domain for Desktop Notifications]]></item>
 +              <item name="wcf.acp.option.desktop_notification_package_id.description"><![CDATA[Desktop Notifications will be enabled for the selected app only, including all other apps that use the exact same domain.]]></item>
 +              <item name="wcf.acp.option.page_logo_link_to_app_default"><![CDATA[Page logo links to the start page of the active app]]></item>
 +              <item name="wcf.acp.option.page_logo_link_to_app_default.description"><![CDATA[Disabling this option will cause the link to always point to the global landing page instead. This option enforces the behavior known from previous versions when disabled.]]></item>
 +              <item name="wcf.acp.option.module_user_cover_photo"><![CDATA[Enable user cover photos]]></item>
 +              <item name="wcf.acp.option.module_user_cover_photo.description"><![CDATA[Enables the display and upload of user profile cover photos.]]></item>
+               <item name="wcf.acp.option.image_allow_external_source"><![CDATA[Allow images from external sites]]></item>
        </category>
        
 +      <category name="wcf.acp.customOption">
 +              <item name="wcf.acp.customOption.list"><![CDATA[Option Fields]]></item>
 +              <item name="wcf.acp.customOption.optionType"><![CDATA[Option Type]]></item>
 +              <item name="wcf.acp.customOption.optionType.boolean"><![CDATA[Yes/No]]></item>
 +              <item name="wcf.acp.customOption.optionType.boolean.yes"><![CDATA[Yes]]></item>
 +              <item name="wcf.acp.customOption.optionType.boolean.no"><![CDATA[No]]></item>
 +              <item name="wcf.acp.customOption.optionType.checkboxes"><![CDATA[Checkboxes]]></item>
 +              <item name="wcf.acp.customOption.optionType.date"><![CDATA[Date]]></item>
 +              <item name="wcf.acp.customOption.optionType.integer"><![CDATA[Integer]]></item>
 +              <item name="wcf.acp.customOption.optionType.float"><![CDATA[Decimal]]></item>
 +              <item name="wcf.acp.customOption.optionType.multiSelect"><![CDATA[Multi selection]]></item>
 +              <item name="wcf.acp.customOption.optionType.radioButton"><![CDATA[Radio selection]]></item>
 +              <item name="wcf.acp.customOption.optionType.select"><![CDATA[Single selection]]></item>
 +              <item name="wcf.acp.customOption.optionType.text"><![CDATA[Short text]]></item>
 +              <item name="wcf.acp.customOption.optionType.textarea"><![CDATA[Multiline text]]></item>
 +              <item name="wcf.acp.customOption.optionType.message"><![CDATA[Multiline text (bbcode support)]]></item>
 +              <item name="wcf.acp.customOption.optionType.URL"><![CDATA[Link]]></item>
 +              <item name="wcf.acp.customOption.add"><![CDATA[Add Option Field]]></item>
 +              <item name="wcf.acp.customOption.edit"><![CDATA[Edit Option Field]]></item>
 +              <item name="wcf.acp.customOption.error.validationFailed"><![CDATA[You have entered an invalid value.]]></item>
 +              <item name="wcf.acp.customOption.showOrder"><![CDATA[Display Order]]></item>
 +              <item name="wcf.acp.customOption.delete.confirmMessage"><![CDATA[Do you really want to delete the option field <span class="confirmationObject">{$option->optionTitle|language}</span>?]]></item>
 +              <item name="wcf.acp.customOption.defaultValue"><![CDATA[Default Value]]></item>
 +              <item name="wcf.acp.customOption.defaultValue.description"><![CDATA[Default option value suggested on initial request.]]></item>
 +              <item name="wcf.acp.customOption.typeData"><![CDATA[Properties]]></item>
 +              <item name="wcf.acp.customOption.selectOptions"><![CDATA[Options]]></item>
 +              <item name="wcf.acp.customOption.selectOptions.description"><![CDATA[You can use select options in combination with selection types, but please be aware that using the colon will cause the system to use everything to the left as an internal identifier and only the part after the colon will be displayed to the user. This allows you to change the value displayed to the user without harming existing selections unless the identifier itself is being changed. Enter one select option per line.]]></item>
 +              <item name="wcf.acp.customOption.validationPattern"><![CDATA[Regular Expression]]></item>
 +              <item name="wcf.acp.customOption.validationPattern.description"><![CDATA[You can provide a regular expression to validate the user input.]]></item>
 +              <item name="wcf.acp.customOption.required"><![CDATA[This is a required field]]></item>
 +      </category>
 +      
        <category name="wcf.acp.package">
 +              <item name="wcf.acp.package.apiVersions"><![CDATA[Supported WoltLab Suite&trade; API-versions]]></item>
 +              <item name="wcf.acp.package.apiVersions.missing"><![CDATA[This package does not provide any compatibility data.]]></item>
                <item name="wcf.acp.package.application.installed"><![CDATA[Installed Apps]]></item>
                <item name="wcf.acp.package.application.title"><![CDATA[Apps]]></item>
                <item name="wcf.acp.package.author"><![CDATA[Developer]]></item>