module Infusionsoft
  class Client
    # The Invoice service allows you to manage eCommerce transactions.
    module Invoice
      # Creates a blank order with no items.
      #
      # @param [Integer] contact_id
      # @param [String] description the name this order will display
      # @param [Date] order_date
      # @param [Integer] lead_affiliate_id 0 should be used if none
      # @param [Integer] sale_affiliate_id 0 should be used if none
      # @return [Integer] returns the invoice id
      def invoice_create_blank_order(contact_id, description, order_date, lead_affiliate_id,
                                     sale_affiliate_id)
        response = get('InvoiceService.createBlankOrder', contact_id, description, order_date,
                        lead_affiliate_id, sale_affiliate_id)
      end

      # Adds a line item to an order. This used to add a Product to an order as well as
      # any other sort of charge/discount.
      #
      # @param [Integer] invoice_id
      # @param [Integer] product_id
      # @param [Integer] type  UNKNOWN = 0, SHIPPING = 1, TAX = 2, SERVICE = 3, PRODUCT = 4,
      #   UPSELL = 5, FINANCECHARGE = 6, SPECIAL = 7
      # @param [Float] price
      # @param [Integer] quantity
      # @param [String] description a full description of the line item
      # @param [String] notes
      # @return [Boolean] returns true/false if it was added successfully or not
      def invoice_add_order_item(invoice_id, product_id, type, price, quantity, description, notes)
        response = get('InvoiceService.addOrderItem', invoice_id, product_id, type, price,
                       quantity, description, notes)
      end

      # This will cause a credit card to be charged for the amount currently due on an invoice.
      #
      # @param [Integer] invoice_id
      # @param [String] notes a note about the payment
      # @param [Integer] credit_card_id
      # @param [Integer] merchant_account_id
      # @param [Boolean] bypass_commission
      # @return [Hash] containing the following keys {'Successful' => [Boolean],
      #   'Code' => [String], 'RefNum' => [String], 'Message' => [String]}
      def invoice_charge_invoice(invoice_id, notes, credit_card_id, merchant_account_id,
                                 bypass_commissions)
        response = get('InvoiceService.chargeInvoice', invoice_id, notes, credit_card_id,
                            merchant_account_id, bypass_commissions)
      end

      # Deletes the specified subscription from the database, as well as all invoices
      # tied to the subscription.
      #
      # @param [Integer] cprogram_id the id of the subscription being deleted
      # @return [Boolean]
      def invoice_delete_subscription(cprogram_id)
        response = get('InvoiceService.deleteSubscription', cprogram_id)
      end

      # Creates a subscription for a contact. Subscriptions are billing automatically
      # by infusionsoft within the next six hours. If you want to bill immediately you
      # will need to utilize the create_invoice_for_recurring and then
      # charge_invoice method to accomplish this.
      #
      # @param [Integer] contact_id
      # @param [Boolean] allow_duplicate
      # @param [Integer] cprogram_id the subscription id
      # @param [Integer] merchant_account_id
      # @param [Integer] credit_card_id
      # @param [Integer] affiliate_id
      # @param [Integer] days_till_charge number of days you want to wait till it's charged
      def invoice_add_recurring_order(contact_id, allow_duplicate, cprogram_id,
                                      merchant_account_id, credit_card_id, affiliate_id,
                                      days_till_charge)

        api_logger.warn "[DEPRECATION WARNING]: The invoice_add_subscription method more fully complies with Infusionsoft's published API documents. User is advised to review Infusionsoft's API and this gem's documentation for changes in parameters."

        response = get('InvoiceService.addRecurringOrder', contact_id,
                       allow_duplicate, cprogram_id, merchant_account_id, credit_card_id,
                       affiliate_id, days_till_charge)
      end

      ################### This is a replacement method for invoice_add_recurring_order
      # in order to fully support and comply with the Infusionsoft API documentation.
      #
      #
      # @param [Integer] contact_id
      # @param [Boolean] allow_duplicate
      # @param [Integer] cprogram_id the subscription id
      # @param [Integer] qty
      # @param [Float]   price
      # @param [Boolean] allow_tax
      # @param [Integer] merchant_account_id
      # @param [Integer] credit_card_id
      # @param [Integer] affiliate_id
      # @param [Integer] days_till_charge number of days you want to wait till it's charged

      def invoice_add_subscription(contact_id, allow_duplicate, cprogram_id,
                                      qty, price, allow_tax,
                                      merchant_account_id, credit_card_id, affiliate_id,
                                      days_till_charge)
        response = get('InvoiceService.addRecurringOrder', contact_id,
                       allow_duplicate, cprogram_id, qty, price, allow_tax, merchant_account_id, credit_card_id,
                       affiliate_id, days_till_charge)
      end

      # This modifies the commissions being earned on a particular subscription.
      # This does not affect previously generated invoices for this subscription.
      #
      # @param [Integer] recurring_order_id
      # @param [Integer] affiliate_id
      # @param [Float] amount
      # @param [Integer] paryout_type how commissions will be earned (possible options are
      #   4 - up front earning, 5 - upon customer payment) typically this is 5
      # @return [Boolean]
      def invoice_add_recurring_commission_override(recurring_order_id, affiliate_id,
                                                    amount, payout_type, description)
        response = get('InvoiceService.addRecurringCommissionOverride', recurring_order_id,
                       affiliate_id, amount, payout_type, description)
      end

      # Adds a payment to an invoice without actually processing a charge through a merchant.
      #
      # @param [Integer] invoice_id
      # @param [Float] amount
      # @param [Date] date
      # @param [String] type Cash, Check, Credit Card, Money Order, PayPal, etc.
      # @param [String] description an area useful for noting payment details such as check number
      # @param [Boolean] bypass_commissions
      # @return [Boolean]
      def invoice_add_manual_payment(invoice_id, amount, date, type, description, bypass_commissions)
        response = get('InvoiceService.addManualPayment', invoice_id, amount, date, type,
                       description, bypass_commissions)
      end

      # This will create an invoice for all charges due on a Subscription. If the
      # subscription has three billing cycles that are due, it will create one
      # invoice with all three items attached.
      #
      # @param [Integer] recurring_order_id
      # @return [Integer] returns the id of the invoice that was created
      def invoice_create_invoice_for_recurring(recurring_order_id)
        response = get('InvoiceService.createInvoiceForRecurring', recurring_order_id)
      end

      # Adds a payment plan to an existing invoice.
      #
      # @param [Integer] invoice_id
      # @param [Boolean]
      # @param [Integer] credit_card_id
      # @param [Integer] merchant_account_id
      # @param [Integer] days_between_retry the number of days Infusionsoft should wait
      #   before re-attempting to charge a failed payment
      # @param [Integer] max_retry the maximum number of charge attempts
      # @param [Float] initial_payment_ammount the amount of the very first charge
      # @param [Date] initial_payment_date
      # @param [Date] plan_start_date
      # @param [Integer] number_of_payments the number of payments in this payplan (does not include
      #  initial payment)
      # @param [Integer] days_between_payments the number of days between each payment
      # @return [Boolean]
      def invoice_add_payment_plan(invoice_id, auto_charge, credit_card_id,
                                   merchant_account_id, days_between_retry, max_retry,
                                   initial_payment_amount, initial_payment_date, plan_start_date,
                                   number_of_payments, days_between_payments)
        response = get('InvoiceService.addPaymentPlan', invoice_id, auto_charge,
                       credit_card_id, merchant_account_id, days_between_retry, max_retry,
                       initial_payment_amount, initial_payment_date, plan_start_date, number_of_payments,
                       days_between_payments)
      end

      # Calculates the amount owed for a given invoice.
      #
      # @param [Integer] invoice_id
      # @return [Float]
      def invoice_calculate_amount_owed(invoice_id)
        response = get('InvoiceService.calculateAmountOwed', invoice_id)
      end

      # Retrieve all Payment Types currently setup under the Order Settings section of Infusionsoft.
      #
      # @return [Array]
      def invoice_get_all_payment_otpions
        response = get('InvoiceService.getAllPaymentOptions')
      end

      # Retrieves all payments for a given invoice.
      #
      # @param [Integer] invoice_id
      # @return [Array<Hash>] returns an array of payments
      def invoice_get_payments(invoice_id)
        response = get('Invoice.getPayments', invoice_id)
      end

      # Locates an existing card in the system for a contact, using the last 4 digits.
      #
      # @param [Integer] contact_id
      # @param [Integer] last_four
      # @return [Integer] returns the id of the credit card
      def invoice_locate_existing_card(contact_id, last_four)
        response = get('InvoiceService.locateExistingCard', contact_id, last_four)
      end

      # Calculates tax, and places it onto the given invoice.
      #
      # @param [Integer] invoice_id
      # @return [Boolean]
      def invoice_recalculate_tax(invoice_id)
        response = get('InvoiceService.recalculateTax', invoice_id)
      end

      # This will validate a credit card in the system.
      #
      # @param [Integer] credit_card_id if the card is already in the system
      # @return [Hash] returns a hash { 'Valid' => false, 'Message' => 'Card is expired' }
      def invoice_validate_card(credit_card_id)
        response = get('InvoiceService.validateCreditCard', credit_card_id)
      end

      # This will validate a credit card by passing in values of the
      # card directly (this card doesn't have to be added to the system).
      #
      # @param [Hash] data
      # @return [Hash] returns a hash { 'Valid' => false, 'Message' => 'Card is expired' }
      def invoice_validate_card(data)
        response = get('InvoiceService.validateCreditCard', data)
      end

      # Retrieves the shipping options currently setup for the Infusionsoft shopping cart.
      #
      # @return [Array]
      def invoice_get_all_shipping_options
        response = get('Invoice.getAllShippingOptions')
      end

      # Changes the next bill date on a subscription.
      #
      # @param [Integer] job_recurring_id this is the subscription id on the contact
      # @param [Date] next_bill_date
      # @return [Boolean]
      def invoice_update_recurring_next_bill_date(job_recurring_id, next_bill_date)
        response = get('InvoiceService.updateJobRecurringNextBillDate', job_recurring_id, next_bill_date)
      end

      # Adds a commission override to a one time order, using a combination of percentage
      # and hard-coded amounts.
      #
      # @param [Integer] invoice_id
      # @param [Integer] affiliate_id
      # @param [Integer] product_id
      # @param [Integer] percentage
      # @param [Float] amount
      # @param [Integer] payout_type how commision should be earned (4 - up front in full, 5 - upon
      #   customer payment
      # @param [String] description a note about this commission
      # @param [Date] date the commission was generated, not necessarily earned
      # @return [Boolean]
      def invoice_add_order_commission_override(invoice_id, affiliate_id, product_id, percentage,
                                                amount, payout_type, description, date)
        response = get('InvoiceService.addOrderCommissionOverride', invoice_id, affiliate_id,
                       product_id, percentage, amount, payout_type, description, date)
      end

      # Deprecated - Adds a recurring order to the database.
      def invoice_add_recurring_order_with_price(contact_id, allow_duplicate, cprogram_id, qty,
                                                 price, allow_tax, merchant_account_id,
                                                 credit_card_id, affiliate_id, days_till_charge)
        response = get('InvoiceService.addRecurringOrder', contact_id, allow_duplicate,
                       cprogram_id, qty, price, allow_tax, merchant_account_id, credit_card_id,
                       affiliate_id, days_till_charge)
      end

      # Deprecated - returns the invoice id from a one time order.
      def invoice_get_invoice_id(order_id)
        response = get('InvoiceService.getinvoice_id', order_id)
      end
    end
  end
end

module Infusionsoft
  class Client
    # The Invoice service allows you to manage eCommerce transactions.
    module Invoice
      # Creates a blank order with no items.
      #
      # @param [Integer] contact_id
      # @param [String] description the name this order will display
      # @param [Date] order_date
      # @param [Integer] lead_affiliate_id 0 should be used if none
      # @param [Integer] sale_affiliate_id 0 should be used if none
      # @return [Integer] returns the invoice id
      def invoice_create_blank_order(contact_id, description, order_date, lead_affiliate_id,
                                     sale_affiliate_id)
        response = get('InvoiceService.createBlankOrder', contact_id, description, order_date,
                        lead_affiliate_id, sale_affiliate_id)
      end

      # Adds a line item to an order. This used to add a Product to an order as well as
      # any other sort of charge/discount.
      #
      # @param [Integer] invoice_id
      # @param [Integer] product_id
      # @param [Integer] type  UNKNOWN = 0, SHIPPING = 1, TAX = 2, SERVICE = 3, PRODUCT = 4,
      #   UPSELL = 5, FINANCECHARGE = 6, SPECIAL = 7
      # @param [Float] price
      # @param [Integer] quantity
      # @param [String] description a full description of the line item
      # @param [String] notes
      # @return [Boolean] returns true/false if it was added successfully or not
      def invoice_add_order_item(invoice_id, product_id, type, price, quantity, description, notes)
        response = get('InvoiceService.addOrderItem', invoice_id, product_id, type, price,
                       quantity, description, notes)
      end

      # This will cause a credit card to be charged for the amount currently due on an invoice.
      #
      # @param [Integer] invoice_id
      # @param [String] notes a note about the payment
      # @param [Integer] credit_card_id
      # @param [Integer] merchant_account_id
      # @param [Boolean] bypass_commission
      # @return [Hash] containing the following keys {'Successful' => [Boolean],
      #   'Code' => [String], 'RefNum' => [String], 'Message' => [String]}
      def invoice_charge_invoice(invoice_id, notes, credit_card_id, merchant_account_id,
                                 bypass_commissions)
        response = get('InvoiceService.chargeInvoice', invoice_id, notes, credit_card_id,
                            merchant_account_id, bypass_commissions)
      end

      # Deletes the specified subscription from the database, as well as all invoices
      # tied to the subscription.
      #
      # @param [Integer] cprogram_id the id of the subscription being deleted
      # @return [Boolean]
      def invoice_delete_subscription(cprogram_id)
        response = get('InvoiceService.deleteSubscription', cprogram_id)
      end

      # Creates a subscription for a contact. Subscriptions are billing automatically
      # by infusionsoft within the next six hours. If you want to bill immediately you
      # will need to utilize the create_invoice_for_recurring and then
      # charge_invoice method to accomplish this.
      #
      # @param [Integer] contact_id
      # @param [Boolean] allow_duplicate
      # @param [Integer] cprogram_id the subscription id
      # @param [Integer] merchant_account_id
      # @param [Integer] credit_card_id
      # @param [Integer] affiliate_id
      # @param [Integer] days_till_charge number of days you want to wait till it's charged
      def invoice_add_recurring_order(contact_id, allow_duplicate, cprogram_id,
                                      merchant_account_id, credit_card_id, affiliate_id,
                                      days_till_charge)

        api_logger.warn "[DEPRECATION WARNING]: The invoice_add_subscription method more fully complies with Infusionsoft's published API documents. User is advised to review Infusionsoft's API and this gem's documentation for changes in parameters."

        response = get('InvoiceService.addRecurringOrder', contact_id,
                       allow_duplicate, cprogram_id, merchant_account_id, credit_card_id,
                       affiliate_id, days_till_charge)
      end

      ################### This is a replacement method for invoice_add_recurring_order
      # in order to fully support and comply with the Infusionsoft API documentation.
      #
      #
      # @param [Integer] contact_id
      # @param [Boolean] allow_duplicate
      # @param [Integer] cprogram_id the subscription id
      # @param [Integer] qty
      # @param [Float]   price
      # @param [Boolean] allow_tax
      # @param [Integer] merchant_account_id
      # @param [Integer] credit_card_id
      # @param [Integer] affiliate_id
      # @param [Integer] days_till_charge number of days you want to wait till it's charged

      def invoice_add_subscription(contact_id, allow_duplicate, cprogram_id,
                                      qty, price, allow_tax,
                                      merchant_account_id, credit_card_id, affiliate_id,
                                      days_till_charge)
        response = get('InvoiceService.addRecurringOrder', contact_id,
                       allow_duplicate, cprogram_id, qty, price, allow_tax, merchant_account_id, credit_card_id,
                       affiliate_id, days_till_charge)
      end

      # This modifies the commissions being earned on a particular subscription.
      # This does not affect previously generated invoices for this subscription.
      #
      # @param [Integer] recurring_order_id
      # @param [Integer] affiliate_id
      # @param [Float] amount
      # @param [Integer] paryout_type how commissions will be earned (possible options are
      #   4 - up front earning, 5 - upon customer payment) typically this is 5
      # @return [Boolean]
      def invoice_add_recurring_commission_override(recurring_order_id, affiliate_id,
                                                    amount, payout_type, description)
        response = get('InvoiceService.addRecurringCommissionOverride', recurring_order_id,
                       affiliate_id, amount, payout_type, description)
      end

      # Adds a payment to an invoice without actually processing a charge through a merchant.
      #
      # @param [Integer] invoice_id
      # @param [Float] amount
      # @param [Date] date
      # @param [String] type Cash, Check, Credit Card, Money Order, PayPal, etc.
      # @param [String] description an area useful for noting payment details such as check number
      # @param [Boolean] bypass_commissions
      # @return [Boolean]
      def invoice_add_manual_payment(invoice_id, amount, date, type, description, bypass_commissions)
        response = get('InvoiceService.addManualPayment', invoice_id, amount, date, type,
                       description, bypass_commissions)
      end

      # This will create an invoice for all charges due on a Subscription. If the
      # subscription has three billing cycles that are due, it will create one
      # invoice with all three items attached.
      #
      # @param [Integer] recurring_order_id
      # @return [Integer] returns the id of the invoice that was created
      def invoice_create_invoice_for_recurring(recurring_order_id)
        response = get('InvoiceService.createInvoiceForRecurring', recurring_order_id)
      end

      # Adds a payment plan to an existing invoice.
      #
      # @param [Integer] invoice_id
      # @param [Boolean]
      # @param [Integer] credit_card_id
      # @param [Integer] merchant_account_id
      # @param [Integer] days_between_retry the number of days Infusionsoft should wait
      #   before re-attempting to charge a failed payment
      # @param [Integer] max_retry the maximum number of charge attempts
      # @param [Float] initial_payment_ammount the amount of the very first charge
      # @param [Date] initial_payment_date
      # @param [Date] plan_start_date
      # @param [Integer] number_of_payments the number of payments in this payplan (does not include
      #  initial payment)
      # @param [Integer] days_between_payments the number of days between each payment
      # @return [Boolean]
      def invoice_add_payment_plan(invoice_id, auto_charge, credit_card_id,
                                   merchant_account_id, days_between_retry, max_retry,
                                   initial_payment_amount, initial_payment_date, plan_start_date,
                                   number_of_payments, days_between_payments)
        response = get('InvoiceService.addPaymentPlan', invoice_id, auto_charge,
                       credit_card_id, merchant_account_id, days_between_retry, max_retry,
                       initial_payment_amount, initial_payment_date, plan_start_date, number_of_payments,
                       days_between_payments)
      end

      # Calculates the amount owed for a given invoice.
      #
      # @param [Integer] invoice_id
      # @return [Float]
      def invoice_calculate_amount_owed(invoice_id)
        response = get('InvoiceService.calculateAmountOwed', invoice_id)
      end

      # Retrieve all Payment Types currently setup under the Order Settings section of Infusionsoft.
      #
      # @return [Array]
      def invoice_get_all_payment_otpions
        response = get('InvoiceService.getAllPaymentOptions')
      end

      # Retrieves all payments for a given invoice.
      #
      # @param [Integer] invoice_id
      # @return [Array<Hash>] returns an array of payments
      def invoice_get_payments(invoice_id)
        response = get('Invoice.getPayments', invoice_id)
      end

      # Locates an existing card in the system for a contact, using the last 4 digits.
      #
      # @param [Integer] contact_id
      # @param [Integer] last_four
      # @return [Integer] returns the id of the credit card
      def invoice_locate_existing_card(contact_id, last_four)
        response = get('InvoiceService.locateExistingCard', contact_id, last_four)
      end

      # Calculates tax, and places it onto the given invoice.
      #
      # @param [Integer] invoice_id
      # @return [Boolean]
      def invoice_recalculate_tax(invoice_id)
        response = get('InvoiceService.recalculateTax', invoice_id)
      end

      # This will validate a credit card in the system.
      #
      # @param [Integer] credit_card_id if the card is already in the system
      # @return [Hash] returns a hash { 'Valid' => false, 'Message' => 'Card is expired' }
      def invoice_validate_card(credit_card_id)
        response = get('InvoiceService.validateCreditCard', credit_card_id)
      end

      # This will validate a credit card by passing in values of the
      # card directly (this card doesn't have to be added to the system).
      #
      # @param [Hash] data
      # @return [Hash] returns a hash { 'Valid' => false, 'Message' => 'Card is expired' }
      def invoice_validate_card(data)
        response = get('InvoiceService.validateCreditCard', data)
      end

      # Retrieves the shipping options currently setup for the Infusionsoft shopping cart.
      #
      # @return [Array]
      def invoice_get_all_shipping_options
        response = get('Invoice.getAllShippingOptions')
      end

      # Changes the next bill date on a subscription.
      #
      # @param [Integer] job_recurring_id this is the subscription id on the contact
      # @param [Date] next_bill_date
      # @return [Boolean]
      def invoice_update_recurring_next_bill_date(job_recurring_id, next_bill_date)
        response = get('InvoiceService.updateJobRecurringNextBillDate', job_recurring_id, next_bill_date)
      end

      # Adds a commission override to a one time order, using a combination of percentage
      # and hard-coded amounts.
      #
      # @param [Integer] invoice_id
      # @param [Integer] affiliate_id
      # @param [Integer] product_id
      # @param [Integer] percentage
      # @param [Float] amount
      # @param [Integer] payout_type how commision should be earned (4 - up front in full, 5 - upon
      #   customer payment
      # @param [String] description a note about this commission
      # @param [Date] date the commission was generated, not necessarily earned
      # @return [Boolean]
      def invoice_add_order_commission_override(invoice_id, affiliate_id, product_id, percentage,
                                                amount, payout_type, description, date)
        response = get('InvoiceService.addOrderCommissionOverride', invoice_id, affiliate_id,
                       product_id, percentage, amount, payout_type, description, date)
      end

      # adding a manual payment for an invoice.
      # This can be useful when the payments are not handled by Infusionsoft
      # but you still needs to makethe invoice as paid
      #
      # @param [Integer] invoice_id
      # @param [Float] amount
      # @param [Date] date (time)
      # @param [String] payment_type
      #        - E.g 'Credit Card'
      # @param [String] description
      # @param [Boolean] bypass_commissions (Whether this payment
      #                  should count towards affiliate commissions.)

      def add_manual_payment(invoice_id, amount, date, payment_type, description, bypass_commission)
        response = get('InvoiceService.addManualPayment', invoice_id, amount,
                       date, payment_type, description, bypass_commission)
      end

      # Deprecated - Adds a recurring order to the database.
      def invoice_add_recurring_order_with_price(contact_id, allow_duplicate, cprogram_id, qty,
                                                 price, allow_tax, merchant_account_id,
                                                 credit_card_id, affiliate_id, days_till_charge)
        response = get('InvoiceService.addRecurringOrder', contact_id, allow_duplicate,
                       cprogram_id, qty, price, allow_tax, merchant_account_id, credit_card_id,
                       affiliate_id, days_till_charge)
      end

      # Deprecated - returns the invoice id from a one time order.
      def invoice_get_invoice_id(order_id)
        response = get('InvoiceService.getinvoice_id', order_id)
      end
    end
  end
end


<?php
/**
 * @licence http://www.opensource.org/licenses/bsd-license.php New BSD Licence
 * @author Øystein Riiser Gundersen <oysteinrg@gmail.com>
 */

/**
 * A SwiftMailer transport implementation for the
 * {@link http://postmarkapp.com/ Postmark} email delivery API for transactional
 * email.
 *
 * Postmark is *not* for bulk email, but multiple recipients are still supported
 * by posting the email once for each address.
 *
 * Bcc and Cc headers are silently ignored as these are not supported by Postmark.
 *
 * Usage:
 * <code>
 *    $transport = Swift_PostmarkTransport::newInstance('YOUR-POSTMARK-API-KEY')
 *    $mailer = Swift_Mailer::newInstance($transport);
 *    $message = Swift_Message::newInstance('Wonderful Subject')
 *      ->setFrom(array('sender@mydomain.com' => 'John Doe'))
 *      ->setTo(array('receiver@otherdomain.org' => 'Jane Doe'))
 *      ->setBody('Here is the message itself');
 *    $mailer->send($message);
 * </code>
 *
 * @package Swift
 * @subpackage Postmark
 */
class Swift_PostmarkTransport implements Swift_Transport {

	/**  @var string */
	const POSTMARK_URI = 'http://api.postmarkapp.com/email';

	/** @var string */
	protected $postmark_api_token = NULL;

	/** @var array */
	protected $IGNORED_HEADERS = array('Content-Type', 'Date');

	/** @var array */
	protected $UNSUPPORTED_HEADERS = array('Bcc', 'Cc');

	/**
	 * @param string $postmark_api_token Postmark API key
	 * @param string|array $from Postmark sender signature email
	 * @param string $postmark_uri Postmark HTTP service URI
	 */
	public function __construct($postmark_api_token, $from = NULL, $postmark_uri = NULL) {
		$this->postmark_api_token = $postmark_api_token;
		$this->postmark_uri = is_null($postmark_uri) ? self::POSTMARK_URI : $postmark_uri;
		$this->postmark_from_signature = $from;
	}

	public static function newInstance($postmark_api_token, $from = NULL, $postmark_uri = NULL) {
		return new Swift_PostmarkTransport($postmark_api_token, $from, $postmark_uri);
	}

  	public function isStarted() { return false; }
	public function start() { }
	public function stop() { }

	/**
	 * @param Swift_Mime_Message $message
	 * @param string $mime_type
	 * @return Swift_Mime_MimePart
	 */
	protected function getMIMEPart(Swift_Mime_Message $message, $mime_type) {
		$html_part = NULL;
		foreach ($message->getChildren() as $part) {
			if (strpos($part->getContentType(), 'text/html') === 0)
				$html_part = $part;
		}
		return $html_part;
	}

	/**
	 * @param Swift_Mime_Message $message
	 * @param string $mime_type
	 * @return Swift_Mime_Message
	 */
	protected function processHeaders(Swift_Mime_Headerset $headers) {
		foreach ($this->IGNORED_HEADERS as $header_name)
			$headers->remove($header_name);

		foreach ($this->UNSUPPORTED_HEADERS as $header_name)
			if ($headers->has($header_name))
				throw new Swift_PostmarkTransportException(
					"Postmark does not support the '{$header_name}' header"
				);

		return $headers;
	}

	/**
	 * @param Swift_Mime_Message $message
	 * @param string $mime_type
	 * @return array
	 */
	protected function buildMessageData(Swift_Mime_Message $message) {
		$headers = $this->processHeaders($message->getHeaders());

		$message_data = array();

		$message_data['Subject'] = $headers->get('Subject')->getFieldBody();
		$headers->remove('Subject');

		$message_data['From'] = $headers->get('From')->getFieldBody();
		$headers->remove('From');

		$message_data['ReplyTo'] = $message->getReplyTo();
		$message_data['TextBody'] = $message->getBody();

		if (!is_null($html_part = $this->getMIMEPart($message, 'text/html')))
			$message_data['HtmlBody'] = $html_part->getBody();

		$extra_headers = array();
		foreach ($headers as $header) {
			$extra_headers[] = array(
				'Name' => $header->getFieldName(),
				'Value' => $header->getFieldBody()
			);
		}

		if (!empty($extra_headers))
			$message_data['Headers'] = $extra_headers;

		return $message_data;
	}

	/**
	 * @return array
	 */
	protected function headers() {
		return array(
			'Accept: application/json',
			'Content-Type: application/json',
			'X-Postmark-Server-Token: ' . $this->postmark_api_token
		);
	}

	/**
	 * @param array $message_data
	 * @return array
	 */
	protected function post(array $message_data) {
		$curl = curl_init();
		curl_setopt_array($curl, array(
			CURLOPT_URL => self::POSTMARK_URI,
			CURLOPT_POST => true,
			CURLOPT_HTTPHEADER => $this->headers(),
			CURLOPT_POSTFIELDS => json_encode($message_data),
			CURLOPT_RETURNTRANSFER => true
		));

		$response = curl_exec($curl);
		if ($response === false)
			$this->fail('Postmark delivery failed: ' . curl_error($curl));

		$response_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
		return array($response_code, @json_decode($response, true));
	}

	protected function fail($message) {
		throw new Swift_TransportException($message);
	}

	/**
	 * @param Swift_Mime_Message $message
	 * @param array $failed_recipients
	 * @return int
	 */
	public function send(Swift_Mime_Message $message, &$failed_recipients = NULL) {
		if (!is_null($this->postmark_from_signature))
			$message->setFrom($this->postmark_from);

		$failed_recipients = (array)$failed_recipients;
   		$message_data = $this->buildMessageData($message);

		$send_count = 0;
		$recipients = $message->getHeaders()->get('To');
		$addresses = $recipients->getAddresses();

		foreach ($recipients->getNameAddressStrings() as $i => $recipient) {

			$message_data['To'] = $recipient;
			list($response_code, $response) = $this->post($message_data);

			if ($response_code != 200) {
				$failed_recipients[] = $addresses[$i];

				$this->fail(
					"Postmark delivery failed with HTTP status code {$response_code}. " .
					"Postmark said: '{$response['Message']}'"
				);

			} else {
				$send_count++;
			}
		}
		return $send_count;
	}

	public function registerPlugin(Swift_Events_EventListener $plugin) {
		// TODO
	}
}

<?php
/**
 * @licence http://www.opensource.org/licenses/bsd-license.php New BSD Licence
 * @author Øystein Riiser Gundersen <oysteinrg@gmail.com>
 */

/**
 * A SwiftMailer transport implementation for the
 * {@link http://postmarkapp.com/ Postmark} email delivery API for transactional
 * email.
 *
 * Postmark is *not* for bulk email, but multiple recipients are still supported
 * by posting the email once for each address.
 *
 * Bcc and Cc headers are silently ignored as these are not supported by Postmark.
 *
 * Usage:
 * <code>
 *    $transport = Swift_PostmarkTransport::newInstance('YOUR-POSTMARK-API-KEY')
 *    $mailer = Swift_Mailer::newInstance($transport);
 *    $message = Swift_Message::newInstance('Wonderful Subject')
 *      ->setFrom(array('sender@mydomain.com' => 'John Doe'))
 *      ->setTo(array('receiver@otherdomain.org' => 'Jane Doe'))
 *      ->setBody('Here is the message itself');
 *    $mailer->send($message);
 * </code>
 *
 * @package Swift
 * @subpackage Postmark
 */
class Swift_PostmarkTransport implements Swift_Transport {

	/**  @var string */
	const POSTMARK_URI = 'http://api.postmarkapp.com/email';

	/** @var string */
	protected $postmark_api_token = NULL;

	/** @var array */
	protected $IGNORED_HEADERS = array('Content-Type', 'Date');

	/** @var array */
	protected $UNSUPPORTED_HEADERS = array();

	/**
	 * @param string $postmark_api_token Postmark API key
	 * @param string|array $from Postmark sender signature email
	 * @param string $postmark_uri Postmark HTTP service URI
	 */
	public function __construct($postmark_api_token, $from = NULL, $postmark_uri = NULL) {
		$this->postmark_api_token = $postmark_api_token;
		$this->postmark_uri = is_null($postmark_uri) ? self::POSTMARK_URI : $postmark_uri;
		$this->postmark_from_signature = $from;
	}

	public static function newInstance($postmark_api_token, $from = NULL, $postmark_uri = NULL) {
		return new Swift_PostmarkTransport($postmark_api_token, $from, $postmark_uri);
	}

  	public function isStarted() { return false; }
	public function start() { }
	public function stop() { }

	/**
	 * @param Swift_Mime_Message $message
	 * @param string $mime_type
	 * @return Swift_Mime_MimePart
	 */
	protected function getMIMEPart(Swift_Mime_Message $message, $mime_type) {
		$html_part = NULL;
		foreach ($message->getChildren() as $part) {
			if (strpos($part->getContentType(), 'text/html') === 0)
				$html_part = $part;
		}
		return $html_part;
	}

	/**
	 * @param Swift_Mime_Message $message
	 * @param string $mime_type
	 * @return Swift_Mime_Message
	 */
	protected function processHeaders(Swift_Mime_Headerset $headers) {
		foreach ($this->IGNORED_HEADERS as $header_name)
			$headers->remove($header_name);

		foreach ($this->UNSUPPORTED_HEADERS as $header_name)
			if ($headers->has($header_name))
				throw new Swift_PostmarkTransportException(
					"Postmark does not support the '{$header_name}' header"
				);

		return $headers;
	}

	/**
	 * @param Swift_Mime_Message $message
	 * @param string $mime_type
	 * @return array
	 */
	protected function buildMessageData(Swift_Mime_Message $message) {
		$headers = $this->processHeaders($message->getHeaders());

		$message_data = array();

		$message_data['Subject'] = $headers->get('Subject')->getFieldBody();
		$headers->remove('Subject');

		$message_data['From'] = $headers->get('From')->getFieldBody();
		$headers->remove('From');

		$message_data['ReplyTo'] = $message->getReplyTo();
		$message_data['TextBody'] = $message->getBody();

		if (!is_null($html_part = $this->getMIMEPart($message, 'text/html')))
			$message_data['HtmlBody'] = $html_part->getBody();

		$extra_headers = array();
		foreach ($headers as $header) {
			$extra_headers[] = array(
				'Name' => $header->getFieldName(),
				'Value' => $header->getFieldBody()
			);
		}

		if (!empty($extra_headers))
			$message_data['Headers'] = $extra_headers;

		$children = $message->getChildren();

		$attachments = array();
		foreach ($children as $child) {
			if (get_class($child) == 'Swift_Attachment'){
				$attachments[] = array (

					'Name' => $child->getFilename(),
					'Content' => base64_encode($child->getBody()),
					'ContentType' => $child->getContentType()
				);
			}
		}
		$message_data['Attachments'] = $attachments;

		return $message_data;

	}

	/**
	 * @return array
	 */
	protected function headers() {
		return array(
			'Accept: application/json',
			'Content-Type: application/json',
			'X-Postmark-Server-Token: ' . $this->postmark_api_token
		);
	}

	/**
	 * @param array $message_data
	 * @return array
	 */
	protected function post(array $message_data) {
		$curl = curl_init();
		curl_setopt_array($curl, array(
			CURLOPT_URL => self::POSTMARK_URI,
			CURLOPT_POST => true,
			CURLOPT_HTTPHEADER => $this->headers(),
			CURLOPT_POSTFIELDS => json_encode($message_data),
			CURLOPT_RETURNTRANSFER => true
		));

		$response = curl_exec($curl);
		if ($response === false)
			$this->fail('Postmark delivery failed: ' . curl_error($curl));

		$response_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
		return array($response_code, @json_decode($response, true));
	}

	protected function fail($message) {
		throw new Swift_TransportException($message);
	}

	/**
	 * @param Swift_Mime_Message $message
	 * @param array $failed_recipients
	 * @return int
	 */
	public function send(Swift_Mime_Message $message, &$failed_recipients = NULL) {
		if (!is_null($this->postmark_from_signature))
			$message->setFrom($this->postmark_from);

		$failed_recipients = (array)$failed_recipients;
   		$message_data = $this->buildMessageData($message);

		$send_count = 0;
		$recipients = $message->getHeaders()->get('To');
		$addresses = $recipients->getAddresses();

		foreach ($recipients->getNameAddressStrings() as $i => $recipient) {

			$message_data['To'] = $recipient;
			list($response_code, $response) = $this->post($message_data);

			if ($response_code != 200) {
				$failed_recipients[] = $addresses[$i];

				$this->fail(
					"Postmark delivery failed with HTTP status code {$response_code}. " .
					"Postmark said: '{$response['Message']}'"
				);

			} else {
				$send_count++;
			}
		}
		return $send_count;
	}

	public function registerPlugin(Swift_Events_EventListener $plugin) {
		// TODO
	}
}


<?php

	$about = array(
		'name' => 'Deutsch',
		'author' => array(
			'name' => 'Nils Hörrmann',
			'email' => 'post@nilshoerrmann.de',
			'website' => 'http://www.nilshoerrmann.de'
		),
		'release-date' => '2010-02-09',
	);

	/**
	 * Symphony Core
	 */
	$dictionary = array(

		'"%1$s" contains invalid XML. The following error was returned: %2$s' =>
		'"%1$s" enthält ungültiges XML. Der folgende Fehler wurde zurückgegeben: %2$s',

		'%1$s – %2$s' =>
		'%1$s – %2$s',

		'%1$s – %2$s – %3$s' =>
		'%1$s – %2$s – %3$s',

		'%1$s Allow remote login via %2$s' =>
		'%1$s Remotezugriff über %2$s erlauben',

		'%s Allow selection of multiple authors' =>
		'%s Erlaube Auswahl mehrerer Autoren.',

		'%s Allow selection of multiple options' =>
		'%s Erlaube Mehrfachauswahl.',

		'%s Checked by default' =>
		'%s Standardmäßig ausgewählt.',

		'%s Hide this section from the Publish menu' =>
		'%s Diesen Bereich nicht im Menü anzeigen.',

		'%s HTML-encode text' =>
		'%s Ausgabe HTML-konform kodieren.',

		'%s is not a valid object. Failed to append to XML.' =>
		'%s ist kein gültiges Objekt. Es konnte dem XML nicht hinzugefügt werden.',

		'%s Make this a required field' =>
		'%s Dieses Feld verpflichtend machen.',

		'%s Redirect to 404 page when no results are found' =>
		'%s Auf 404-Fehlerseite umleiten, wenn keine Ergebnisse gefunden werden können.',

		'%s Select current user by default' =>
		'%s Den aktuellen Benutzer vorauswählen',

		'%s Show column' =>
		'%s In der Übersicht anzeigen',

		'← Previous' =>
		'← Vorherige',

		'\'%s\' contains invalid data. Please check the contents.' =>
		'\'%s\' enthält ungültige Daten. Bitte überprüfen Sie den Inhalt.',

		'\'%s\' is a required field.' =>
		'\'%s\' ist ein Pflichtfeld.',

		' (Notice that it is possible to get mixtures of success and failure messages when using the "Allow Multiple" option)' =>
		' (Bitte beachten Sie, dass Sie möglicherweise eine Mischung aus Fehler- und Erfolgsrückmeldungen erhalten, wenn Sie die die Erstellung mehrerer Einträge zulassen.)',

		'XSLT Processor' =>
		'XSLT-Prozessor',

		'PHP 5.1 or above' =>
		'PHP 5.1 oder höher',

		'<acronym title="Universal Resource Locator">URL</acronym>' =>
		'<acronym title="Universal Resource Locator">URL</acronym>',

		'<acronym title="Universal Resource Locator">URL</acronym> Parameters' =>
		'<acronym title="Universal Resource Locator">URL-</acronym>Parameter',

		'Line %3$d' =>
		'Zeile %3$d',

		'Compile' =>
		'Kompiliere',

		'A 403 type page already exists.' =>
		'Es existiert bereits eine 403-Fehlerseite.',

		'A 404 type page already exists.' =>
		'Es existiert bereits eine 404-Fehlerseite.',

		'Aardvarks' =>
		'Erdferkel',

		'about 1 hour ago' =>
		'vor etwa einer Stunde',

		'about {$hours} hours ago' =>
		'vor etwa {$hours} Stunden',

		'Access Denied' =>
		'Zugriff verweigert',

		'A database error occurred while attempting to reorder.' =>
		'Beim Neuordnen ist ein Datenbankfehler aufgetreten.',

		'A Data source with the name %s name already exists' =>
		'Eine Datenquelle mit dem Namen %s existiert bereits',

		'Add an Author' =>
		'Autor hinzufügen',

		'Add a new author' =>
		'Neuen Autor hinzufügen',

		'Add item' =>
		'Hinzufügen',

		'Admin Only' =>
		'Nur Administratoren',

		'Advanced Configuration' =>
		'Erweiterte Einstellungen',

		'A field with that element name already exists. Please choose another.' =>
		'Ein Feld mit diesem Elementnamen existiert bereits. Bitte wählen Sie einen anderen.',

		'A file with the name %1$s already exists in %2$s. Please rename the file first, or choose another.' =>
		'Eine Datei mit dem Namen %1$s existiert bereits in %2$s. Bitte benennen Sie die Datei zuerst um oder wähle Sie eine andere.',

		'All of these fields can be set dynamically using the exact field name of another field in the form as shown below in the example form:' =>
		'Alle diese Felder können dynamisch befüllt werden, indem Sie den genauen Feldnamen eines anderen Feldes des Formulares verwenden, wie das nachfolgende Beispiel zeigt:',

		'Allow Multiple' =>
		'Mehrere zulassen',

		'a minute ago' =>
		'vor einer Minute',

		'An email containing a customised login link has been sent. It will expire in 2 hours.' =>
		'Eine E-Mail mit personalisierten Anmeldedaten wurden verschickt. Sie verliert in zwei Stunden ihre Gültigkeit.',

		'An empty result will be returned when this parameter does not have a value. Do not wrap the parameter with curly-braces.' =>
		'Wenn dieser Parameter keinen Wert hat, wird ein leeres Ergebnis ausgegeben. Umschließen Sie den Parameter nicht mit geschweiften Klammern.',

		'An error occurred during installation. You can view you log here for more details.' =>
		'Während der Installation ist ein Fehler aufgetreten. Sie können das Installation-Logbuch</> für weitere Informationen einsehen.',

		'An error occurred while processing this form. See below for details.' =>
		'Beim Verarbeiten dieses Formulars ist ein Fehler aufgetreten. Details siehe unten.',

		'An Event with the name %s name already exists' =>
		'Ein Ereignis mit dem Namen %s existiert bereits',

		'A new password has been requested for your account. Login using the following link, and change your password via the Authors area:' =>
		'Ein neues Passwort wurde für Ihren Zugang angefordert. Sie können sich anmelden, indem Sie nachfolgendem Link folgen, und dann Ihr Passwort im Autorenbereich ändern:',

		'An existing /workspace directory was found at this location. Symphony will use this workspace.' =>
		'An diesem Ort wurde ein bereits existierendes /workspace-Verzeichnis gefunden. Symphony wird diesen Workspace verwenden.',

		'An index type page already exists.' =>
		'Es existiert bereits eine Index-Seite.',

		'An unknown database occurred while attempting to create the section.' =>
		'Es ist ein unbekannter Datenbankfehler beim Erstellen des Bereiches aufgetreten.',

		'A page number must be set' =>
		'Eine Seitenzahl muss festgelegt werden',

		'A page with that handle already exists' =>
		'Es existiert bereits eine Seite mit diesem Bezeichner.',

		'A page with that title already exists' =>
		'Es existiert bereits eine Seite mit diesem Titel.',

		'Apply' =>
		'Anwenden',

		'A result limit must be set' =>
		'Eine Ergebnisobergrenze muss festgelegt werden',

		'Are you sure you want to {$action}?' =>
		'Sind Sie sicher, dass Sie {$action} wollen?',

		'Are you sure you want to {$action} {$count} items?' =>
		'Sind Sie sicher, dass sie {$count} Einträge {$action} wollen?',

		'Are you sure you want to {$action} {$name}?' =>
		'Sind Sie sicher, dass sie {$name} {$action} wollen?',

		'ascending' =>
		'aufsteigend',

		'A Section with the name %s name already exists' =>
		'Es existiert bereits ein Bereich mit dem Namen %s',

		'at' =>
		'um',

		'At least one source must be specified, dynamic or static.' =>
		'Mindestens eine Quelle, dynamisch oder statisch, muss festgelegt werden.',

		'Author' =>
		'Autor',

		'Author created at %1$s. Create another? View all Authors' =>
		'Der Autor wurde um %1$s erstellt. Einen neuen erstellen? Alle Autoren anzeigen.',

		'Author ID' =>
		'Autor-ID',

		'Authors' =>
		'Autoren',

		'authors' =>
		'autoren',

		'Author updated at %1$s. Create another? View all Authors' =>
		'Der Autor wurde um %1$s aktualisiert. Einen neuen erstellen? Alle Autoren anzeigen.',

		'A Utility with that name already exists. Please choose another.' =>
		'Es existiert bereits ein Baustein mit dem namen %s.',

		'Best Regards,' =>
		'Mit freundlichen Grüßen,',

		'Big' =>
		'Dick',

		'Birds' =>
		'Vögel',

		'Blueprints' =>
		'Blaupausen',

		'Body' =>
		'Daten',

		'Body is a required field.' =>
		'Der Datenbereich ist ein Pflichtfeld.',

		'Bugs' =>
		'Käfer',

		'Can\'t open file %s' =>
		'Datei %s konnte nicht geöffnet werden',

		'Cats' =>
		'Katze',

		'Change Password' =>
		'Passwort ändern',

		'Checkbox' =>
		'Kontrollkästchen',

		'Coconut' =>
		'Kokosnuss',

		'Cold' =>
		'Kalt',

		'Components' =>
		'Komponenten',

		'Confirm New Password' =>
		'Neues Passwort wiederholen',

		'Confirm Password' =>
		'Passwort wiederholen',

		'Could not %1$s %2$s, there was a problem loading the object. Check the driver class exists.' =>
		'%s konnte aufgrund eines Problems beim Laden des Objektes nicht %1$s werden. Überprüfen Sie, ob die Treiberklasse existiert.',

		'Could not add directory "%s".' =>
		'Das Verzeichnis "%s" konnte nicht hinzugefügt werden.',

		'Could not add file "%s".' =>
		'Die Datei "%s" konnte nicht hinzugefügt werden.',

		'Could not find Data Source %s. If the Data Source was provided by an Extensions, ensure that it is installed, and enabled.' =>
		'Die Datenquelle %s konnte nicht gefunden werden. Wenn diese Datenquelle von einer Erweiterung bereitgestellt wurde, überprüfen Sie, dass diese installiert und aktiviert ist.',

		'Could not find Event %s. If the Event was provided by an Extensions, ensure that it is installed, and enabled.' =>
		'Das Ereignis %s konnte nicht gefunden werden. Wenn dieses Ereignis von einer Erweiterung bereitgestellt wurde, überprüfen Sie, dass diese installiert und aktiviert ist.',

		'Could not find extension at location %s' =>
		'Die Erweiterung konnte nicht unter %s gefunden werden.',

		'Could not find Field %1$s at %2$s. If the Field was provided by an Extension, ensure that it is installed, and enabled.' =>
		'Das Feld %1$s konnte nicht unter %2$s gefunden werden. Wenn dieses Feld von einer Erweiterung bereitgestellt wurde, überprüfen Sie, dass diese installiert und aktiviert ist.',

		'Could not find Text Formatter %s. If the Text Formatter was provided by an Extensions, ensure that it is installed, and enabled.' =>
		'Der Textformatierer %s konnte nicht gefunden werden. Wenn der Textformatierer von einer Erweiterung bereitgestellt wurde, überprüfen Sie, dass diese installiert und aktiviert ist.',

		'Create a new data source' =>
		'Neue Datenquelle erstellen',

		'Create a new entry' =>
		'Neuen Eintrag erstellen',

		'Create a new event' =>
		'Neues Ereignis erstellen',

		'Create a new page' =>
		'Neue Seite erstellen',

		'Create a new utility' =>
		'Neuen Baustein erstellen',

		'Create a section' =>
		'Bereich erstellen',

		'Create Author' =>
		'Autor erstellen',

		'Create Data Source' =>
		'Datenquelle erstellen',

		'Create Entry' =>
		'Eintrag erstellen',

		'Create Event' =>
		'Ereignis erstellen',

		'Create New' =>
		'Neu erstellen',

		'Create Page' =>
		'Seite erstellen',

		'Create Utility' =>
		'Baustein erstellen',

		'Customise how Date and Time values are displayed throughout the Administration interface.' =>
		'Passen Sie an, wie Datums- und Zeitangaben innerhalb des Administrationsbereichs dargestellt werden.',

		'Custom XML' =>
		'Benutzerdefiniertes XML',

		'Database' =>
		'Datenbank',

		'Database Connection' =>
		'Datenbankverbindung',

		'Database Error' =>
		'Datenbankfehler',

		'Data retrieved from the Symphony support server is decompressed with the ZLib compression library.' =>
		'Daten, die vom Symphony-Supportserver empfangen werden, werden mit der ZLib-Kompression-Bibliothek dekomprimiert.',

		'Data Source' =>
		'Datenquelle',

		'Data source output grouping is not supported by the %s field' =>
		'Ergebnisgruppierung für Datenquellen wird vom Feld %s nicht unterstützt',

		'Data Sources' =>
		'Datenquellen',

		'Date' =>
		'Datum',

		'Date and Time' =>
		'Datum und Zeit',

		'Date Format' =>
		'Datumsformat',

		'Dear ,' =>
		'Liebe(r) ,',

		'Default Section' =>
		'Standardbereich',

		'Delete' =>
		'Löschen',

		'Delete Entries' =>
		'Einträge löschen',

		'Delete this author' =>
		'Diesen Autor löschen',

		'Delete this data source' =>
		'Diese Datenquelle löschen',

		'Delete this entry' =>
		'Diesen Eintrag löschen',

		'Delete this event' =>
		'Dieses Ereignis löschen',

		'Delete this page' =>
		'Diese Seite löschen',

		'Delete this section' =>
		'Diesen Bereich löschen',

		'Delete this utility' =>
		'Diesen Baustein löschen',

		'descending' =>
		'absteigend',

		'Description' =>
		'Beschreibung',

		'Destination Directory' =>
		'Zielordner',

		'Destination folder, %s, is not writable. Please check permissions.' =>
		'Das Zielverzeichnis %s ist nicht beschreibbar. Bitte überprüfen Sie die Zugriffsrechte.',

		'Developer' =>
		'Entwickler',

		'Directories' =>
		'Verzeichnisse',

		'Disable' =>
		'Deaktivieren',

		'Dogs' =>
		'Hunde',

		'Dynamic Options' =>
		'Dynamische Optionen',

		'Dynamic XML' =>
		'Dynamisches XML',

		'dynamic_xml' =>
		'dynamisches_xml',

		'E-mail address entered is invalid' =>
		'Die eingegebene E-Mail-Adresse ist ungültig',

		'E-mail address is required' =>
		'Die E-Mail-Adresse ist eine Pflichtangabe',

		'Edit' =>
		'Bearbeiten',

		'Email' =>
		'E-Mail',

		'Email Address' =>
		'E-Mail-Adresse',

		'Enable' =>
		'Aktivieren',

		'Enabled' =>
		'Aktiviert',

		'Encumbered' =>
		'belastet',

		'Enter your email address to be sent a remote login link with further instructions for logging in.' =>
		'Geben Sie Ihre E-Mail-Adresse an, um einen Link mit weiteren Erläuterungen zur Anmeldung zugesandt zu bekommen.',

		'Entries' =>
		'Einträge',

		'Entry created at %1$s. Create another? View all Entries' =>
		'Der Eintrag wurde um %1$s erstellt. Einen neuen erstellen? Alle Einträge anzeigen.',

		'Entry created successfully.' =>
		'Eintrag erfolgreich erstellt.',

		'Entry edited successfully.' =>
		'Eintrag erfolgreich bearbeitet.',

		'Entry encountered errors when saving.' =>
		'Beim Speichern des Eintrags sind Fehler aufgetreten.',

		'Entry limit specified was not a valid type. String or Integer expected.' =>
		'Die festgelegte Obergrenze entspricht keinem gültigen Typ. String oder Integer erwartet. ',

		'Entry updated at %1$s. Create another? View all Entries' =>
		'Dieser Eintrag wurde um %1$s aktualisiert. Einen neuen erstellen? Alle Einträge anzeigen.',

		'Entry [created | edited] successfully.' =>
		'Eintrag erfolgreich [erstellt | bearbeitet].',

		'Environment Settings' =>
		'Umgebungseinstellungen',

		'Error creating field object with id %1$d, for filtering in data source "%2$s". Check this field exists.' =>
		'Beim Erstellen des Feld-Objekts mit der ID %1sd, das zum Filter der Datenquelle "%2$s" verwendet wird, ist ein Fehler aufgetreten. Überprüfen Sie, ob das Feld existiert.',

		'Essentials' =>
		'Grundangaben',

		'Event created at %1$s. Create another? View all Events' =>
		'Dieses Ereignis wurde um %1$s erstellt. Ein neues erstellen? Alle Ereignisse anzeigen.',

		'Events' =>
		'Ereignisse',

		'Event updated at %1$s. Create another? View all Events' =>
		'Dieses Ereignis wurde um %1$s aktualisiert. Ein neues erstellen? Alle Ereignisse anzeigen.',

		'Example Front-end Form Markup' =>
		'Beispiel-Frontend-Formular',

		'Existing Values' =>
		'Existierende Werte',

		'Extensions' =>
		'Erweiterungen',

		'Failed to delete %s. Please check permissions.' =>
		'%s konnte nicht gelöscht werden. Bitte überprüfen Sie die Zugriffsrechte.',

		'Failed to write Data source to %s. Please check permissions.' =>
		'Datenquelle konnte nicht unter %s gespeichert werden. Bitte überprüfen Sie die Zugriffsrechte.',

		'Failed to write Event to %s. Please check permissions.' =>
		'%s konnte nicht gespeichert werden. Bitte überprüfen Sie die Zugriffsrechte.',

		'Fields' =>
		'Felder',

		'File chosen in "%1$s" exceeds the maximum allowed upload size of %2$s, specified by Symphony.' =>
		'Die gewählte Datei überschreitet die für Symphony festgelegte maximale Uploadgröße von %2$s.',

		'File chosen in "%1$s" exceeds the maximum allowed upload size of %2$s specified by your host.' =>
		'Die gewählte Datei überschreitet die von Ihrem Host festgelegte maximale Uploadgröße von %2$s.',

		'File chosen in \'%s\' does not match allowable file types for that field.' =>
		'Die in \'%s\' ausgewählte Datei entspricht keinem erlaubten Dateityp für dieses Feld.',

		'File chosen in \'%s\' was only partially uploaded due to an error.' =>
		'Die in \'%s\' ausgewählte Datei wurde aufgrund eines Fehlers nur teilweise hochgeladen.',

		'Files' =>
		'Dateien',

		'File Upload' =>
		'Dateiupload',

		'Filter %s by' =>
		'%s filtern mit',

		'Filter Authors by' =>
		'Autoren filtern mit',

		'Filter Navigation by' =>
		'Navigation filtern mit',

		'Filter Results' =>
		'Ergebnisfilter',

		'Filter Rules' =>
		'Filterregeln',

		'First' =>
		'Erste',

		'First Name' =>
		'Vorname',

		'First name is required' =>
		'Der Vorname ist eine Pflichtangabe',

		'Forbidden' =>
		'Verboten',

		'Formatting' =>
		'Formatierung',

		'General' =>
		'Allgemein',

		'Group By' =>
		'Gruppieren nach',

		'Hairy' =>
		'Haarig',

		'Handle' =>
		'Bezeichner',

		'Hi %s,' =>
		'Hi %s,',

		'Host' =>
		'Host',

		'Hot' =>
		'Heiß',

		'ID' =>
		'ID',

		'Included Elements' =>
		'Eingebundene Elemente',

		'Installation Failure' =>
		'Installation fehlgeschlagen',

		'Install Symphony' =>
		'Symphony installieren',

		'Invalid element name. Must be valid QName.' =>
		'Ungültiger Elementname. Muss ein gültiger QName sein.',

		'Invalid Entry ID specified. Could not create Entry object.' =>
		'Ungültige Eintrags-ID angegeben. Eintragsobjekt konnte nicht erstellt werden.',

		'It looks like your trying to create an entry. Perhaps you want fields first? Click here to create some.' =>
		'Anscheinend versuchen Sie einen neuen Eintrag zu erstellen. Vielleicht möchten Sie vorher Felder anlegen. Klicken Sie hier um Felder anzulegen.',

		'It will expire in 2 hours. If you did not ask for a new password, please disregard this email.' =>
		'Es wird in zwei Stunden ablaufen. Falls Sie kein neues Passwort angefordert haben, ignorieren Sie bitte diese Nachricht.',

		'just now' =>
		'gerade eben',

		'Label' =>
		'Bezeichnung',

		'Large' =>
		'Groß',

		'Last' =>
		'Letzte',

		'Last Name' =>
		'Nachname',

		'Last name is required' =>
		'Der Nachname ist eine Pflichtangabe',

		'Last Seen' =>
		'Letzter Besuch',

		'Leave password fields blank to keep the current password' =>
		'Lassen Sie das Passwortfeld leer, um das derzeitige Passwort zu behalten',

		'Leave these fields unless you are sure they need to be changed.' =>
		'Belassen Sie diese Felder wie sie sind, es sei denn, Sie sind sich sicher, dass sie geändert werden müssen.',

		'Line %s' =>
		'Zeile %s',

		'list of comma author usernames.' =>
		'Kommagetrennte Liste der Autoren-Benutzernamen.',

		'Login' =>
		'Anmeldung',

		'Login Details' =>
		'Anmeldedaten',

		'Logout' =>
		'Abmelden',

		'Long Description Optional' =>
		'Lange Beschreibung optional',

		'Lumpy' =>
		'Pummelig',

		'Main content' =>
		'Hauptbereich',

		'Make sure that you delete ' =>
		'Stellen Sie sich, dass Sie ',

		'Make textarea %s rows tall' =>
		'Stelle Textfeld %s Zeilen hoch dar.',

		'Men' =>
		'Männer',

		'Message' =>
		'Nachricht',

		'Missing Requirements' =>
		'Fehlende Voraussetzungen',

		'Monkeys' =>
		'Affen',

		'Must be a valid number' =>
		'Muss eine gültige Zahl sein',

		'Must be a valid number or parameter' =>
		'Muss eine gültige Zahl oder ein gültiger Parameter sein',

		'Must be greater than zero' =>
		'Muss größer als Null sein',

		'MySQL 4.1 or above' =>
		'MySQL 4.1 oder höher',

		'MySQL Error (%1$s): %2$s in query "%3$s"' =>
		'MySQL-Fehler (%1$s): %2$s in query "%3$s"',

		'Name is a required field.' =>
		'Name ist ein Pflichtfeld.',

		'Namespace' =>
		'Namensraum',

		'Namespace Declarations Optional' =>
		'Namensraumdeklarationen optional',

		'navigation' =>
		'navigation',

		'Navigation' =>
		'Navigation',

		'Navigation Group' =>
		'Navigationsgruppe',

		'New Password' =>
		'Neues Passwort',

		'New Symphony Account Password' =>
		'Neues Passwort für Ihren Symphony-Zugang',

		'Next →' =>
		'Nächste →',

		'No' =>
		'Nein',

		'None' =>
		'Keine Angaben',

		'None found.' =>
		'Keine Einträge.',

		'No records found.' =>
		'Keine Einträge gefunden.',

		'No suitable engine object found' =>
		'Es konnte kein ausreichendes Engine-Objekt gefunden werden.',

		'No suitable XSLT processor was found.' =>
		'Es konnte kein ausreichender XSLT-Prozessor gefunden werden.',

		'No valid recipients found. Check send-email[recipient] field.' =>
		'Es konnten keine Empfänger gefunden werden. Überprüfen Sie das Feld send-email[recipient].',

		'Old Password' =>
		'Altes Passwort',

		'Once installed, you will be able to login to the Symphony admin with these user details.' =>
		'Sobald die Installation abgeschlossen ist, können Sie mit diesen Zugangsdaten auf Symphony zugreifen.',

		'One or more pages could not be deleted. Please check permissions on /workspace/pages.' =>
		'Eine oder mehrere Seiten konnten nicht gelöscht werden. Bitte überprüfen Sie die Rechte für /workspace/pages.',

		'Optional' =>
		'optional',

		'Output Options' =>
		'Ausgabeoptionen',

		'Outstanding Requirements' =>
		'Fehlende Anforderungen',

		'Page %1$s of %2$s' =>
		'Seite %1$s von %2$s',

		'Page could not be deleted because it does not exist.' =>
		'Die Seite konnten nicht gelöscht werden, weil sie nicht existiert.',

		'Page could not be deleted because it has children.' =>
		'Die Seite konnte nicht gelöscht werden, weil sie Unterseiten hat.',

		'Page could not be written to disk. Please check permissions on /workspace/pages.' =>
		'Die Seite konnte nicht auf der Festplatte gespeichert werden. Bitte überprüfen Sie die Zugriffsrechte für /workspace/pages.',

		'Page ID' =>
		'Seiten-ID',

		'Page Not Found' =>
		'Seite konnte nicht gefunden werden',

		'Page not found' =>
		'Seite nicht gefunden',

		'Page Resources' =>
		'Seitenbasis',

		'Pages' =>
		'Seiten',

		'Page Settings' =>
		'Seiteneinstellungen',

		'Page Type' =>
		'Seitentyp',

		'Parameter Output' =>
		'Ausgabeparameter',

		'Parent Page' =>
		'Übergeordnete Seite',

		'Password' =>
		'Passwort',

		'Password is required' =>
		'Das Passwort ist eine Pflichtangabe',

		'Passwords did not match' =>
		'Passworteingabe stimmte nicht überein',

		'Permission Settings' =>
		'Zugriffseinstellungen',

		'Personal Information' =>
		'Persönliche Informationen',

		'Pigs' =>
		'Schweine',

		'Pirates' =>
		'Piraten',

		'Placement' =>
		'Platzierung',

		'Please login to view this page.' =>
		'Bitte melden Sie sich an, um diese Seite zu sehen.',

		'Please add the following personal details for this user.' =>
		'Bitte ergänzen Sie die nachfolgenden persönlichen Informationen des Nutzers.',

		'Please provide Symphony with access to a database.' =>
		'Bitte räumen Sie Symphony einen Datenbankzugang ein.',

		'Port' =>
		'Port',

		'Preferences' =>
		'Einstellungen',

		'Preferences saved.' =>
		'Die Einstellungen wurden gespeichert.',

		'random' =>
		'zufällig',

		'Recipient username was invalid' =>
		'Empfängername war ungültig',

		'Region' =>
		'Region',

		'Remove File' =>
		'Datei entfernen',

		'Remove selected items' =>
		'Auswahl entfernen',

		'Reordering was unsuccessful.' =>
		'Das Neusortieren ist fehlgeschlagen.',

		'Required URL Parameter Optional' =>
		'Verpflichtende URL-Parameter optional',

		'Root Path' =>
		'Wurzelpfad',

		'Round' =>
		'Rund',

		'Save Changes' =>
		'Änderungen speichern',

		'Section created at %1$s. Create another? View all Sections' =>
		'Der Bereich wurde um %1$s erstellt. Einen neuen erstellen? Alle Bereiche anzeigen.',

		'Section is invalid' =>
		'Der Bereich ist ungültig',

		'sections' =>
		'bereiche',

		'Sections' =>
		'Bereiche',

		'Section updated at %1$s. Create another? View all Sections' =>
		'Der Bereich wurde um %1$s aktualisiert. Einen neuen erstellen? Alle Bereiche anzeigen.',

		'Select Box' =>
		'Auswahlfeld',

		'Send Email' =>
		'E-Mail verschicken',

		'Send Email Filter' =>
		'E-Mail-Versandfilter',

		'Set %s' =>
		'Setze %s',

		'Show a maximum of %s results' =>
		'Zeige maximal %s Ergebnisse',

		'Show page %s of results' =>
		'Zeige Seite %s der Ergebnisse',

		'Sidebar' =>
		'Seitenleiste',

		'Small' =>
		'Klein',

		'Some errors were encountered while attempting to save.' =>
		'Beim Versuch zu speichern sind Fehler aufgetreten.',

		'Sort By' =>
		'Sortieren nach',

		'Sort by %1$s %2$s' =>
		'Sortiere nach %1$s %2$s',

		'Sorting and Limiting' =>
		'Sortierung und Begrenzung',

		'Sort Order' =>
		'Sortierreihenfolge',

		'Source' =>
		'Quelle',

		'Static Options' =>
		'Statische Optionen',

		'Static XML' =>
		'Statisches XML',

		'static_xml' =>
		'statisches_xml',

		'Status' =>
		'Status',

		'Submit' =>
		'Abschicken',

		'Success and Failure XML Examples' =>
		'Erfolgs- und Fehlerbeispiele',

		'Suggestion List' =>
		'Vorschlagsliste',

		'Symphony' =>
		'Symphony',

		'Symphony Concierge' =>
		'Symphony-Concierge',

		'Symphony Database Error' =>
		'Symphony-Datenbankfehler',

		'Symphony does not have write permission to the /manifest directory. Please modify permission settings on this directory and its contents to allow this, such as with a recursive chmod -R command.' =>
		'Symphony hat keine Schreibrechte für das Verzeichnis /manifest. Bitte passen Sie die Zugriffsrechte dieses Verzeichnisses und seiner Inhalte an, zum Beispiel mit einen rekursiven chmod -R Kommando.',

		'Symphony does not have write permission to the /symphony directory. Please modify permission settings on this directory. This is necessary only during installation, and can be reverted once installation is complete.' =>
		'Symphony hat keine Schreibrechte für das Verzeichnis /symphony. Bitte passen Sie die Zugriffsrechte dieses Verzeichnisses an. Diese Änderung ist nur während der Installation nötig und kann danach rückgängig gemacht werden.',

		'Symphony does not have write permission to the existing /workspace directory. Please modify permission settings on this directory and its contents to allow this, such as with a recursive chmod -R command.' =>
		'Symphony hat keine Schreibrechte für das Verzeichnis /workspace. Bitte passen Sie die Zugriffsrechte dieses Verzeichnisses und seiner Inhalte an, zum Beispiel mit einen rekursiven chmod -R Kommando.',

		'Symphony does not have write permission to the root directory. Please modify permission settings on this directory. This is necessary only if you are not including a workspace, and can be reverted once installation is complete.' =>
		'Symphony hat keine Schreibreiche für das Wurzelverzeichnis. Bitte passen Sie die Zugriffsrechte dieses Verzeichnisses an. Diese Änderung ist nur nötig, wenn Sie keinen Workspace einbinden und kann nach der Installation rückgängig gemacht werden.',

		'Symphony does not have write permission to the temporary htaccess file. Please modify permission settings on this file so it can be written to, and renamed.' =>
		'Symphony hat keine Schreibrechte für die temporäre .htaccess-Datei. Bitte passen Sie die Zugriffsrechte dieser Datei so an, dass sie umbenannt und beschrieben werden kann.',

		'Symphony is ready to be installed at the following location.' =>
		'Symphony ist bereit für die Installation an nachfolgendem Ort.',

		'Symphony needs an XSLT processor such as LibXSLT or Sablotron to build pages.' =>
		'Symphony benötigt einen XSLT-Prozessor wie LibXSLT oder Sablotron um Seiten erzeugen zu können.',

		'Symphony needs a recent version of PHP.' =>
		'Symphony benötigt eine aktuelle PHP-Version.',

		'Symphony needs a recent version of MySQL.' =>
		'Symphony benötigt eine aktuelle MySQL-Version.',

		'Symphony needs permission to read and write both files and directories.' =>
		'Symphony benötigt Lese- und Schreibrechte für Dateien und Verzeichnisse.',

		'Symphony needs the following requirements satisfied before installation can proceed.' =>
		'Symphony benötigt folgende Voraussetzungen bevor die Installation fortgesetzt werden kann.',

		'Symphony normally specifies UTF-8 character encoding for database entries. With compatibility mode enabled, Symphony will instead use the default character encoding of your database.' =>
		'Symphony verwendet normalerweise UTF-8-Zeichenkodierung für Datenbankeinträge. Im Kompatibilitätsmodus verwendet Symphony anstelle die Standardzeichenkodierung ihrer Datenbank.',

		'Symphony requires MySQL 4.1 or greater to work, however version %s was detected. This requirement must be met before installation can proceed.' =>
		'Symphony benötigt MySQL 4.1 oder neuer, allerdings wurde Version %s erkannt. Ohne die benötigte Version kann die Installation nicht fortgesetzt werden.',

		'Symphony requires MySQL 4.1 or greater to work. This requirement must be met before installation can proceed.' =>
		'Symphony benötigt MySQL 4.1 oder neuer. Ohne die benötigte Version kann die Installation nicht fortgesetzt werden.',

		'Symphony was unable to connect to the specified database. You may need to modify host or port settings.' =>
		'Symphony war nicht in der Lage eine Verbindung zur angegebenen Datenbank aufzubauen. Möglicherweise müssen Sie Ihre Host- oder Port-Einstellungen anpassen.',

		'System' =>
		'System',

		'System Author' =>
		'Systemautor',

		'System Date' =>
		'Systemdatum',

		'System ID' =>
		'System-ID',

		'Table Prefix' =>
		'Tabellenprefix',

		'Tag List' =>
		'Tag-Liste',

		'Template' =>
		'Vorlage',

		'Textarea' =>
		'Textfeld',

		'Text Input' =>
		'Eingabefeld',

		'The date specified in \'%s\' is invalid.' =>
		'Das angegebene Datum \'%s\' ist ungültig.',

		'The entry you are looking for could not be found.' =>
		'Der von Ihnen gesuchte Eintrag konnte nicht gefunden werden.',

		'The following is an example of what is returned if any filters fail:' =>
		'Nachfolgendes Beispiel zeigt das Ergebnis, wenn ein Filter einen Fehler ausgibt:',

		'The page you requested does not exist.' =>
		'Die aufgerufene Seite existiert nicht.',

		'The page you requested to edit does not exist.' =>
		'Die Seite, die Sie bearbeiten möchten, existiert nicht.',

		'The password and confirmation did not match. Please retype your password.' =>
		'Das Passwort und dessen Wiederholung stimmten nicht überein. Bitte geben Sie Ihr Passwort erneut ein.',

		'There appears to be an existing .htaccess file in the /symphony directory.' =>
		'Es scheint bereits eine .htaccess-Datei innerhalb des Verzeichnisses /symphony zu existieren.',

		'There appears to be an existing .htaccess file in the Symphony install location. To avoid name clashes, you will need to delete or rename this file.' =>
		'Es scheint bereits eine .htaccess-Datei innerhalb Ihrer Symphony-Installation zu existieren. Um Überschneidungen zu vermeiden, müssen Sie diese löschen oder umbenennen.',

		'There is already a field of type %s. There can only be one per section.' =>
		'Es existiert bereits ein Feld des Typs %s. Es ist für jeden Bereich nur eines zulässig.',

		'There was an error while trying to upload the file %1$s to the target directory %2$s.' =>
		'Beim Hochladen der Datei %1$s in den Zielordner %2$s ist ein Fehler aufgetreten.',

		'There was a problem locating your account. Please check that you are using the correct email address.' =>
		'Es gab Schwierigkeiten Ihren Benutzerzugang zuzuordnen. Überprüfen Sie bitte, ob Sie die richtige E-Mail-Adresse angegeben haben.',

		'There were some problems while attempting to save. Please check below for problem fields.' =>
		'Beim Speichern sind einige Fehler aufgetreten. Bitte überprüfen Sie die betroffenen Felder.',

		'The section associated with the data source %s could not be found.' =>
		'Der mit der Datenquelle %s verbundene Bereich konnte nicht gefunden werden.',

		'The Section you are looking, %s for could not be found.' =>
		'Der von Ihnen gesuchte Bereich %s konnte nicht gefunden werden.',

		'The Section you are looking for could not be found.' =>
		'Der von Ihnen gesuchte Bereich konnte nicht gefunden werden.',

		'The send email filter, upon the event successfully saving the entry, takes input from the form and send an email to the desired recipient. This filter currently does not work with the "Allow Multiple" option. The following are the recognised fields:' =>
		'Der Filter zum Versenden von E-Mail schickt, sofern das Ereignis erfolgreich gespeichert werden konnte, alle Eingaben des Formulars an den gewünschten Empfänger. Dieser Filter funktioniert derzeit nicht, wenn Sie die Erstellung mehrerer Einträge zulassen. Folgende Felder werden vom Filter erkannt:',

		'The supplied password was rejected. Retrieve password?' =>
		'Das übermittelte Passwort wurde nicht akzeptiert. Ein neues anfordern?',

		'The supplied password was rejected. Make sure it is not empty and that password matches password confirmation.' =>
		'Das verwendete Passwort wurde nicht akzeptiert. Stellen Sie sicher, dass das Passwort nicht leer ist und dass es der Passwort-Benachrichtung entspricht.',

		'The Symphony configuration file, /manifest/config.php, is not writable. You will not be able to save changes to preferences.' =>
		'Die Symphony-Konfigurationsdatei /manifest/config.php ist nicht lesbar. Die Änderungen der Voreinstellungen werden nicht gespeichert.',

		'The Symphony Team' =>
		'Ihr Symphony-Team',

		'The table prefix  is already in use. Please choose a different prefix to use with Symphony.' =>
		'Der Tabellenprefix ist bereits in Benutzung. Bitte wählen Sie einen anderen Prefix, der in Verbindung mit Symphony verwendet werden soll.',

		'This document is not well formed. The following error was returned: %s' =>
		'Dieses Dokument ist nicht wohlgeformt. Folgender Fehler wurde zurückgegeben: %s',

		'This event will not be processed if any of these rules return true.' =>
		'Dieses Ereignis wird nicht ausgeführt werden, wenn eine dieser Regel wahr zurückgibt.',

		'This is a courtesy email to notify you that an entry was created on the %1$s section. You can edit the entry by going to: %2$s' =>
		'Diese E-Mail möchte Sie darüber informieren, dass ein Eintrag im Bereich %1$s erstellt wurde. Sie können diesen bearbeiten, indem folgende Seite aufrufen: %2$s',

		'This is an example of the form markup you can use on your frontend:' =>
		'Dies ist ein Beispiel, dass Sie für Ihr Frontend-Formular nutzen können:',

		'This is a required field' =>
		'Dieses Feld ist verpflichtend.',

		'This is a required field.' =>
		'Dies ist ein Pflichtfeld.',

		'This is not a valid email address. You must provide an email address since you will need it if you forget your password.' =>
		'Dies keine gültige E-Mail-Adresse. Sie müssen eine E-Mail-Adresse angeben, da Sie diese benötigen, falls Sie Ihr Passwort vergessen sollten.',

		'This page could not be rendered due to the following XSLT processing errors.' =>
		'Diese Seite konnte aufgrund nachfolgender XSLT-Verarbeitungfehler nicht dargestellt werden.',

		'Time Format' =>
		'Zeitformat',

		'Title' =>
		'Titel',

		'Title is a required field' =>
		'Titel ist ein Pflichtfeld',

		'To edit an existing entry, include the entry ID value of the entry in the form. This is best as a hidden field like so:' =>
		'Um einen existierenden Eintrag zu bearbeiten, müssen Sie die Eintrags-ID im Formular einbinden. Dies geht am besten mit einem versteckten Feld:',

		'To redirect to a different location upon a successful save, include the redirect location in the form. This is best as a hidden field like so, where the value is the URL to redirect to:' =>
		'Um nach erfolgreichem Speichern zu einer anderen Adresse weiterzuleiten, müssen Sie das Umleitungsziel im Formular einbinden. Dies geht am besten mit einem versteckten Feld, wobei der Wert der Ziel-URL entspricht:',

		'Two custom fields have the same element name. All element names must be unique.' =>
		'Zwei Felder haben den selben Elementnamen. Alle Elementnamen müssen eindeutig sein.',

		'Type' =>
		'Typ',

		'Unable to remove file - %s' =>
		'Datei konnte nicht entfernt werden – %s',

		'Uninstall' =>
		'Deinstallieren',

		'Unknown Entry' =>
		'Unbekannter Eintrag',

		'Unknown errors occurred while attempting to save. Please check your activity log.' =>
		'Ein unbekannter Fehler ist beim Speichern aufgetreten. Bitte überprüfen Sie Ihr Systemlogbuch.',

		'Unknown errors where encountered when saving.' =>
		'Beim Speichern sind unbekannte Fehler aufgetreten.',

		'Unknown Section' =>
		'Unbekannter Bereich',

		'Untitled' =>
		'Ohne Titel',

		'Update Symphony' =>
		'Symphony Aktualisierung',

		'Uploading \'%s\' failed. Could not write temporary file to disk.' =>
		'Das Hochladen von \'%s\' ist fehlgeschlagen. Die temporäre Datei konnte nicht gespeichert werden.',

		'Uploading \'%s\' failed. File upload stopped by extension.' =>
		'Das Hochladen von \'%s\' ist fehlgeschlagen. Der Vorgang wurde von einer Erweiterung unterbrochen.',

		'URI' =>
		'URI',

		'URL' =>
		'URL',

		'URL Handle' =>
		'URL-Bezeichner',

		'URL Parameters' =>
		'URL-Parameter',

		'Use {$param} syntax to filter by page parameters.' =>
		'Verwenden Sie {$param}, um mit Seitenparametern zu filtern.',

		'Use {$param} syntax to limit by page parameters.' =>
		'Verwenden Sie {$param}, um mit Seitenparametern zu begrenzen.',

		'Use {$param} syntax to specify dynamic portions of the URL.' =>
		'Verwenden Sie {$param}, um dynamische Teile der URL festzulegen.',

		'Use an XPath expression to select which elements from the source XML to include.' =>
		'Benutzen Sie einen X-Path-Ausdruck, um die einzubinden Elemente der XML-Quelle auszuwählen.',

		'Use compatibility mode' =>
		'Verwende Kompatibilitätsmodus',

		'Use Field' =>
		'Zu verwendendes Feld',

		'User Information' =>
		'Benutzerinformationen',

		'Username' =>
		'Benutzername',

		'Username is already taken' =>
		'Dieser Benutzername ist bereits vergeben',

		'Username is required' =>
		'Der Benutzername ist eine Pflichtangabe',

		'User type' =>
		'Benutzergruppe',

		'Utilities' =>
		'Bausteine',

		'Utility' =>
		'Baustein',

		'Utility could not be written to disk. Please check permissions on /workspace/utilities.' =>
		'Baustein konnte nicht auf der Festplatte gespeichert werden. Bitte überprüfen Sie die Zugriffsrechte für /workspace/utilities.',

		'Utility created at %1$s. Create another? View all Utilities' =>
		'Der Baustein wurde um %1$s erstellt. Einen neuen erstellen? Alle Bausteine anzeigen.',

		'Utility updated at %1$s. Create another? View all Utilities' =>
		'Der Baustein wurde um %1$s aktualisiert. Einen neuen erstellen? Alle Bausteine anzeigen.',

		'Validation Rule Optional' =>
		'Validierungsregel optional',

		'Value' =>
		'Wert',

		'Version' =>
		'Version',

		'Version %s' =>
		'Version %s',

		'Viewing %1$s - %2$s of %3$s entries' =>
		'Zeige %1$s - %2$s von %3$s Einträgen',

		'Weasels' =>
		'Wiesel',

		'Website Name' =>
		'Webseitenname',

		'Website Preferences' =>
		'Webseiteneinstellungen',

		'When an error occurs during saving, due to either missing or invalid fields, the following XML will be returned' =>
		'Wenn beim Speichern ein Fehler auftritt, weil Felder fehlen oder ungültig sind, wird nachfolgendes XML ausgeben',

		'When saved successfully, the following XML will be returned:' =>
		'Nach erfolgreicher Speicherung, wird nachfolgendes XML ausgegeben:',

		'With Selected...' =>
		'Auswahl …',

		'Women' =>
		'Frauen',

		'Worms' =>
		'Würmer',

		'Wrong password. Enter old one to change email address.' =>
		'Falsches Passwort. Geben Sie Ihr altes Passwort zum Ändern der E-Mail-Adresse ein.',

		'Wrong password. Enter old password to change it.' =>
		'Falsches Passwort. Geben Sie Ihr altes Passwort zum Ändern ein.',

		'XML' =>
		'XML',

		'XML is invalid' =>
		'XML ist ungültig',

		'XML Output' =>
		'XML-Ausgabe',

		'XML returned is invalid.' =>
		'Zurückgegebenes XML ist ungültig',

		'XSLT Processing Error' =>
		'XSLT-Verarbeitungsfehler',

		'Yes' =>
		'Ja',

		'You are already using the most recent version of Symphony. There is no need to run the installer, and can be safely deleted.' =>
		'Sie verwenden bereits die aktuellste Version von Symphony. Es ist nicht nötig das Installationsprogramm laufen zu lassen, es kann sicher entfernt werden.',

		'You are not authorised to access this page.' =>
		'Sie sind nicht berechtigt diese Seite zu besuchen.',

		'You are not authorised to access this section.' =>
		'Sie sind nicht autorisiert auf diesen Bereich zuzugreifen',

		'You are not using the most recent version of Symphony. This update is only compatible with Symphony 2.' =>
		'Sie verwenden nicht die aktuellste Version von Symphony. Diese Aktualisierung ist nur mit Symphony 2 kompatibel.',

		'You must enter a Password. This will be your Symphony login information.' =>
		'Sie müssen ein Passwort anlegen, welches für Sie bei der Symphony-Anmeldung verwendet werden soll.',

		'You must enter a Username. This will be your Symphony login information.' =>
		'Sie müssen einen Benutzernamen anlegen, welcher für Sie bei der Symphony-Anmeldung verwendet werden soll.',

		'You must enter your name.' =>
		'Sie müssen Ihren Namen angeben.',

		'ZLib Compression Library' =>
		'ZLib-Compression-Library',

		'[Symphony] A new entry was created on %s' =>
		'[Symphony] Ein neuer Eintrag auf %s wurde erstellt',

		'{$minutes} minutes ago' =>
		'vor {$minutes} Minuten',

		'%s Include a count of entries in associated sections' =>
		'%s Zeige Gesamtzahl der Einträge in verknüpften Bereichen',

		'%s Pre-populate this field with today\'s date' =>
		'%s Dieses Feld mit dem heutigen Datum vorbelegen.',

		'Authors can set up a differing language in their profiles.' =>
		'Autoren können in Ihren Profilen eine abweichende Sprache einstellen.',

		'Children' =>
		'Kinder',

		'Choose only one. Created if does not exist' =>
		'Wählen Sie nur ein Gruppe. Diese wird bei Bedarf erstellt.',

		'Create Section' =>
		'Bereich erstellen',

		'Custom Preferences' =>
		'Benutzerdefinierte Einstellungen',

		'Data source created at %1$s. Create another? View all Data sources' =>
		'Diese Datenquelle wurde um %1$s erstellt. Eine neue erstellen? Alle Datenquellen anzeigen.',

		'Data source updated at %1$s. Create another? View all Data sources' =>
		'Diese Datenquelle wurde um %1$s aktualisiert. Eine neue erstellen? Alle Datenquellen anzeigen.',

		'Daylight savings time' =>
		'Sommerzeit',

		'Directory %s does not exist.' =>
		'Der Ordner %s existiert nicht.',

		'Edit Configuration' =>
		'Einstellungen bearbeiten',

		'Edit Page Confguration' =>
		'Seiteneinstellungen bearbeiten',

		'Edit Page Template' =>
		'Seitenvorlage bearbeiten',

		'Edit Template' =>
		'Vorlage bearbeiten',

		'It looks like you\'re trying to create an entry. Perhaps you want fields first? Click here to create some.' =>
		'Anscheinend versuchen Sie einen Eintrag zu erstellen. Vielleicht möchten Sie zunächst Felder erstellen. Klicken Sie hier, um welche zu erstellen.',

		'Language' =>
		'Sprache',

		'Local' =>
		'Lokal',

		'Name' =>
		'Name',

		'No /symphony directory was found at this location. Please upload the contents of Symphony\'s install package here.' =>
		'An diesem Ort konnte kein Verzeichnis /symphony gefunden werden. Bitte laden Sie den Inhalt des Symphony-Installationspakets hierher hoch.',

		'Page created at %1$s. Create another? View all Pages' =>
		'Diese Seiten wurde um %1$s erstellt. Eine neue erstellen? Alle Seiten anzeigen',

		'Page updated at %1$s. Create another? View all Pages' =>
		'Diese Seite wurde um %1$s aktualisiert. Eine neue erstellen? Alle Seiten anzeigen',

		'Page updated at %s. View all Pages' =>
		'Diese Seite wurde um %1$s aktualisiert. Alle Seiten anzeigen',

		'System Default' =>
		'Systemstandard',

		'System Language' =>
		'Systemsprache',

		'The destination directory, %s, does not exist.' =>
		'Der Zielordner %s existiert nicht.',

		'The parameter $ds-%s will be created with this field\'s value for XSLT or other data sources to use.' =>
		'Das Parameter $ds-%s wird auf Grundlage des Wertes dieses Feldes erstellt und kann im XSLT oder in anderen Datenquellen verwendet werden.',

		'The Section you are looking for, %s, could not be found.' =>
		'Der von Ihnen gesuchte Berich %s konnte nicht gefunden werden.',

		'User Type' =>
		'Benutzertyp',

		'Text Formatter' =>
		'Textformatierung',

		'Example XML' =>
		'Beispiel-XML',

		'released on' =>
		'veröffentlicht am',

	);

	/**
	 * Transliterations
	 */
	$transliterations = array(

		// Alphabetical

		'/À/' => 'A',		'/Á/' => 'A',		'/Â/' => 'A',		'/Ã/' => 'A',		'/Ä/' => 'Ae',
		'/Å/' => 'A',		'/Ā/' => 'A',		'/Ą/' => 'A',		'/Ă/' => 'A',		'/Æ/' => 'Ae',
		'/Ç/' => 'C',		'/Ć/' => 'C',		'/Č/' => 'C',		'/Ĉ/' => 'C',		'/Ċ/' => 'C',
		'/Ď/' => 'D',		'/Đ/' => 'D',		'/Ð/' => 'D',		'/È/' => 'E',		'/É/' => 'E',
		'/Ê/' => 'E',		'/Ë/' => 'E',		'/Ē/' => 'E',		'/Ę/' => 'E',		'/Ě/' => 'E',
		'/Ĕ/' => 'E',		'/Ė/' => 'E',		'/Ĝ/' => 'G',		'/Ğ/' => 'G',		'/Ġ/' => 'G',
		'/Ģ/' => 'G',		'/Ĥ/' => 'H',		'/Ħ/' => 'H',		'/Ì/' => 'I',		'/Í/' => 'I',
		'/Î/' => 'I',		'/Ï/' => 'I',		'/Ī/' => 'I',		'/Ĩ/' => 'I',		'/Ĭ/' => 'I',
		'/Į/' => 'I',		'/İ/' => 'I',		'/Ĳ/' => 'Ij',		'/Ĵ/' => 'J',		'/Ķ/' => 'K',
		'/Ł/' => 'L',		'/Ľ/' => 'L',		'/Ĺ/' => 'L',		'/Ļ/' => 'L',		'/Ŀ/' => 'L',
		'/Ñ/' => 'N',		'/Ń/' => 'N',		'/Ň/' => 'N',		'/Ņ/' => 'N',		'/Ŋ/' => 'N',
		'/Ò/' => 'O',		'/Ó/' => 'O',		'/Ô/' => 'O',		'/Õ/' => 'O',		'/Ö/' => 'Oe',
		'/Ø/' => 'O',		'/Ō/' => 'O',		'/Ő/' => 'O',		'/Ŏ/' => 'O',		'/Œ/' => 'Oe',
		'/Ŕ/' => 'R',		'/Ř/' => 'R',		'/Ŗ/' => 'R',		'/Ś/' => 'S',		'/Š/' => 'S',
		'/Ş/' => 'S',		'/Ŝ/' => 'S',		'/Ș/' => 'S',		'/Ť/' => 'T',		'/Ţ/' => 'T',
		'/Ŧ/' => 'T',		'/Ț/' => 'T',		'/Ù/' => 'U',		'/Ú/' => 'U',		'/Û/' => 'U',
		'/Ü/' => 'Ue',		'/Ū/' => 'U',		'/Ů/' => 'U',		'/Ű/' => 'U',		'/Ŭ/' => 'U',
		'/Ũ/' => 'U',		'/Ų/' => 'U',		'/Ŵ/' => 'W',		'/Ý/' => 'Y',		'/Ŷ/' => 'Y',
		'/Ÿ/' => 'Y',		'/Y/' => 'Y',		'/Ź/' => 'Z',		'/Ž/' => 'Z',		'/Ż/' => 'Z',
		'/Þ/' => 'T',
		'/à/' => 'a',		'/á/' => 'a',		'/â/' => 'a',		'/ã/' => 'a',		'/ä/' => 'ae',
		'/å/' => 'a',		'/ā/' => 'a',		'/ą/' => 'a',		'/ă/' => 'a',		'/æ/' => 'ae',
		'/ç/' => 'c',		'/ć/' => 'c',		'/č/' => 'c',		'/ĉ/' => 'c',		'/ċ/' => 'c',
		'/ď/' => 'd',		'/đ/' => 'd',		'/ð/' => 'd',		'/è/' => 'e',		'/é/' => 'e',
		'/ê/' => 'e',		'/ë/' => 'e',		'/ē/' => 'e',		'/ę/' => 'e',		'/ě/' => 'e',
		'/ĕ/' => 'e',		'/ė/' => 'e',		'/ĝ/' => 'g',		'/ğ/' => 'g',		'/ġ/' => 'g',
		'/ģ/' => 'g',		'/ĥ/' => 'h',		'/ħ/' => 'h',		'/ì/' => 'i',		'/í/' => 'i',
		'/î/' => 'i',		'/ï/' => 'i',		'/ī/' => 'i',		'/ĩ/' => 'i',		'/ĭ/' => 'i',
		'/į/' => 'i',		'/ı/' => 'i',		'/ĳ/' => 'ij',		'/ĵ/' => 'j',		'/ķ/' => 'k',
		'/ł/' => 'l',		'/ľ/' => 'l',		'/ĺ/' => 'l',		'/ļ/' => 'l',		'/ŀ/' => 'l',
		'/ñ/' => 'n',		'/ń/' => 'n',		'/ň/' => 'n',		'/ņ/' => 'n',		'/ŋ/' => 'n',
		'/ò/' => 'o',		'/ó/' => 'o',		'/ô/' => 'o',		'/õ/' => 'o',		'/ö/' => 'oe',
		'/ø/' => 'o',		'/ō/' => 'o',		'/ő/' => 'o',		'/ŏ/' => 'o',		'/œ/' => 'oe',
		'/ŕ/' => 'r',		'/ř/' => 'r',		'/ŗ/' => 'r',		'/ś/' => 's',		'/š/' => 's',
		'/ş/' => 's',		'/ŝ/' => 's',		'/ș/' => 's',		'/ť/' => 't',		'/ţ/' => 't',
		'/ŧ/' => 't',		'/ț/' => 't',		'/ù/' => 'u',		'/ú/' => 'u',		'/û/' => 'u',
		'/ü/' => 'ue',		'/ū/' => 'u',		'/ů/' => 'u',		'/ű/' => 'u',		'/ŭ/' => 'u',
		'/ũ/' => 'u',		'/ų/' => 'u',		'/ŵ/' => 'w',		'/ý/' => 'y',		'/ŷ/' => 'y',
		'/ÿ/' => 'y',		'/y/' => 'y',		'/ź/' => 'z',		'/ž/' => 'z',		'/ż/' => 'z',
		'/þ/' => 't',		'/ß/' => 'ss',		'/ſ/' => 'ss',		'/ƒ/' => 'f',		'/ĸ/' => 'k',
		'/ŉ/' => 'n',

		// Symbolic

		'/\(/' => null,		'/\)/' => null,		'/,/' => null,
		'/–/' => '-',		'/－/' => '-',		'/„/' => '"',
		'/“/' => '"',		'/”/' => '"',		'/—/' => '-',
		'/¿/' => null,		'/‽/' => null,		'/¡/' => null,

		// Ampersands

		'/^&(?!&)$/' => 'und',
		'/^&(?!&)/' => 'und-',
		'/&(?!&)&/' => '-und',
		'/&(?!&)/' => '-und-',

	);


<?php
/*
@homepage <https://github.com/semsol/arc2>
@license W3C Software License and GPL

class:    ARC2 Extractor
author:   Benjamin Nowack
version:  2010-11-16
*/

ARC2::inc('RDFExtractor');

class ARC2_TwitterProfilePicExtractor extends ARC2_RDFExtractor {

  function __construct($a, &$caller) {
    parent::__construct($a, $caller);
  }

  function __init() {
    parent::__init();
    $this->a['ns']['foaf'] = 'http://xmlns.com/foaf/0.1/';
    $this->a['ns']['mf'] = 'http://poshrdf.org/ns/mf#';
  }

  /*  */

  function extractRDF() {
    $t_vals = array();
    $t = '';
    foreach ($this->nodes as $n) {
      if (isset($n['tag']) && ($n['tag'] == 'img') && ($this->v('id', '', $n['a']) == 'profile-image')) {
        $t_vals['vcard_id'] = $this->getDocID($n) . '#resource(side/1/2/1)';
        $t .= '?vcard_id mf:photo <' . $n['a']['src'] . '> . ';
        break;
      }
    }
    if ($t) {
      $doc = $this->getFilledTemplate($t, $t_vals, $n['doc_base']);
      $this->addTs(ARC2::getTriplesFromIndex($doc));
    }
  }

  /*  */

}

<?php
/*
@homepage <https://github.com/semsol/arc2>
@license W3C Software License and GPL

class:    ARC2 Extractor
author:   Benjamin Nowack
version:  2010-11-16
*/

ARC2::inc('RDFExtractor');

class ARC2_TwitterProfilePicExtractor extends ARC2_RDFExtractor
{
    public function __construct($a, &$caller)
    {
        parent::__construct($a, $caller);
    }

    public function __init()
    {
        parent::__init();
        $this->a['ns']['foaf'] = 'http://xmlns.com/foaf/0.1/';
        $this->a['ns']['mf'] = 'http://poshrdf.org/ns/mf#';
    }

    public function extractRDF()
    {
        $t_vals = [];
        $t = '';
        foreach ($this->nodes as $n) {
            if (isset($n['tag']) && ('img' == $n['tag']) && ('profile-image' == $this->v('id', '', $n['a']))) {
                $t_vals['vcard_id'] = $this->getDocID($n).'#resource(side/1/2/1)';
                $t .= '?vcard_id mf:photo <'.$n['a']['src'].'> . ';
                break;
            }
        }
        if ($t) {
            $doc = $this->getFilledTemplate($t, $t_vals, $n['doc_base']);
            $this->addTs(ARC2::getTriplesFromIndex($doc));
        }
    }
}