+ get_hook_prefix()}bulk_actions", $actions );
+ }
+}
\ No newline at end of file
diff --git a/packages/one-stop-shop-woocommerce/src/Settings.php b/packages/one-stop-shop-woocommerce/src/Settings.php
new file mode 100644
index 000000000..4d2978dce
--- /dev/null
+++ b/packages/one-stop-shop-woocommerce/src/Settings.php
@@ -0,0 +1,179 @@
+ _x( 'General', 'oss', 'woocommerce-oss' )
+ );
+ }
+
+ public static function get_description() {
+ return sprintf( _x( 'Find useful options regarding the One Stop Shop procedure here.', 'oss', 'woocommerce-germanized' ) );
+ }
+
+ public static function get_help_url() {
+ return '';
+ }
+
+ public static function get_settings( $current_section = '' ) {
+ $settings = array(
+ array( 'title' => '', 'type' => 'title', 'id' => 'oss_options', 'desc' => Package::is_integration() ? '' : self::get_description() ),
+
+ array(
+ 'title' => _x( 'OSS status', 'oss', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Yes, I\'m currently participating in the OSS procedure.', 'oss', 'woocommerce-germanized' ),
+ 'id' => 'oss_use_oss_procedure',
+ 'type' => Package::is_integration() ? 'gzd_toggle' : 'checkbox',
+ 'default' => 'no',
+ ),
+
+ array(
+ 'title' => _x( 'Observation', 'oss', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Automatically observe the delivery threshold of the current year.', 'oss', 'woocommerce-germanized' ) . '
' . _x( 'This option will automatically calculate the amount applicable for the OSS procedure delivery threshold once per day for the current year. The report will only recalculated for the days which are not yet subject to the observation to save processing time.', 'oss', 'woocommerce-germanized' ) . '
' . _x( 'This option will make sure that your customers pay the same price no matter the tax rate (based on the country chosen) to be applied.', 'oss', 'woocommerce-germanized' ) . '
Find out more about the calculation.', 'oss', 'woocommerce-germanized' ), 'https://vendidero.github.io/one-stop-shop-woocommerce/report-calculation' ); ?>
+ id = 'oss';
+ $this->label = _x( 'OSS', 'oss', 'woocommerce-germanized' );
+
+ parent::__construct();
+ }
+
+ public function output() {
+ echo '
")),0 0 ) {
+ if ( 'place' === $box.val() ) {
+ $( '.dhl-preferred-service-content .dhl-preferred-service-location-place' ).show();
+ } else if ( 'neighbor' === $box.val() ) {
+ $( '.dhl-preferred-service-content .dhl-preferred-service-location-neighbor' ).show();
+ }
+ }
+ },
+
+ initTipTip: function() {
+
+ // Remove any lingering tooltips
+ $( '#tiptip_holder' ).removeAttr( 'style' );
+ $( '#tiptip_arrow' ).removeAttr( 'style' );
+
+ $( '.dhl-preferred-service-content .woocommerce-help-tip' ).tipTip({
+ 'attribute': 'data-tip',
+ 'fadeIn': 50,
+ 'fadeOut': 50,
+ 'delay': 200
+ });
+ }
+ };
+
+ $( document ).ready( function() {
+ germanized.dhl_preferred_services.init();
+ });
+
+})( jQuery, window.germanized );
diff --git a/packages/woocommerce-germanized-dhl/assets/js/preferred-services.min.js b/packages/woocommerce-germanized-dhl/assets/js/preferred-services.min.js
new file mode 100644
index 000000000..27bec0320
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/assets/js/preferred-services.min.js
@@ -0,0 +1 @@
+window.germanized=window.germanized||{},window.germanized.dhl_preferred_services=window.germanized.dhl_preferred_services||{},function(r,t){t.dhl_preferred_services={params:{},init:function(){var e=t.dhl_preferred_services;e.params=wc_gzd_dhl_preferred_services_params,r(document.body).on("updated_checkout",e.afterRefreshCheckout),r(document).on("change",".dhl-preferred-service-content .dhl-preferred-location-types input",e.onChangeLocationType).on("change",".woocommerce-checkout #billing_postcode",e.triggerCheckoutRefresh).on("change",".woocommerce-checkout #shipping_postcode",e.triggerCheckoutRefresh).on("change",".dhl-preferred-service-content .dhl-preferred-service-times input",e.triggerCheckoutRefresh),e.params.payment_gateways_excluded&&r(document).on("change",".payment_methods .input-radio",e.triggerCheckoutRefresh),e.afterRefreshCheckout()},triggerCheckoutRefresh:function(){r(document.body).trigger("update_checkout")},afterRefreshCheckout:function(){var e=t.dhl_preferred_services;e.initTipTip(),e.onChangeLocationType()},onChangeLocationType:function(){t.dhl_preferred_services;var e=r(".dhl-preferred-service-content .dhl-preferred-location-types input:checked");r(".dhl-preferred-service-content .dhl-preferred-service-location-data").hide(),0
+
+
+
+
+ A sequence number defined by the (soap-) client. The
+ sequenceNumber is
+ returned by the webservice within the result of the
+ createShipment operation, so
+ that the client is able to assign the
+ shipment information of the response to the
+ shipment data of the
+ request.
+
+
+
+
+
+
+
+
+
+ The version of the webservice and the version of the
+ software
+ build.
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+
+
+
+ The shipmentdata for creating a shipment.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ ShipmentOrder is the highest parent element that
+ contains all
+ data with respect to one shipment order.
+
+
+
+
+
+ Dial to determine label ouput format. Must be
+ either 'URL' or
+ 'B64' = Base64encoded: it is possible to request
+ an URL for receiving
+ the label as PDF stream, or to request the
+ label as base64encoded binary
+ data directly. If not defined by
+ client, web service defaults to
+ 'URL'.
+
+
+
+
+
+
+
+
+
+
+
+
+ The group profile you select defines the billing
+ numbers you can use for creating shipments. To define group
+ profiles please visit our business costumer portal.
+
+
+
+
+
+
+
+
+
+ In this optional section you can define the
+ following label formats:
+ A4: common label laser printing A4 plain
+ paper;
+ 910-300-700: common label laser printing 105 x 205 mm
+ (910-300-700);
+ 910-300-700-oz: common label laser printing 105 x
+ 205 mm
+ (910-300-700) without additional label;
+ 910-300-600: common
+ label thermal printing 103 x 199 (910-300-600,
+ 910-300-610);
+ 910-300-710: common label laser printing 105 x 208 mm
+ (910-300-710);
+ 100x70mm: 100x70mm (only for Warenpost);
+
+
+
+
+
+
+
+
+
+ In this optional section you can define the
+ following label formats:
+ A4: common label laser printing A4 plain
+ paper;
+ 910-300-700: common label laser printing 105 x 205 mm
+ (910-300-700);
+ 910-300-700-oz: common label laser printing 105 x
+ 205 mm
+ (910-300-700) without additional label;
+ 910-300-600: common
+ label thermal printing 103 x 199 (910-300-600,
+ 910-300-610);
+ 910-300-710: common label laser printing 105 x 208 mm
+ (910-300-710);
+
+
+
+
+
+
+
+
+
+ To get a single PDF for shipping and return label
+ select this option.
+
+
+
+
+
+
+
+
+
+
+
+
+ The shipmentdata for validating a shipment.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ ShipmentOrder is the highest parent element that
+ contains all
+ data with respect to one shipment order.
+
+
+
+
+
+
+
+
+
+ The status of the operation and the shipment
+ identifier (if
+ available).
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the overall
+ request.
+
+
+
+
+
+ The operation's success status for every single
+ ShipmentOrder
+ will be returned by one CreationState element. It is
+ identifiable via
+ SequenceNumber.
+
+
+
+
+
+
+
+
+ The status of the operation and the shipment
+ identifier (if
+ available).
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the overall
+ request.
+
+
+
+
+
+ The operation's success status for every single
+ ShipmentOrder
+ will be returned by one CreationState element. It is
+ identifiable via
+ SequenceNumber.
+
+
+
+
+
+
+
+
+ The identifier for the shipment for which the label
+ url is
+ requested.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+
+ Dial to determine label ouput format. Must be
+ either 'URL' or
+ 'B64' = Base64encoded: it is possible to request
+ an URL for receiving
+ the label as PDF stream, or to request the
+ label as base64encoded binary
+ data directly. If not defined by
+ client, web service defaults to
+ 'URL'.
+
+
+
+
+
+
+
+
+
+
+
+
+ The group profile you select defines the billing
+ numbers you can use for creating shipments. To define group
+ profiles please visit our business costumer portal.
+ The group
+ profile defines the shipments you can get documents for.
+ The
+ shipment needs to have an account/billing number allocated to
+ the
+ group profile. To define group profiles please visit our
+ business
+ costumer portal.
+
+
+
+
+
+
+
+
+
+ In this optional section you can define the
+ following label formats:
+ A4: common label laser printing A4 plain
+ paper
+ 910-300-700: common label laser printing 105 x 205 mm
+ (910-300-700);
+ 910-300-700-oz: common label laser printing 105 x
+ 205 mm
+ (910-300-700) without additional label;
+ 910-300-600: common
+ label thermal printing 103 x 199 (910-300-600,
+ 910-300-610);
+ 910-300-710: common label laser printing 105 x 208 mm
+ (910-300-710);
+ 100x70mm: 100x70mm (only for Warenpost);
+
+
+
+
+
+
+
+
+
+ In this optional section you can define the
+ following label formats:
+ A4: common label laser printing A4 plain
+ paper;
+ 910-300-700: common label laser printing 105 x 205 mm
+ (910-300-700);
+ 910-300-700-oz: common label laser printing 105 x
+ 205 mm
+ (910-300-700) without additional label;
+ 910-300-600: common
+ label thermal printing 103 x 199 (910-300-600,
+ 910-300-610);
+ 910-300-710: common label laser printing 105 x 208 mm
+ (910-300-710);
+
+
+
+
+
+
+
+
+
+ To get a single PDF for shipping and return label
+ select this option.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The status of the operation and requested urls for
+ getting the
+ label.
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the overall
+ request.
+
+
+
+
+
+ For every ShipmentNumber requested, one LabelData
+ node is
+ returned that contains the status of the label retrieval
+ operation and
+ the URL for the label (if available).
+
+
+
+
+
+
+
+
+ Manifests one ore more shipments.
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+
+ Identifiers of the shipments that should be
+ manifested. The shipment number is read
+ from
+ ShipmentNumberType->shipmentNumber
+
+
+
+
+
+ Presence of this element signals that all
+ available shipments should be manifested.
+
+
+
+
+
+
+
+
+
+ The status of the operation
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Status of the request (value of zero means, the
+ request was
+ processed without error; value greater than zero
+ indicates that an error
+ occurred).
+
+
+
+
+
+ The status of the operation for the corresponding
+ shipment.
+
+
+
+
+
+
+
+
+ The identifier for the shipment which should be
+ deleted.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ In order to delete previously created DD shipment
+ orders,
+ ShipmentNumber. ShipmentNumber is required. This parent
+ element inherits
+ from ShipmentNumberType, therefore all following
+ subelements are valid
+ according to schema, however the web service
+ accepts shipmentNumber
+ only. Note: you can delete more than one
+ shipment by passing multiple
+ ShipmentNumber containers.
+
+
+
+
+
+
+
+
+ The status of the operation.
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the overall
+ request.
+
+
+
+
+
+ For every ShipmentNumber requested, one
+ DeletionState node
+ is returned that contains the status of the
+ respective deletion
+ operation.
+
+
+
+
+
+
+
+
+ The identifier for the shipment for which the export
+ document url is
+ requested.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ To request export documents, ShipmentNumber.
+ ShipmentNumber
+ is required. This parent element inherits from
+ ShipmentNumberType,
+ therefore all following subelements are valid
+ according to schema,
+ however the web service accepts
+ shipmentNumber only.
+
+
+
+
+
+ Dial to determine label ouput format. Must be
+ either 'URL' or
+ 'B64' = Base64encoded: it is possible to request
+ an URL for receiving
+ the label as PDF stream, or to request the
+ label as base64encoded binary
+ data directly. If not defined by
+ client, web service defaults to
+ 'URL'.
+
+
+
+
+
+
+
+
+
+
+
+
+ The group profile you select defines the billing
+ numbers you can use for creating shipments. To define group
+ profiles please visit our business costumer portal.
+ The group
+ profile defines the shipments you can get documents for.
+ The
+ shipment needs to have an account/billing number allocated to
+ the
+ group profile. To define group profiles please visit our
+ business
+ costumer portal.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The status of the operation and requested export
+ document.
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Status of the request (value of zero means, the
+ request was
+ processed without error; value greater than zero
+ indicates that an error
+ occurred).
+
+
+
+
+
+ Contains the result of the document processing: in
+ case of no
+ errors, a base64 encoded PDF is contained; also, the
+ status of this
+ particular document generation and the passed
+ shipment number are
+ returned.
+
+
+
+
+
+
+
+
+ The request data for the manifest document
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ Date in format yyyy-mm-dd
+
+
+
+
+
+
+
+
+ The status of the operation and requested export
+ document.
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Status of the request (value of zero means, the
+ request was
+ processed without error; value greater than zero
+ indicates that an error
+ occurred).
+
+
+
+
+
+ The Base64 encoded pdf data for receiving the
+ manifest.
+
+
+
+
+
+
+
+
+ The shipmentdata for creating a shipment.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ The ShipmentNumber of the shipment, which sould be
+ updated.
+ ShipmentNumber is required. This parent element inherits
+ from
+ ShipmentNumberType, therefore all following subelements are
+ valid
+ according to schema, however the web service accepts
+ shipmentNumber
+ only.
+
+
+
+
+
+ ShipmentOrder contains an update of all data of the
+ selected
+ shipment order.
+
+
+
+
+
+ Dial to determine label ouput format. Must be
+ either 'URL' or
+ 'B64' = Base64encoded: it is possible to request
+ an URL for receiving
+ the label as PDF stream, or to request the
+ label as base64encoded binary
+ data directly. If not defined by
+ client, web service defaults to
+ 'URL'.
+
+
+
+
+
+
+
+
+
+
+
+
+ The group profile you select defines the billing
+ numbers you can use for creating shipments. To define group
+ profiles please visit our business costumer portal.
+
+
+
+
+
+
+
+
+
+ In this optional section you can define the
+ following label formats:
+ A4: common label laser printing A4 plain
+ paper;
+ 910-300-700: common label laser printing 105 x 205 mm
+ (910-300-700);
+ 910-300-700-oz: common label laser printing 105 x
+ 205 mm
+ (910-300-700) without additional label;
+ 910-300-600: common
+ label thermal printing 103 x 199 (910-300-600,
+ 910-300-610);
+ 910-300-710: common label laser printing 105 x 208 mm
+ (910-300-710);
+ 100x70mm: 100x70mm (only for Warenpost);
+
+
+
+
+
+
+
+
+
+ In this optional section you can define the
+ following label formats:
+ A4: common label laser printing A4 plain
+ paper;
+ 910-300-700: common label laser printing 105 x 205 mm
+ (910-300-700);
+ 910-300-700-oz: common label laser printing 105 x
+ 205 mm
+ (910-300-700) without additional label;
+ 910-300-600: common
+ label thermal printing 103 x 199 (910-300-600,
+ 910-300-610);
+ 910-300-710: common label laser printing 105 x 208 mm
+ (910-300-710);
+
+
+
+
+
+
+
+
+
+ To get a single PDF for shipping and return label
+ select this option.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The status of the operation and the shipment
+ identifier (if
+ available).
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the overall
+ request.
+
+
+
+
+
+ Can contain any DHL shipmentnumber. For successful
+ and unsuccessful operations, the requested
+ ShipmentNumber to be
+ deleted is returned. This is no matter if the operation
+ could be
+ performed or not.
+
+
+
+
+
+
+
+
+
+
+ Can contain any DHL shipmentnumber. For successful
+ and unsuccessful operations, the requested
+ ShipmentNumber to be
+ deleted is returned. This is no matter if the operation
+ could be
+ performed or not.
+
+
+
+
+
+
+
+
+
+
+ The operation's success status for every single
+ ShipmentOrder
+ will be returned by one UpdateState element. It is
+ identifiable via
+ ShipmentNumber.
+
+
+
+
+
+
+
+
+ The operation's success status for every single
+ ShipmentOrder will be
+ returned by one CreationState element. It is
+ identifiable via SequenceNumber.
+
+
+
+
+
+ Identifier for ShipmentOrder set by client
+ application in
+ CreateShipment request. The defined value is looped
+ through and returned
+ unchanged by the web service within the
+ response of createShipment. The
+ client can therefore assign the
+ status information of the response to the
+ correct ShipmentOrder of
+ the request.
+
+
+
+
+
+ Can contain any DHL shipmentnumber. For successful
+ and unsuccessful operations, the requested
+ ShipmentNumber to be
+ deleted is returned. This is no matter if the operation
+ could be
+ performed or not.
+
+
+
+
+
+
+
+
+
+
+ Can contain any DHL shipmentnumber. For successful
+ and unsuccessful operations, the requested
+ ShipmentNumber to be
+ deleted is returned. This is no matter if the operation
+ could be
+ performed or not.
+
+
+
+
+
+
+
+
+
+
+ For successful operations, a shipment number is
+ created and
+ returned. Depending on the invoked product.
+
+
+
+
+
+
+
+ The operation's success status for every single
+ ShipmentOrder will be
+ returned by one CreationState element. It is
+ identifiable via SequenceNumber.
+
+
+
+
+
+ Identifier for ShipmentOrder set by client
+ application in
+ CreateShipment request. The defined value is looped
+ through and returned
+ unchanged by the web service within the
+ response of createShipment. The
+ client can therefore assign the
+ status information of the response to the
+ correct ShipmentOrder of
+ the request.
+
+
+
+
+
+ Success status of processing a particular shipment.
+
+
+
+
+
+
+
+ The status information used in different situations.
+
+
+
+
+
+ Overall status of the entire request: A value of
+ zero means, the
+ request was processed without error. A value
+ greater than zero indicates
+ that an error occurred. The detailed
+ mapping and explanation of returned
+ status codes is contained in
+ the list.
+
+
+
+
+
+ Explanation of the statuscode and potential errors.
+
+
+
+
+
+ Explanation of the statuscode and potential errors.
+
+
+
+
+
+
+
+ Information about each piece (e.g. the generated
+ licence plate). For
+ every piece, a PieceInformation container holds
+ the license plate
+ number.
+
+
+
+
+
+ For every piece a piece number is created that is of
+ one of the
+ following types (mostly licensePlate).
+
+
+
+
+
+
+
+ Data for the creation of a shipment.
+
+
+
+
+ Free field to to tag multiple shipment orders
+ individually by
+ client. Essential for later mapping of response
+ data returned by webservice
+ upon createShipment operation. Allows
+ client to assign the shipment
+ information of the response to the
+ correct shipment order of the
+ request.
+
+
+
+
+
+ Is the core element of a ShipmentOrder. It contains
+ all relevant
+ information of the shipment.
+
+
+
+
+
+
+ Contains the information of the shipment product
+ code, weight and size characteristics and services to be used.
+
+
+
+
+
+
+ Contains relevant information about the
+ Shipper.
+
+
+
+
+
+ Contains a reference to the Shipper data
+ configured in GKP.
+
+
+
+
+
+
+ Contains relevant information about
+ Receiver.
+
+
+
+
+
+ To be used if a return label address shall be
+ generated.
+
+
+
+
+
+ For international shipments. This section
+ contains information about the exported goods relevant for
+ customs. For international shipments: commercial invoice and
+ customs declaration (CN23) have to be attached to the shipment.
+ Data relevant for customs also has to be transferred as
+ electronically.
+
+
+
+
+
+ Is only to be indicated by DHL partners
+
+
+
+
+
+
+
+
+
+
+
+
+ If set to true (=1), the label will be only be
+ printable, if the
+ receiver address is valid.
+
+
+
+
+
+
+
+ Data for the creation of a shipment.
+
+
+
+
+ Free field to to tag multiple shipment orders
+ individually by
+ client. Essential for later mapping of response
+ data returned by webservice
+ upon createShipment operation. Allows
+ client to assign the shipment
+ information of the response to the
+ correct shipment order of the
+ request.
+
+
+
+
+
+ Is the core element of a ShipmentOrder. It contains
+ all relevant
+ information of the shipment.
+
+
+
+
+
+
+ Contains the information of the shipment product
+ code, weight and size characteristics and services to be used.
+
+
+
+
+
+ Contains relevant information about the
+ Shipper.
+
+
+
+
+
+ Contains relevant information about
+ Receiver.
+
+
+
+
+
+ To be used if a return label address shall be
+ generated.
+
+
+
+
+
+ For international shipments. This section
+ contains information about the exported goods relevant for
+ customs. For international shipments: commercial invoice and
+ customs declaration (CN23) have to be attached to the shipment.
+ Data relevant for customs also has to be transferred as
+ electronically.
+
+
+
+
+
+ Is only to be indicated by DHL partners
+
+
+
+
+
+
+
+
+
+
+
+
+ If set to true (=1), the label will be only be
+ printable, if the
+ receiver address is valid.
+
+
+
+
+
+
+
+ The data of the shipper or return receiver.
+
+
+
+
+
+ Name of the Return Receiver
+
+
+
+
+ Contains address data.
+
+
+
+
+ Information about communication.
+
+
+
+
+
+
+ The data of the shipper of a shipment.
+
+
+
+
+
+
+
+
+ Key of reference.
+
+
+
+
+
+
+
+ The receiver data.
+
+
+
+
+
+
+ The address data of the receiver.
+
+
+
+
+ The address of the receiver is a german
+ Packstation.
+
+
+
+
+
+ The address of the receiver is a german
+ Postfiliale.
+
+
+
+
+
+
+ Information about communication.
+
+
+
+
+
+
+ The receiver data of a shipment.
+
+
+
+
+
+
+
+
+ Identity data (used for ident services).
+
+
+
+
+
+ First name of the person to be verified. Field
+ length must be
+ less than or equal to 30.
+
+
+
+
+
+ Last name of the person to be verified. Field length
+ must be less
+ than or equal to 30.
+
+
+
+
+
+ Name of the street of registered address. Field
+ length must be
+ less than or equal to 30.
+
+
+
+
+
+ House number of registered address. Field length
+ must be less
+ than or equal to 10.
+
+
+
+
+
+ Postcode of registered address. Field length must be
+ less than or
+ equal to 15.
+
+
+
+
+
+ City of registered address. Field length must be
+ less than or
+ equal to 30.
+
+
+
+
+
+ Person's date of birth. Format must be yyyy-mm-dd.
+
+
+
+
+
+ Person's nationality. Field length must be less than
+ or equal to
+ 30.
+
+
+
+
+
+
+
+ Details of a shipment.
+
+
+
+
+
+ Determines the DHL Paket product to be ordered.
+ V01PAK: DHL PAKET;
+ V53WPAK: DHL PAKET International;
+ V54EPAK: DHL Europaket;
+ V62WP: Warenpost;
+ V66WPI: Warenpost International
+
+
+
+
+
+
+ A reference number that the client can assign for
+ better association purposes. Appears on shipment label. To use the
+ reference number for tracking purposes, it should be at least 8
+ characters long and unique
+
+
+
+
+
+
+
+
+
+
+ Date of shipment should be close to current date and
+ must not be
+ in the past. Iso format required: yyyy-mm-dd.
+
+
+
+
+
+
+
+
+
+
+
+ Name of a cost center. Appears on shipment label.
+
+
+
+
+
+
+
+
+
+
+ DHL account number (14 digits).
+
+
+
+
+
+
+
+
+
+
+
+ A reference number that the client can assign for
+ better
+ association purposes. Appears on return shipment label. To
+ use the reference number for tracking purposes, it should be at
+ least 8 characters long and unique.
+
+
+
+
+
+
+
+
+
+
+
+
+ Details of a shipment.
+
+
+
+
+
+ extends the ShipmentDetailsType
+
+
+
+ For every parcel specified, contains weight in kg,
+ length
+ in cm, width in cm and height in cm.
+
+
+
+
+
+ Use one dedicated Service node for each service to
+ be
+ booked with the shipment product. Add another Service node for
+ booking a further service and so on. Successful booking of a
+ particular service depends on account permissions and product's
+ service combinatorics. I.e. not every service is allowed for
+ every
+ product, or can be combined with all other allowed
+ services. The
+ service bundles that contain all services are the
+ following.
+
+
+
+
+
+ Mechanism to send notifications by email after
+ successful
+ manifesting of shipment.
+
+
+
+
+
+ Bank data can be provided here for different
+ purposes.
+ E.g. if COD is booked as service, bank data must be
+ provided by DHL
+ customer (mandatory server logic). The collected
+ money will be
+ transferred to specified bank account.
+
+
+
+
+
+
+
+
+
+ Item/Piece data.
+
+
+
+
+ The weight of the piece in kg
+
+
+
+
+
+
+
+
+
+
+
+ The length of the piece in cm.
+
+
+
+
+
+
+
+
+
+
+ The width of the piece in cm.
+
+
+
+
+
+
+
+
+
+
+ The height of the piece in cm.
+
+
+
+
+
+
+
+
+
+
+
+
+ Item/Piece data of a shipment.
+
+
+
+
+
+
+
+
+ GKV shipment services.
+
+
+
+ can be
+
+
+
+
+ This service is used exclusively for shipments with
+ special delivery requirements. It is not available for our regular
+ business customers.
+
+
+
+
+
+ Service for package return. For packagingReturn you
+ also have to book a return label.
+
+
+
+
+
+ Service "Endorsement". Mandatory for shipments with
+ product DHL Paket International: V53WPAK
+
+
+
+
+
+ Service visual age check
+
+
+
+
+ Service preferred location
+
+
+
+
+ Service preferred neighbour
+ The details field should be set to the preferred
+ neighbours
+ name.
+
+
+
+
+
+ Service preferred day
+
+
+
+
+ Invoke service No Neighbour Delivery.
+
+
+
+
+
+ Invoke service Named Person Only.
+
+
+
+
+ Invoke service return receipt.
+
+
+
+
+ Premium for fast and safe delivery of international
+ shipments.
+
+
+
+
+
+ Service Cash on delivery.
+
+
+
+
+ Insure shipment with higher than standard amount.
+
+
+
+
+
+ Service to ship bulky goods.
+
+
+
+
+ Service configuration for IdentCheck.
+
+
+
+
+
+ Service configuration for ParcelOutletRouting.
+ Details can be an
+ email-address, if not set receiver email will be
+ used
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ e-mail address for notification in case of
+ non-deliverability
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ E-mail address for notification in case of
+ non-deliverability.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Details of the Service (freetext)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Type of the Service (List of Types)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+
+ This service defines the handling of parcels that
+ cannot be delivered. There are two options: IMMEDIATE (Sending back
+ to sender), ABANDONMENT (Abandonment of parcel at the hands of
+ sender (free of charge). The definition of undeliverability is
+ country-specific and depends on the regulations of the postal
+ company of the receiving country. Usually, if parcels cannot be
+ delivered at first try, recipients receive a notification card and
+ can pick up their shipment at a local postal office. After the
+ storage period has expired, the shipment will be handled according
+ to your choosen endorsement option. Shipments that cannot be
+ delivered due to address problems or active refusal will be either
+ returned immediately or treated as abandoned.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Individual details for handling (freetext)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Number of Days to hold shipment before shipment
+ will be returend
+ to sender
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+
+ Service VisualCheckOfAge is used to specify the
+ minimum age of the recipient.
+ The following types are allowed: "A16"
+ or "A18"
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+
+ Timeframe of delivery, if the option is used:
+ ValidValues are
+ 10001200: 10:00 until 12:00;
+ 12001400: 12:00 until
+ 14:00
+ 14001600: 14:00 until 16:00;
+ 16001800: 16:00 until 18:00
+ 18002000: 18:00 until 20:00;
+ 19002100: 19:00 until 21:00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Day of Delivery, if the option is used: Date in
+ format
+ yyyy-mm-dd
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Please enter the Amount that should be insured
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Money amount to be collected. Mandatory if COD is
+ chosen.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+ Mandatory if unfree is chosen. 0= cash / 1= invoice.
+
+
+
+
+
+
+
+
+
+
+
+ Paid by third party, e.g. Receiver. DHL account
+ number mandatory if
+ PaymentType 1 = invoice is selected. Field
+ length must be less than or equal to
+ 10.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Surname (family name) of the person for ident
+ check.
+
+
+
+
+
+
+
+
+
+
+
+ Given name (first name) of the person for
+ ident
+ check.
+
+
+
+
+
+
+
+
+
+
+
+ date of birth (DOB) of the person for ident
+ check,
+ if the option is used: Date in format
+ yyyy-mm-dd
+
+
+
+
+
+
+
+
+
+
+
+ minimum age of the person for ident check
+ ("A16" or "A18")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Indicates, if the option is on/off
+
+
+
+
+
+
+
+
+
+
+
+
+ Notification type
+
+
+
+
+ Email address of the recipient. Mandatory if
+ Notification is
+ set.
+
+
+
+
+
+
+
+
+
+
+
+ You
+ may choose between a standard DHL e-mail text (no ID needed) or configure
+ an individual text within the section "Administration".
+
+
+
+
+
+
+
+
+
+
+
+ The data of the export document for a shipment.
+
+
+
+
+
+ Invoice number if applicable
+
+
+
+
+
+
+
+
+
+ Export type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description mandatory if ExportType is OTHER.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Element provides terms of trades, incoterms codes:
+
+
DDP (Delivery Duty Paid)
+
DXV (Delivery Duty Paid (excl. VAT))
+
DAP (formerly DDU, Delivery At Place)
+
DDX (Delivery Duty Paid (excl. Duties, taxes and VAT)
+
CPT (Carriage Paid To (within EU only))
+
+ are vaild values.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PlaceOfCommital is a Locaton the shipment is handed
+ over to DHL
+
+
+
+
+
+
+
+
+
+
+ Postage costs billed in the invoice
+
+
+
+
+
+
+
+
+
+
+
+
+ CustomsCurrency refers to all stated goods / customs
+ values as well as postage costs. The information has to match
+ the currency of the commercial invoice or the invoice for customs
+ purposes. ISO 4217 alpha, p.E.:
+ EUR for Euro
+ USD for US Dollar
+ GBP for British Pound
+
+
+
+
+
+
+
+
+
+
+ The permit number.
+
+
+
+
+
+
+
+
+
+ The attestation number.
+
+
+
+
+
+
+
+
+
+ The customs reference is used by customs authorities
+ to identify
+ economics operators an/or other persons involved. With
+ the given reference,
+ granted authorizations and/or relevant
+ processes in customs
+ clearance an/or
+ taxation can be taken into
+ account.
+
+
+
+
+
+
+
+
+
+
+ The customs reference is used by customs authorities
+ to identify
+ economics operators an/or other persons involved. With
+ the given reference,
+ granted authorizations and/or relevant
+ processes in customs
+ clearance an/or
+ taxation can be taken into
+ account.
+
+
+
+
+
+
+
+
+
+
+ Sets an electronic export notification.
+
+
+
+
+
+ One or more child elements for every position to be
+ defined within the Export Document. Each one contains description,
+ country code of origin, amount, net weight, customs value.
+ Multiple positions only possible for shipments using DHL Paket
+ International (V53WPAK).
+ Shipments using DHL Europaket (V54EPAK)
+ can only contain one
+ ExportDocPosition.
+
+
+
+
+
+
+ Description of the goods
+
+
+
+
+
+
+
+
+
+ ISO-Code (ISO 3166-2) of country the goods were
+ manufactured
+
+
+
+
+
+
+
+
+
+
+
+ Customs tariff number of the unit / position.
+
+
+
+
+
+
+
+
+
+
+ Quantity of the unit / position. Only positive
+ values (> 0) are allowed.
+
+
+
+
+
+
+
+
+
+
+
+ Net weight of the unit / position. Only positive
+ values (> 0) are allowed.The total net weight must not exceed
+ the shipment weight
+
+
+
+
+
+
+
+
+
+
+
+
+ Customs value amount of the unit /position. Only
+ positive values (> 0) are allowed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Further address information
+The following data fields from the cis_base-types are processed/mandatory/optional:
+-------------------------------------------------------------------------------------------------------
+Salutation (optional) : cis:NameType->Person->salutation
+Company Name 1 (mandatory): cis:NameType->Company->name1
+Company Name 2 (optional) : cis:NameType->Company->name2
+Contact Name (mandatory): cis:CommunicationType->contactPerson
+Street Name (mandatory): cis:NativeAddressType->streetName
+Street Number (mandatory): cis:NativeAddressType->streetNumber
+Add. Address (optional) : cis:NativeAddressType->careOfName
+Postcode (mandatory): cis:NativeAddressType->zip
+City Name (mandatory): cis:NativeAddressType->city
+ISO Country Code (mandatory): cis:NativeAddressType->Origin->CountryType->countryISOType
+Phone Number (mandatory): cis:CommunicationType->phone
+Email Address (mandatory): cis:CommunicationType->email
+
+
+
+
+
+ Mandatory if further address is to be specified.
+
+
+
+
+
+
+ Determines whether further address is one of the
+ following types.
+
+
+
+
+
+ Extra data for name extension.
+
+
+
+
+ Contains address data.
+
+
+
+
+ Info about communication.
+
+
+
+
+
+
+
+
+
+ The status of the getLabel operation and the url for
+ requesting the label
+ (if available).
+
+
+
+
+
+ Success status of processing retrieval of particular
+ shipment
+ label.
+
+
+
+
+
+ For successful and unsuccessful operations, the
+ requested
+ ShipmentNumber of the label to be retrieved is returned.
+ This is no matter
+ if it the operation could be performed or not.
+
+
+
+
+
+
+ If label output format was requested as 'URL' via
+ LabelResponseType, this element will be returned. It contains the
+ URL to
+ access the PDF label. This is default output format if not
+ specified
+ other by client in labelResponseType. Depending on
+ setting in customer
+ profile all labels or just the shipmentlabel.
+
+
+
+
+
+ Label as base64 encoded pdf data, depending on
+ setting in
+ customer profile all labels or just the shipmentlabel.
+
+
+
+
+
+
+
+ If label output format was requested as 'URL' via
+ LabelResponseType, this element will be returned. It contains the
+ URL to
+ access the PDF label. This is default output format if not
+ specified
+ other by client in labelResponseType. Depending on
+ setting in customer
+ profile all labels or just the
+ returnshipmentlabel.
+
+
+
+
+
+ Label as base64 encoded pdf data, depending on
+ setting in
+ customer profile all labels or just the
+ returnshipmentlabel.
+
+
+
+
+
+
+
+ If label output format was requested as 'URL' via
+ LabelResponseType, this element will be returned. It contains the
+ URL to
+ access the PDF label. This is default output format if not
+ specified
+ other by client in labelResponseType. Depending on
+ setting in customer
+ profile all labels or just the export
+ documents.
+
+
+
+
+
+ Label as base64 encoded pdf data, depending on
+ setting in
+ customer profile all labels or just the export
+ documents.
+
+
+
+
+
+
+
+ If label output format was requested as 'URL' via
+ LabelResponseType, this element will be returned. It contains the
+ URL to
+ access the PDF label. This is default output format if not
+ specified
+ other by client in labelResponseType. Depending on
+ setting in customer
+ profile all labels or just the cod related
+ documents.
+
+
+
+
+
+ Label as base64 encoded pdf data, depending on
+ setting in
+ customer profile all labels or just the cod related
+ documents.
+
+
+
+
+
+
+
+
+ The status of the getLabel operation and the url for
+ requesting the label
+ (if available)
+
+
+
+
+
+ ShipmentNumber
+
+
+
+
+ Status of the request (value of zero means, the
+ request was
+ processed without error; value greater than zero
+ indicates that an error
+ occurred).
+
+
+
+
+
+
+ Export doc as base64 encoded pdf data
+
+
+
+
+
+ URL for downloading the Export doc as pdf
+
+
+
+
+
+
+
+
+ The status of a doManifest operation.
+
+
+
+
+ ShipmentNumber
+
+
+
+
+ Status of the request (value of zero means, the
+ request was
+ processed without error; value greater than zero
+ indicates that an error
+ occurred).
+
+
+
+
+
+
+
+ The status of a deleteShipment operation.
+
+
+
+
+
+ For successful and unsuccessful operations, the
+ requested
+ ShipmentNumber to be deleted is returned. This is no
+ matter if the operation
+ could be performed or not.
+
+
+
+
+
+ Success status of processing the deletion of
+ particular
+ shipment.
+
+
+
+
+
+
+
+ The data for a pickup order.
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ Contains information in further leaf elements about
+ product,
+ DHL account, pickup date and time, pickup location,
+ amount of pieces,
+ pallets, and shipments, moreover weight and
+ volume weight, size.
+
+
+
+
+
+ The pickup address.
+
+
+
+
+ The address and contact information of the
+ orderer.
+
+
+
+
+
+
+
+
+ The data for a pickup order.
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the request.
+
+
+
+
+
+ The confirmation number of the successfully created
+ pickup
+ order. It can later be used for cancelling a pickup order.
+ Confirmation
+ number is not available for each pickup type.
+
+
+
+
+
+ If available, a shipment number is returned.
+
+
+
+
+
+
+
+
+ The details of a pickup order.
+
+
+
+
+ Pickup date in format yyyy-mm-dd. Mandatory if
+ pickup is booked
+ along with shipment order.
+
+
+
+
+
+
+
+
+
+
+
+ Earliest time for pickup. Format is hh:mm.
+
+
+
+
+
+
+
+
+
+
+
+ Lates time for pickup. Format is hh:mm.
+
+
+
+
+
+
+
+
+
+
+
+ Remarks to be considered when pickup is done.
+
+
+
+
+
+ Area to further detail pickup location beyond
+ address.
+
+
+
+
+
+
+
+
+The pickup address. In the PickupType the following data fields are processed/mandatory/optional:
+----------------------------------------------------------------------------------------------
+Company Name 1 (mandatory): cis:NameType->Company->name1
+Contact Name (mandatory): cis:CommunicationType->contactPerson
+Street Name (mandatory): cis:NativeAddressType->streetName
+Street Number (mandatory): cis:NativeAddressType->streetNumber
+Add. Address (optional) : cis:NativeAddressType->careOfName
+Postcode (mandatory): cis:NativeAddressType->zip
+City Name (mandatory): cis:NativeAddressType->city
+ISO Country Code (mandatory): cis:NativeAddressType->Origin->CountryType->countryISOType
+Phone Number (mandatory): cis:CommunicationType->phone
+Email Address (mandatory): cis:CommunicationType->email
+
+
+
+
+
+ Determines whether pickup address is one of the
+ following
+ types.
+
+
+
+
+
+ Data fields for pickup address.
+
+
+
+
+ Info about communication.
+
+
+
+
+
+
+
+Information about the pickup orderer. In the PickupOrdererType the following data fields are processed/mandatory/optional:
+----------------------------------------------------------------------------------------------
+Salutation (optional) : cis:NameType->Person->salutation
+Company Name 1 (mandatory): cis:NameType->Company->name1
+Company Name 2 (optional) : cis:NameType->Company->name2
+Contact Name (mandatory): cis:CommunicationType->contactPerson
+Street Name (mandatory): cis:NativeAddressType->streetName
+Street Number (mandatory): cis:NativeAddressType->streetNumber
+Add. Address (optional) : cis:NativeAddressType->careOfName
+Postcode (mandatory): cis:NativeAddressType->zip
+City Name (mandatory): cis:NativeAddressType->city
+ISO Country Code (mandatory): cis:NativeAddressType->Origin->CountryType->countryISOType
+Phone Number (mandatory): cis:CommunicationType->phone
+Email Address (mandatory): cis:CommunicationType->email
+
+
+
+
+
+ Determines whether orderer contact address is of the
+ following
+ type.
+
+
+
+
+
+ Optional name appendix.
+
+
+
+
+ Data fields for orderer's address.
+
+
+
+
+ Info about communication.
+
+
+
+
+
+
+ The data of the pickup order.
+
+
+
+
+ Depending on whether a DD pickup or TD pickup is
+ invoked, this
+ field contains either the 10-digit EKP number (DD
+ pickups) or the 9-digit
+ accountNumberExpress (TD pickups).
+
+
+
+
+
+
+
+
+
+
+ Pickup date in format yyyy-mm-dd.
+
+
+
+
+
+
+
+
+
+
+ Earliest time for pickup. Format is hh:mm.
+
+
+
+
+
+
+
+
+
+
+
+ Lates time for pickup. Format is hh:mm.
+
+
+
+
+
+
+
+
+
+
+
+ Remarks to be considered when pickup is done.
+ Mandatory if 'TDI'
+ is selected.
+
+
+
+
+
+ Area to further detail pickup location beyond
+ address. Mandatory
+ for TDN and TDI, optional for DDN and DDI.
+
+
+
+
+
+ Number of pieces to be picked up.
+
+
+
+
+
+
+
+
+
+ Number of pallets to be picked up.
+
+
+
+
+
+
+
+
+
+ The weight of all shipment's pieces in kg. Field
+ length must be
+ less than or equal to 22.
+
+
+
+
+
+
+
+
+
+
+
+
+ Number of shipments to be picked up.
+
+
+
+
+
+
+
+
+
+ The total volumetric weight of all pieces in kg.
+ Calculated by
+ piece = length x width x height in centimetres /
+ 5000. Field length must be
+ less than or equal to 22.
+
+
+
+
+
+
+
+
+
+
+
+
+ The maximum length in cm.
+
+
+
+
+
+
+
+
+
+
+
+ The maximum width in cm.
+
+
+
+
+
+
+
+
+
+
+
+ The maximum height in cm.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The data for cancelling a pickup order.
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the
+ requesting client is developed.
+
+
+
+
+
+ The confirmation number of the pickup order which
+ should be
+ cancelled. Use value from pickup response attribute
+ 'ConfirmationNumber'
+ to cancel respective pickup order. Note: only
+ one pickup can be deleted
+ at a time.
+
+
+
+
+
+
+
+
+ The status of the cancel pickup operation.
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the request.
+
+
+
+
+
+
+
+
+ Identity data (used e.g. for ident services)
+
+
+
+
+
+
+ If driving license shall be used for verifying
+ identity.
+
+
+
+
+
+
+ ID number of the driving license. Mandatory if
+ DrivingLicense is chosen as identity
+ instrument.
+
+
+
+
+
+ Name of certifying authority of the driving
+ license. Mandatory if DrivingLicense is chosen as identity
+ instrument.
+
+
+
+
+
+
+
+
+ If identity card shall be used for verifying
+ identity.
+
+
+
+
+
+
+ Number of the identity card. Mandatory if
+ IdentityCard is chosen as identity instrument. Field length
+ must be less than or equal to 20.
+
+
+
+
+
+ Name of certifying card authority. Mandatory if
+ IdentityCard is chosen as identity instrument. Field length
+ must be less than or equal to 30.
+
+
+
+
+
+
+
+
+ If a bank card shall be used for verifying
+ identity.
+
+
+
+
+
+
+ Type of bank card. Mandatory if BankCard is
+ chosen as identity instrument.
+
+
+
+
+
+ Number of bank card. Mandatory if BankCard is
+ chosen as identity instrument.
+
+
+
+
+
+ Name of bank. Mandatory if BankCard is chosen as
+ identity instrument.
+
+
+
+
+
+ Bank code. Mandatory if BankCard is chosen as
+ identity instrument.
+
+
+
+
+
+
+
+
+
+
+
+ Type of Packstation (Receiver is in Germany)
+
+
+
+
+ includes
+
+
+
+ Number of the packstation
+
+
+
+
+ Post Nummer of the receiver
+
+
+
+
+ Postcode
+
+
+
+
+
+
+
+
+
+
+
+ City name.
+
+
+
+
+
+
+
+
+
+
+
+ Type of Postfiliale (Receiver is in Germany)
+
+
+
+
+ includes
+
+
+
+ Number of the postfiliale
+
+
+
+
+ Post Nummer of the receiver
+
+
+
+
+ Postcode
+
+
+
+
+
+
+
+
+
+
+
+ City name.
+
+
+
+
+
+
+
+
+
+
+
+ Type of ParcelShop (Receiver is in Europe)
+
+
+
+
+ includes
+
+
+
+ Number of the ParcelShop
+
+
+
+
+ Name of street of the ParcelShop
+
+
+
+
+
+
+
+
+
+
+ House number of the ParcelShop
+
+
+
+
+
+
+
+
+
+ Postcode
+
+
+
+
+
+
+
+
+
+
+
+ City name.
+
+
+
+
+
+
+
+
+
+
+
+ The status of the operation and the shipment
+ identifier (if
+ available).
+
+
+
+
+
+
+ The version of the webservice implementation.
+
+
+
+
+
+ Success status after processing the overall
+ request.
+
+
+
+
+
+ The operation's success status for every single
+ ShipmentOrder
+ will be returned by one CreationState element. It is
+ identifiable via
+ SequenceNumber.
+
+
+
+
+
+
+
+
+ The version of the webservice implementation for
+ which the requesting
+ client is developed.
+
+
+
+
+
+ includes
+
+
+
+ The number of the major release. E.g. the '3' in
+ version
+ "3.1.".
+
+
+
+
+
+
+
+
+
+
+ The number of the minor release. E.g. the '1' in
+ version
+ "3.1.".
+
+
+
+
+
+
+
+
+
+
+ Optional build id to be addressed.
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-dhl/assets/wsdl/geschaeftskundenversand-api-3.2.0-schema-cis_base.xsd b/packages/woocommerce-germanized-dhl/assets/wsdl/geschaeftskundenversand-api-3.2.0-schema-cis_base.xsd
new file mode 100644
index 000000000..a69096960
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/assets/wsdl/geschaeftskundenversand-api-3.2.0-schema-cis_base.xsd
@@ -0,0 +1,1122 @@
+
+
+
+
+
+
+
+ Country specific ISO code.
+
+
+
+
+
+
+
+
+ First 10 digit number extract from the 14 digit DHL Account Number. E.g. if DHL Account Number is "5000000008 72 01" then EKP is equal to 5000000008.
+
+
+
+
+
+
+
+
+
+
+ Field has the partner id. I.e. the last 2 digit number extract from the 14 digit DHL Account Number. E.g. if DHL Account Number is "5000000008 72 01" then Attendance is 01.
+
+
+
+
+
+
+
+
+
+
+ Procedure ID (part of account number).
+
+
+
+
+
+
+
+
+
+
+ DHL account number (14 digits).
+
+
+
+
+
+
+
+
+
+
+ Express AccountNumber (9 digits).
+
+
+
+
+
+
+
+
+
+
+ Ident code number.
+
+
+
+
+
+
+
+
+
+
+
+ License plate number.
+
+
+
+
+
+
+
+
+
+ Airway bill number.
+
+
+
+
+
+
+
+
+
+
+ route code (default).
+
+
+
+
+
+
+
+
+
+
+
+
+ The following barcode types are:
+ 1. GS1 Barcode
+ 2. ASC MH10 Barcode
+ 3. 2/5 Interleaved
+ 4. Code 128 ( UPU )
+
+
+
+
+
+
+
+
+
+
+
+ City name.
+
+
+
+
+
+
+
+
+
+ Province name.
+
+
+
+
+
+
+
+
+
+ Code for street name (part of routecode).
+
+
+
+
+
+
+
+
+
+
+ Code for street number (part of routecode).
+
+
+
+
+
+
+
+
+
+
+ Country.
+
+
+
+
+ Authentification.
+
+
+
+
+ The version of the webservice implementation for which the
+requesting client is developed.
+
+
+
+
+ includes
+
+
+
+ The number of the major release. E.g. the '3' in version "3.1.".
+
+
+
+
+
+
+
+
+
+ The number of the minor release. E.g. the '3' in version "3.1.".
+
+
+
+
+
+
+
+
+
+ Optional build id to be addressed.
+
+
+
+
+
+
+
+
+
+
+
+
+ Type of authentification
+
+
+
+ includes
+
+
+
+ username for the business customer portal (only lower case)
+
+
+
+
+
+
+
+ password for the business customer portal
+
+
+
+
+
+
+
+
+
+
+
+ Type of native address
+
+
+
+ includes
+
+
+
+ The name of the street. Optionally the house number can be passed in this field too.
+ In this case the field "streetNumber" must not be present.
+
+
+
+
+
+
+
+
+
+ The house number. This field is only optional when the house number is passed with
+ the field streetName.
+
+
+
+
+
+
+
+
+
+ Address addon, is only printed in the international area (V53WPAK)
+
+
+
+
+
+
+
+
+
+ DispatchingInformation, is only printed in the international area (V53WPAK)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Type of native address
+
+
+
+ includes
+
+
+
+ The name of the street. Optionally the house number can be passed in this field too.
+ In this case the field "streetNumber" must not be present.
+
+
+
+
+
+
+
+
+
+ The house number. This field is only optional when the house number is passed with
+ the field streetName.
+
+
+
+
+
+
+
+
+
+
+
+ Country.
+
+
+
+
+
+
+
+
+
+
+ The name of the street. Optionally the house number can be passed in this field too.
+ In this case the field "streetNumber" must not be present.
+
+
+
+
+
+
+
+
+
+ The house number. This field is only optional when the house number is passed with
+ the field streetName.
+
+
+
+
+
+
+
+
+
+ Address addon, is only printed in the international area (V53WPAK)
+
+
+
+
+
+
+
+
+
+ DispatchingInformation, is only printed in the international area (V53WPAK)
+
+
+
+
+
+
+
+
+
+
+
+
+ Country.
+
+
+
+
+
+
+ Type of pickup address
+
+
+
+ includes
+
+
+
+ can be
+
+
+
+ Default address
+
+
+
+
+ Packstation address
+
+
+
+
+
+
+
+
+
+ Type of delivery address
+
+
+
+ includes
+
+
+
+ can be
+
+
+
+ Default address
+
+
+
+
+ Postoffice address
+
+
+
+
+ Packstation address
+
+
+
+
+
+
+
+
+
+ Type of bank information
+
+
+
+ includes
+
+
+
+ Name of bank account owner.
+
+
+
+
+
+
+
+
+
+ Name of bank.
+
+
+
+
+
+
+
+
+
+ IBAN code of bank account.
+
+
+
+
+
+
+
+
+
+ Purpose of bank information.
+
+
+
+
+
+
+
+
+
+ Purpose of bank information.
+
+
+
+
+
+
+
+
+
+ Bank-Information-Code (BankCCL) of bank account.
+
+
+
+
+
+
+
+
+
+ Accountreferece to customer profile
+
+
+
+
+
+
+
+
+
+
+
+ Type of name
+
+
+
+ includes
+
+
+
+
+
+
+
+
+ Type of name
+
+
+
+ includes
+
+
+
+ Name of receiver (first part)
+
+
+
+
+
+
+
+
+
+
+
+ Name of receiver (first part)
+
+
+
+
+
+
+
+
+
+ Name of company (second part).
+
+
+
+
+
+
+
+
+
+ Name of company (third part).
+
+
+
+
+
+
+
+
+
+ Type of communication.
+
+
+
+ includes
+
+
+
+ Phone number.
+
+
+
+
+
+
+
+
+
+ Emailaddress.
+
+
+
+
+
+
+
+
+
+ First name and last name of contact person.
+
+
+
+
+
+
+
+
+
+
+
+ Type of contact.
+
+
+
+ includes
+
+
+
+ Contact communication information.
+
+
+
+
+ Contact address.
+
+
+
+
+ Contact name.
+
+
+
+
+
+
+ Type of packstation.
+
+
+
+ includes
+
+
+
+ Post Nummer of the receiver, if not set receiver e-mail and/or mobilephone number needs to be set. When sending to a packstation with "DHL Paket" (V01PAK), the postnumber must always be entered.
+
+
+
+
+
+
+
+
+
+
+ Number of the Packstation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Type of Postfiliale
+
+
+
+ includes
+
+
+
+ Number of the postfiliale
+
+
+
+
+
+
+
+
+
+
+ Post Nummer of the receiver
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Type of Postfiliale
+
+
+
+ includes
+
+
+
+ Number of the postfiliale
+
+
+
+
+
+
+
+
+
+
+ Post Nummer of the receiver or receiver e-mail-adress.
+
+
+
+
+
+
+
+
+
+
+
+
+ Country.
+
+
+
+
+
+
+ Type of ParcelShop (Receiver is in Europe)
+
+
+
+ includes
+
+
+
+ Number of the ParcelShop
+
+
+
+
+
+
+
+
+
+
+ Name of street of the ParcelShop
+
+
+
+
+
+
+
+
+
+ House number of the ParcelShop
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Type of customer
+
+
+
+ includes
+
+
+
+ Name of customer.
+
+
+
+
+ VAT id.
+
+
+
+
+
+ Address of customer
+
+
+
+
+ Contact information
+
+
+
+
+ Bank information
+
+
+
+
+ Additional notes
+
+
+
+
+
+
+ Type of error
+
+
+
+ includes
+
+
+
+ Priority (e.g. error, warnung, .....)
+
+
+
+
+ Code
+
+
+
+
+ Occurence
+
+
+
+
+ Short description
+
+
+
+
+ Detailed description
+
+
+
+
+ Suggested solution
+
+
+
+
+ Name of application
+
+
+
+
+ Module name
+
+
+
+
+
+
+ Type of zip code
+
+
+
+
+
+
+
+ Type of country
+
+
+
+ includes
+
+
+
+ Name of country.
+
+
+
+
+
+
+
+
+
+ Country's ISO-Code (ISO-2-Alpha).
+
+
+
+
+ Name of state.
+
+
+
+
+
+
+
+
+
+
+
+ Type of shipment number
+
+
+
+ can be
+
+
+
+
+
+
+ part of webservice response
+
+
+
+
+ includes
+
+
+
+ statuscode value.
+
+
+
+
+
+
+
+
+
+ description corresponding to the statuscode
+
+
+
+
+
+
+
+
+
+
+
+
+ DHL product Key.
+
+
+
+
+
+
+
+
+
+
+ Package dimensions (length, width, height)
+
+
+
+
+ includes
+
+
+
+ length of package
+
+
+
+
+ width of package
+
+
+
+
+ height of package
+
+
+
+
+ unit for all measures
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Time Frame in which actions should affect
+
+
+
+
+ includes
+
+
+
+ begin of timeframe
+
+
+
+
+ end of timeframe
+
+
+
+
+
+
+
+ Can contain any DHL shipmentnumber.
+
+
+
+
+
+
+
+
diff --git a/packages/woocommerce-germanized-dhl/assets/wsdl/geschaeftskundenversand-api-3.2.0.wsdl b/packages/woocommerce-germanized-dhl/assets/wsdl/geschaeftskundenversand-api-3.2.0.wsdl
new file mode 100644
index 000000000..8cbae4315
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/assets/wsdl/geschaeftskundenversand-api-3.2.0.wsdl
@@ -0,0 +1,340 @@
+
+
+
+
+
+
+
+
+
+ The authentication data.
+
+
+
+ The shipmentdata for creating a shipment.
+
+
+
+ The status of the createShipment operation and the identifier for the
+ shipment.
+
+
+
+ The shipmentdata for validating a shipment.
+
+
+
+ The status of the validateShipment operation and the identifier for the
+ shipment.
+
+
+
+ The identifier for the shipment which should be
+ deleted.
+
+
+
+ The status of the deletion operation.
+
+
+
+ The identifier for the shipment which should be
+ manifested.
+
+
+
+ The status of the manifest operation.
+
+
+
+ The identifier for the DD shipment for which the label url is
+ requested.
+
+
+
+ The status of the operation and the label url (if
+ available).
+
+
+
+ The version of webservice implementation.
+
+
+
+ The version of webservice implementation.
+
+
+
+ The identifier for the DD shipment for which the label url is
+ requested.
+
+
+
+ The status of the operation and the label url (if
+ available).
+
+
+
+ Request a manifest of the given date / date range.
+
+
+
+ The status of the operation and the manifest url (if
+ available).
+
+
+
+ Request a manifest of the given date / date range.
+
+
+
+ The status of the operation and the manifest url (if
+ available).
+
+
+
+ The status of the operation and the manifest url (if
+ available).
+
+
+
+
+ Creates shipments.
+
+ The shipment data.
+
+
+ The status of the createShipment operation and the identifier for the
+ shipment.
+
+
+
+ Creates shipments.
+
+ The shipment data.
+
+
+ The status of the validateShipment operation and the identifier for the
+ shipment.
+
+
+
+ Deletes the requested shipments.
+
+ The identifier for the shipment which should be
+ deleted.
+
+
+ The status of the deletion operation.
+
+
+
+ Manifest the requested DD shipments.
+
+ The identifier for the shipment which should be
+ manifested.
+
+
+ The status of the manifest operation.
+
+
+
+ Returns the request-url for getting a label.
+
+ The identifier for the shipment for which the label url is
+ requested.
+
+
+ The status of the operation and the label url (if
+ available).
+
+
+
+ Returns the actual version of the implementation of the whole ISService
+ webservice.
+
+
+ The version of webservice implementation.
+
+
+
+ Returns the request-url for getting a export
+ document.
+
+ The identifier for the shipment for which the export document url is
+ requested.
+
+
+ The status of the operation and the export document url (if
+ available).
+
+
+
+ Request the manifest.
+
+ The request data.
+
+
+ The status of the getManifest operation and the manifest
+ url.
+
+
+
+ Updates a shipment order.
+
+ The shipment data.
+
+
+ The status of the updateShipment operation and the identifier for the
+ shipment.
+
+
+
+
+
+
+ Creates shipments.
+
+
+ The authentication data and the shipment data.
+
+
+
+
+ The status of the operation and the shipment
+ identifier.
+
+
+
+
+ Validates shipments.
+
+
+ The authentication data and the shipment data.
+
+
+
+
+ The status of the operation and the shipment
+ identifier.
+
+
+
+
+ Deletes the requested shipments.
+
+
+ The authentication data and the shipment
+ identifier.
+
+
+
+
+ The status of the operation.
+
+
+
+
+ Manifest the requested shipments.
+
+
+ The authentication data and the shipment
+ identifier.
+
+
+
+
+ The status of the operation.
+
+
+
+
+ Returns the request-url for getting a label.
+
+
+ The authentication data and the shipment
+ identifier.
+
+
+
+
+ The status of the operation and the url for requesting the
+ label.
+
+
+
+
+ Returns the actual version of the implementation of the whole ISService
+ webservice.
+
+
+
+
+
+ The version of the implementation.
+
+
+
+
+ Returns the request-url for getting a export
+ document.
+
+
+ The authentication data and the shipment
+ identifier.
+
+
+
+
+ The status of the operation and the url for requesting the export
+ document.
+
+
+
+
+ Requests the manifest.
+
+
+ The authentication data and the shipment data.
+
+
+
+
+ The status of the operation and the manifest url.
+
+
+
+
+ Updates a shipment order.
+
+
+ The authentication data and the shipment data.
+
+
+
+
+ The status of the operation
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-dhl/assets/wsdl/standortsuche-api-1.1.wsdl b/packages/woocommerce-germanized-dhl/assets/wsdl/standortsuche-api-1.1.wsdl
new file mode 100644
index 000000000..b15253ee7
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/assets/wsdl/standortsuche-api-1.1.wsdl
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/woocommerce-germanized-dhl/i18n/holidays.php b/packages/woocommerce-germanized-dhl/i18n/holidays.php
new file mode 100644
index 000000000..84ef9f13b
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/i18n/holidays.php
@@ -0,0 +1,57 @@
+ array(
+ '2022-01-06',
+ '2022-06-16',
+ '2022-04-17',
+ '2022-03-08',
+ '2022-11-01',
+ '2022-05-26',
+ '2022-05-01',
+ '2022-12-26',
+ '2022-10-03',
+ '2022-09-20',
+ '2022-08-08',
+ '2022-11-16',
+ '2022-01-01',
+ '2022-10-31',
+ '2022-06-06',
+ '2022-08-15',
+ '2022-04-15',
+ '2022-12-25',
+ '2022-04-14',
+ '2022-06-05',
+ '2022-04-18',
+ '2023-01-06',
+ '2023-06-08',
+ '2023-04-09',
+ '2023-03-08',
+ '2023-11-01',
+ '2023-05-18',
+ '2023-05-01',
+ '2023-12-26',
+ '2023-10-03',
+ '2023-09-20',
+ '2023-08-08',
+ '2023-11-22',
+ '2023-01-01',
+ '2023-10-31',
+ '2023-05-29',
+ '2023-08-15',
+ '2023-04-07',
+ '2023-12-25',
+ '2023-04-06',
+ '2023-05-28',
+ '2023-04-10',
+ ),
+);
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-dhl/i18n/iso.php b/packages/woocommerce-germanized-dhl/i18n/iso.php
new file mode 100644
index 000000000..f5c16260e
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/i18n/iso.php
@@ -0,0 +1,260 @@
+ 'AFG',
+ 'AX' => 'ALA',
+ 'AL' => 'ALB',
+ 'DZ' => 'DZA',
+ 'AS' => 'ASM',
+ 'AD' => 'AND',
+ 'AO' => 'AGO',
+ 'AI' => 'AIA',
+ 'AQ' => 'ATA',
+ 'AG' => 'ATG',
+ 'AR' => 'ARG',
+ 'AM' => 'ARM',
+ 'AW' => 'ABW',
+ 'AU' => 'AUS',
+ 'AT' => 'AUT',
+ 'AZ' => 'AZE',
+ 'BS' => 'BHS',
+ 'BH' => 'BHR',
+ 'BD' => 'BGD',
+ 'BB' => 'BRB',
+ 'BY' => 'BLR',
+ 'BE' => 'BEL',
+ 'BZ' => 'BLZ',
+ 'BJ' => 'BEN',
+ 'BM' => 'BMU',
+ 'BT' => 'BTN',
+ 'BO' => 'BOL',
+ 'BA' => 'BIH',
+ 'BW' => 'BWA',
+ 'BV' => 'BVT',
+ 'BR' => 'BRA',
+ 'VG' => 'VGB',
+ 'IO' => 'IOT',
+ 'BN' => 'BRN',
+ 'BG' => 'BGR',
+ 'BF' => 'BFA',
+ 'BI' => 'BDI',
+ 'KH' => 'KHM',
+ 'CM' => 'CMR',
+ 'CA' => 'CAN',
+ 'CV' => 'CPV',
+ 'KY' => 'CYM',
+ 'CF' => 'CAF',
+ 'TD' => 'TCD',
+ 'CL' => 'CHL',
+ 'CN' => 'CHN',
+ 'HK' => 'HKG',
+ 'MO' => 'MAC',
+ 'CX' => 'CXR',
+ 'CC' => 'CCK',
+ 'CO' => 'COL',
+ 'KM' => 'COM',
+ 'CG' => 'COG',
+ 'CD' => 'COD',
+ 'CK' => 'COK',
+ 'CR' => 'CRI',
+ 'CI' => 'CIV',
+ 'HR' => 'HRV',
+ 'CU' => 'CUB',
+ 'CY' => 'CYP',
+ 'CZ' => 'CZE',
+ 'DK' => 'DNK',
+ 'DJ' => 'DJI',
+ 'DM' => 'DMA',
+ 'DO' => 'DOM',
+ 'EC' => 'ECU',
+ 'EG' => 'EGY',
+ 'SV' => 'SLV',
+ 'GQ' => 'GNQ',
+ 'ER' => 'ERI',
+ 'EE' => 'EST',
+ 'ET' => 'ETH',
+ 'FK' => 'FLK',
+ 'FO' => 'FRO',
+ 'FJ' => 'FJI',
+ 'FI' => 'FIN',
+ 'FR' => 'FRA',
+ 'GF' => 'GUF',
+ 'PF' => 'PYF',
+ 'TF' => 'ATF',
+ 'GA' => 'GAB',
+ 'GM' => 'GMB',
+ 'GE' => 'GEO',
+ 'DE' => 'DEU',
+ 'GH' => 'GHA',
+ 'GI' => 'GIB',
+ 'GR' => 'GRC',
+ 'GL' => 'GRL',
+ 'GD' => 'GRD',
+ 'GP' => 'GLP',
+ 'GU' => 'GUM',
+ 'GT' => 'GTM',
+ 'GG' => 'GGY',
+ 'GN' => 'GIN',
+ 'GW' => 'GNB',
+ 'GY' => 'GUY',
+ 'HT' => 'HTI',
+ 'HM' => 'HMD',
+ 'VA' => 'VAT',
+ 'HN' => 'HND',
+ 'HU' => 'HUN',
+ 'IS' => 'ISL',
+ 'IN' => 'IND',
+ 'ID' => 'IDN',
+ 'IR' => 'IRN',
+ 'IQ' => 'IRQ',
+ 'IE' => 'IRL',
+ 'IM' => 'IMN',
+ 'IL' => 'ISR',
+ 'IT' => 'ITA',
+ 'JM' => 'JAM',
+ 'JP' => 'JPN',
+ 'JE' => 'JEY',
+ 'JO' => 'JOR',
+ 'KZ' => 'KAZ',
+ 'KE' => 'KEN',
+ 'KI' => 'KIR',
+ 'KP' => 'PRK',
+ 'KR' => 'KOR',
+ 'KW' => 'KWT',
+ 'KG' => 'KGZ',
+ 'LA' => 'LAO',
+ 'LV' => 'LVA',
+ 'LB' => 'LBN',
+ 'LS' => 'LSO',
+ 'LR' => 'LBR',
+ 'LY' => 'LBY',
+ 'LI' => 'LIE',
+ 'LT' => 'LTU',
+ 'LU' => 'LUX',
+ 'MK' => 'MKD',
+ 'MG' => 'MDG',
+ 'MW' => 'MWI',
+ 'MY' => 'MYS',
+ 'MV' => 'MDV',
+ 'ML' => 'MLI',
+ 'MT' => 'MLT',
+ 'MH' => 'MHL',
+ 'MQ' => 'MTQ',
+ 'MR' => 'MRT',
+ 'MU' => 'MUS',
+ 'YT' => 'MYT',
+ 'MX' => 'MEX',
+ 'FM' => 'FSM',
+ 'MD' => 'MDA',
+ 'MC' => 'MCO',
+ 'MN' => 'MNG',
+ 'ME' => 'MNE',
+ 'MS' => 'MSR',
+ 'MA' => 'MAR',
+ 'MZ' => 'MOZ',
+ 'MM' => 'MMR',
+ 'NA' => 'NAM',
+ 'NR' => 'NRU',
+ 'NP' => 'NPL',
+ 'NL' => 'NLD',
+ 'AN' => 'ANT',
+ 'NC' => 'NCL',
+ 'NZ' => 'NZL',
+ 'NI' => 'NIC',
+ 'NE' => 'NER',
+ 'NG' => 'NGA',
+ 'NU' => 'NIU',
+ 'NF' => 'NFK',
+ 'MP' => 'MNP',
+ 'NO' => 'NOR',
+ 'OM' => 'OMN',
+ 'PK' => 'PAK',
+ 'PW' => 'PLW',
+ 'PS' => 'PSE',
+ 'PA' => 'PAN',
+ 'PG' => 'PNG',
+ 'PY' => 'PRY',
+ 'PE' => 'PER',
+ 'PH' => 'PHL',
+ 'PN' => 'PCN',
+ 'PL' => 'POL',
+ 'PT' => 'PRT',
+ 'PR' => 'PRI',
+ 'QA' => 'QAT',
+ 'RE' => 'REU',
+ 'RO' => 'ROU',
+ 'RU' => 'RUS',
+ 'RW' => 'RWA',
+ 'BL' => 'BLM',
+ 'SH' => 'SHN',
+ 'KN' => 'KNA',
+ 'LC' => 'LCA',
+ 'MF' => 'MAF',
+ 'PM' => 'SPM',
+ 'VC' => 'VCT',
+ 'WS' => 'WSM',
+ 'SM' => 'SMR',
+ 'ST' => 'STP',
+ 'SA' => 'SAU',
+ 'SN' => 'SEN',
+ 'RS' => 'SRB',
+ 'SC' => 'SYC',
+ 'SL' => 'SLE',
+ 'SG' => 'SGP',
+ 'SK' => 'SVK',
+ 'SI' => 'SVN',
+ 'SB' => 'SLB',
+ 'SO' => 'SOM',
+ 'ZA' => 'ZAF',
+ 'GS' => 'SGS',
+ 'SS' => 'SSD',
+ 'ES' => 'ESP',
+ 'LK' => 'LKA',
+ 'SD' => 'SDN',
+ 'SR' => 'SUR',
+ 'SJ' => 'SJM',
+ 'SZ' => 'SWZ',
+ 'SE' => 'SWE',
+ 'CH' => 'CHE',
+ 'SY' => 'SYR',
+ 'TW' => 'TWN',
+ 'TJ' => 'TJK',
+ 'TZ' => 'TZA',
+ 'TH' => 'THA',
+ 'TL' => 'TLS',
+ 'TG' => 'TGO',
+ 'TK' => 'TKL',
+ 'TO' => 'TON',
+ 'TT' => 'TTO',
+ 'TN' => 'TUN',
+ 'TR' => 'TUR',
+ 'TM' => 'TKM',
+ 'TC' => 'TCA',
+ 'TV' => 'TUV',
+ 'UG' => 'UGA',
+ 'UA' => 'UKR',
+ 'AE' => 'ARE',
+ 'GB' => 'GBR',
+ 'US' => 'USA',
+ 'UM' => 'UMI',
+ 'UY' => 'URY',
+ 'UZ' => 'UZB',
+ 'VU' => 'VUT',
+ 'VE' => 'VEN',
+ 'VN' => 'VNM',
+ 'VI' => 'VIR',
+ 'WF' => 'WLF',
+ 'EH' => 'ESH',
+ 'YE' => 'YEM',
+ 'ZM' => 'ZMB',
+ 'ZW' => 'ZWE'
+);
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-dhl/includes/wc-gzd-dhl-core-functions.php b/packages/woocommerce-germanized-dhl/includes/wc-gzd-dhl-core-functions.php
new file mode 100644
index 000000000..3fab93387
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/includes/wc-gzd-dhl-core-functions.php
@@ -0,0 +1,853 @@
+get_shipment() ) {
+ return false;
+ }
+
+ $customs_data = $label->get_customs_data( $max_desc_length );
+
+ foreach( $customs_data['items'] as $key => $item ) {
+ if ( $shipment_item = $shipment->get_item( $key ) ) {
+ /**
+ * Apply legacy filters
+ */
+ $item['description'] = apply_filters( "woocommerce_gzd_dhl_customs_item_description", $item['description'], $shipment_item, $label, $shipment );
+ $item['category'] = apply_filters( "woocommerce_gzd_dhl_customs_item_category", $item['category'], $shipment_item, $label, $shipment );
+
+ $customs_data['items'][ $key ] = apply_filters( 'woocommerce_gzd_dhl_customs_item', $item, $shipment_item, $shipment, $label );
+ }
+ }
+
+ return apply_filters( "woocommerce_gzd_dhl_customs_data", $customs_data, $label, $shipment );
+}
+
+function wc_gzd_dhl_format_preferred_api_time( $time ) {
+ return str_replace( array( ':', '-' ), '', $time );
+}
+
+/**
+ * @param false|Shipment $shipment
+ *
+ * @return array
+ */
+function wc_gzd_dhl_get_label_payment_ref_placeholder( $shipment = false ) {
+ return apply_filters( 'woocommerce_gzd_dhl_label_payment_ref_placeholder', array(
+ '{shipment_id}' => $shipment ? $shipment->get_shipment_number() : '',
+ '{order_id}' => $shipment ? $shipment->get_order_number() : '',
+ '{email}' => $shipment ? $shipment->get_email() : ''
+ ) );
+}
+
+function wc_gzd_dhl_get_preferred_days_select_options( $days, $current = '' ) {
+ $preferred_days = array( 0 => _x( 'None', 'dhl day context', 'woocommerce-germanized' ) );
+
+ if ( ! empty( $days ) ) {
+ $days = array_keys( $days );
+
+ foreach( $days as $day ) {
+
+ if ( empty( $day ) ) {
+ continue;
+ }
+
+ $date = new \WC_DateTime( $day );
+ $date->setTimezone( new DateTimeZone( 'Europe/Berlin' ) );
+
+ $formatted_day = $date->date_i18n( wc_date_format() );
+ $preferred_days = array_merge( $preferred_days, array( $day => $formatted_day ) );
+ }
+ }
+
+ if ( ! empty( $current ) ) {
+ $date = new \WC_DateTime( $current );
+ $date->setTimezone( new DateTimeZone( 'Europe/Berlin' ) );
+
+ $preferred_days[ $current ] = $date->date_i18n( wc_date_format() );
+ }
+
+ return $preferred_days;
+}
+
+function wc_gzd_dhl_get_duties() {
+ $duties = array(
+ 'DDU' => _x( 'Delivery Duty Unpaid', 'dhl', 'woocommerce-germanized' ),
+ 'DDP' => _x( 'Delivery Duty Paid', 'dhl', 'woocommerce-germanized' ),
+ 'DXV' => _x( 'Delivery Duty Paid (excl. VAT )', 'dhl', 'woocommerce-germanized' ),
+ 'DDX' => _x( 'Delivery Duty Paid (excl. Duties, taxes and VAT)', 'dhl', 'woocommerce-germanized' )
+ );
+
+ return $duties;
+}
+
+function wc_gzd_dhl_is_valid_visual_min_age( $min_age ) {
+ $ages = wc_gzd_dhl_get_visual_min_ages();
+
+ if ( empty( $min_age ) || ( ! array_key_exists( $min_age, $ages ) && ! in_array( $min_age, $ages ) ) ) {
+ return false;
+ }
+
+ return true;
+}
+
+function wc_gzd_dhl_is_valid_ident_min_age( $min_age ) {
+ $ages = wc_gzd_dhl_get_ident_min_ages();
+
+ if ( empty( $min_age ) || ( ! array_key_exists( $min_age, $ages ) && ! in_array( $min_age, $ages ) ) ) {
+ return false;
+ }
+
+ return true;
+}
+
+function wc_gzd_dhl_get_visual_min_ages() {
+ $visual_age = array(
+ '0' => _x( 'None', 'age context', 'woocommerce-germanized' ),
+ 'A16' => _x( 'Minimum age of 16', 'dhl', 'woocommerce-germanized' ),
+ 'A18' => _x( 'Minimum age of 18', 'dhl', 'woocommerce-germanized' )
+ );
+
+ return $visual_age;
+}
+
+function wc_gzd_dhl_get_ident_min_ages() {
+ return wc_gzd_dhl_get_visual_min_ages();
+}
+
+function wc_gzd_dhl_get_label_reference( $reference_text, $placeholders = array() ) {
+ return str_replace( array_keys( $placeholders ), array_values( $placeholders ), $reference_text );
+}
+
+/**
+ * @param Label\Label $label
+ * @param Shipment $shipment
+ *
+ * @return string
+ */
+function wc_gzd_dhl_get_label_customer_reference( $label, $shipment ) {
+ /**
+ * Filter to adjust the customer reference field placed on the DHL label. Maximum characeter length: 35.
+ *
+ * @param string $text The customer reference text.
+ * @param Label\Label $label The label instance.
+ * @param SimpleShipment $shipment The shipment instance.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/DHL
+ */
+ $ref = apply_filters( 'woocommerce_gzd_dhl_label_customer_reference', wc_gzd_dhl_get_label_reference( _x( 'Shipment #{shipment_id} to order {order_id}', 'dhl', 'woocommerce-germanized' ), array( '{shipment_id}' => $shipment->get_shipment_number(), '{order_id}' => $shipment->get_order_number() ) ), $label, $shipment );
+
+ return sanitize_text_field( substr( $ref, 0, 35 ) );
+}
+
+function wc_gzd_dhl_get_label_endorsement_type( $label, $shipment ) {
+ /**
+ * Filter to adjust the endorsement type for internation shipments.
+ *
+ * @param string $text The endorsement type: IMMEDIATE or AFTER_DEADLINE.
+ * @param Label\Label $label The label instance.
+ * @param SimpleShipment $shipment The shipment instance.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/DHL
+ */
+ $type = strtoupper( apply_filters( 'woocommerce_gzd_dhl_label_endorsement_type', 'IMMEDIATE', $label, $shipment ) );
+
+ if ( ! in_array( $type, array( 'IMMEDIATE', 'AFTER_DEADLINE' ) ) ) {
+ $type = 'IMMEDIATE';
+ }
+
+ return $type;
+}
+
+function wc_gzd_dhl_get_return_label_customer_reference( $label, $shipment ) {
+ /**
+ * Filter to adjust the customer reference field placed on the DHL return label. Maximum characeter length: 30.
+ *
+ * @param string $text The customer reference text.
+ * @param Label\Label $label The label instance.
+ * @param ReturnShipment $shipment The shipment instance.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/DHL
+ */
+ $ref = apply_filters( 'woocommerce_gzd_dhl_return_label_customer_reference', wc_gzd_dhl_get_label_reference( _x( 'Return #{shipment_id} to order {order_id}', 'dhl', 'woocommerce-germanized' ), array( '{shipment_id}' => $shipment->get_id(), '{order_id}' => $shipment->get_order_number() ) ), $label, $shipment );
+
+ return sanitize_text_field( substr( $ref, 0, 30 ) );
+}
+
+function wc_gzd_dhl_get_inlay_return_label_reference( $label, $shipment ) {
+ /**
+ * Filter to adjust the inlay return reference field placed on the DHL label. Maximum characeter length: 35.
+ *
+ * @param string $text The customer reference text.
+ * @param Label\Label $label The label instance.
+ * @param SimpleShipment $shipment The shipment instance.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/DHL
+ */
+ $ref = apply_filters( 'woocommerce_gzd_dhl_inlay_return_label_reference', wc_gzd_dhl_get_label_reference( _x( 'Return shipment #{shipment_id} to order #{order_id}', 'dhl', 'woocommerce-germanized' ), array( '{shipment_id}' => $shipment->get_id(), '{order_id}' => $shipment->get_order_number() ) ), $label, $shipment );
+
+ return sanitize_text_field( substr( $ref, 0, 35 ) );
+}
+
+/**
+ * @return false|\Vendidero\Germanized\DHL\ShippingProvider\ShippingMethod
+ */
+function wc_gzd_dhl_get_current_shipping_method() {
+ if ( $current = wc_gzd_get_current_shipping_method_id() ) {
+ return wc_gzd_dhl_get_shipping_method( $current );
+ }
+
+ return false;
+}
+
+function wc_gzd_dhl_get_international_services() {
+ return array(
+ 'Premium',
+ 'GoGreen',
+ 'AdditionalInsurance'
+ );
+}
+
+function wc_gzd_dhl_get_services() {
+ return array(
+ 'PreferredTime',
+ 'PreferredLocation',
+ 'PreferredNeighbour',
+ 'PreferredDay',
+ 'VisualCheckOfAge',
+ 'Personally',
+ 'NoNeighbourDelivery',
+ 'NamedPersonOnly',
+ 'Premium',
+ 'AdditionalInsurance',
+ 'BulkyGoods',
+ 'IdentCheck',
+ 'CashOnDelivery',
+ 'ParcelOutletRouting',
+ 'GoGreen'
+ );
+}
+
+/**
+ * @param $instance_id
+ *
+ * @return \Vendidero\Germanized\DHL\ShippingProvider\ShippingMethod
+ */
+function wc_gzd_dhl_get_shipping_method( $instance_id ) {
+ $method = wc_gzd_get_shipping_provider_method( $instance_id );
+ return new \Vendidero\Germanized\DHL\ShippingProvider\ShippingMethod( $method );
+}
+
+function wc_gzd_dhl_get_deutsche_post_shipping_method( $instance_id ) {
+ return wc_gzd_dhl_get_shipping_method( $instance_id );
+}
+
+function wc_gzd_dhl_get_preferred_services() {
+ return array(
+ 'PreferredTime',
+ 'PreferredLocation',
+ 'PreferredNeighbour',
+ 'PreferredDay',
+ );
+}
+
+function wc_gzd_dhl_get_pickup_types() {
+ return array(
+ 'packstation' => _x( 'Packstation', 'dhl', 'woocommerce-germanized' ),
+ 'postoffice' => _x( 'Postfiliale', 'dhl', 'woocommerce-germanized' ),
+ 'parcelshop' => _x( 'Postfiliale', 'dhl', 'woocommerce-germanized' )
+ );
+}
+
+function wc_gzd_dhl_is_pickup_type( $maybe_type, $type = 'packstation' ) {
+ $label = wc_gzd_dhl_get_pickup_type( $type );
+
+ if ( ! $label ) {
+ return false;
+ }
+
+ $label = strtolower( trim( $label ) );
+ $maybe_type = strtolower( trim( $maybe_type ) );
+
+ if ( strpos( $maybe_type, $label ) !== false ) {
+ return true;
+ }
+
+ return false;
+}
+
+function wc_gzd_dhl_get_excluded_working_days() {
+ $work_days = array(
+ 'mon',
+ 'tue',
+ 'wed',
+ 'thu',
+ 'fri',
+ 'sat'
+ );
+
+ $excluded = array();
+
+ foreach ( $work_days as $value ) {
+ if ( ParcelServices::is_preferred_day_excluded( $value ) ) {
+ $excluded[] = $value;
+ }
+ }
+
+ return $excluded;
+}
+
+function wc_gzd_dhl_order_has_pickup( $order ) {
+ return ParcelLocator::order_has_pickup( $order );
+}
+
+function wc_gzd_dhl_get_pickup_type( $type ) {
+ $types = wc_gzd_dhl_get_pickup_types();
+
+ if ( array_key_exists( $type, $types ) ) {
+ return $types[ $type ];
+ } elseif( in_array( $type, $types ) ) {
+ return $type;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * @param WP_Error $error
+ *
+ * @return bool
+ */
+function wc_gzd_dhl_wp_error_has_errors( $error ) {
+ if ( is_callable( array( $error, 'has_errors' ) ) ) {
+ return $error->has_errors();
+ } else {
+ $errors = $error->errors;
+
+ return ( ! empty( $errors ) ? true : false );
+ }
+}
+
+function wc_gzd_dhl_is_valid_datetime( $maybe_datetime, $format = 'Y-m-d' ) {
+ if ( ! is_a( $maybe_datetime, 'DateTime' && ! is_numeric( $maybe_datetime ) ) ) {
+ if ( ! DateTime::createFromFormat( $format, $maybe_datetime ) ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function wc_gzd_dhl_format_label_state( $state, $country ) {
+ // If not USA or Australia, then change state from ISO code to name
+ if ( ! in_array( $country, array( 'US', 'AU' ) ) ) {
+
+ // Get all states for a country
+ $states = WC()->countries->get_states( $country );
+
+ // If the state is empty, it was entered as free text
+ if ( ! empty( $states ) && ! empty( $state ) ) {
+ // Change the state to be the name and not the code
+ $state = $states[ $state ];
+
+ // Remove anything in parentheses (e.g. TH)
+ $ind = strpos( $state, " (" );
+
+ if ( false !== $ind ) {
+ $state = substr( $state, 0, $ind );
+ }
+ }
+ }
+
+ return $state;
+}
+
+/**
+ * @param $the_product
+ *
+ * @return \Vendidero\Germanized\Shipments\Product
+ */
+function wc_gzd_dhl_get_product( $the_product ) {
+ return wc_gzd_shipments_get_product( $the_product );
+}
+
+/**
+ * @param Shipment $shipment
+ */
+function wc_gzd_dhl_get_label_shipment_address_addition( $shipment ) {
+ $addition = $shipment->get_address_2();
+ $street_addition = $shipment->get_address_street_addition();
+
+ if ( ! empty( $street_addition ) ) {
+ $addition = $street_addition . ( ! empty( $addition ) ? ' ' . $addition : '' );
+ }
+
+ return trim( $addition );
+}
+
+/**
+ * @param Shipment $shipment
+ *
+ * @return mixed
+ */
+function wc_gzd_dhl_get_label_shipment_street_number( $shipment ) {
+ $street_number = $shipment->get_address_street_number();
+
+ if ( ! Package::is_shipping_domestic( $shipment->get_country(), $shipment->get_postcode() ) ) {
+
+ if ( empty( $street_number ) ) {
+ /**
+ * Filter to adjust the placeholder used as street number for the DHL API in case
+ * the shipment is not domestic (inner Germnany) and a street number was not provided.
+ *
+ * @param string $placeholder The placeholder to use - default 0 as advised by DHL support.
+ *
+ * @since 3.1.0
+ * @package Vendidero/Germanized/DHL
+ */
+ $street_number = apply_filters( 'woocommerce_gzd_dhl_label_shipment_street_number_placeholder', '0' );
+ }
+ }
+
+ return $street_number;
+}
+
+/**
+ * @param \Vendidero\Germanized\DHL\Label\ReturnLabel $label
+ */
+function wc_gzd_dhl_get_return_label_sender_street_number( $label ) {
+ $street_number = $label->get_sender_street_number();
+
+ if ( ! Package::is_shipping_domestic( $label->get_sender_country(), $label->get_sender_postcode() ) ) {
+ if ( empty( $street_number ) ) {
+ /**
+ * This filter is documented in includes/wc-gzd-dhl-core-functions.php
+ */
+ $street_number = apply_filters( 'woocommerce_gzd_dhl_label_shipment_street_number_placeholder', '0' );
+ }
+ }
+
+ return $street_number;
+}
+
+function wc_gzd_dhl_get_product_services( $product ) {
+ if ( in_array( $product, array_keys( wc_gzd_dhl_get_products_domestic() ) ) ) {
+ $services = wc_gzd_dhl_get_services();
+ } else {
+ $services = wc_gzd_dhl_get_international_services();
+ }
+
+ /**
+ * Warenpost does only support certain services
+ */
+ if ( 'V62WP' === $product ) {
+ $services = array_intersect( $services, array(
+ 'PreferredTime',
+ 'PreferredLocation',
+ 'PreferredNeighbour',
+ 'PreferredDay',
+ 'ParcelOutletRouting',
+ 'GoGreen'
+ ) );
+ } elseif ( 'V66WPI' === $product ) {
+ $services = array_intersect( $services, array(
+ 'Premium',
+ ) );
+ }
+
+ return $services;
+}
+
+function wc_gzd_dhl_product_supports_service( $product, $service ) {
+ $services = wc_gzd_dhl_get_product_services( $product );
+
+ if ( ! in_array( $service, $services ) ) {
+ return false;
+ }
+
+ return true;
+}
+
+function wc_gzd_dhl_get_service_product_attributes( $service ) {
+ $products_supported = array();
+
+ foreach( array_keys( array_merge( wc_gzd_dhl_get_products_domestic(), wc_gzd_dhl_get_products_eu(), wc_gzd_dhl_get_products_international() ) ) as $product ) {
+ if ( wc_gzd_dhl_product_supports_service( $product, $service ) ) {
+ $products_supported[] = $product;
+ }
+ }
+
+ return array(
+ 'data-products-supported' => implode( ',', $products_supported )
+ );
+}
+
+/**
+ * @param Shipment $shipment
+ *
+ * @return array
+ */
+function wc_gzd_dhl_get_deutsche_post_products( $shipment, $parent_only = true ) {
+ $country = $shipment->get_country();
+ $postcode = $shipment->get_postcode();
+
+ if ( 'return' === $shipment->get_type() ) {
+ $country = $shipment->get_sender_country();
+ $postcode = $shipment->get_sender_postcode();
+ }
+
+ if ( Package::is_shipping_domestic( $country, $postcode ) ) {
+ return wc_gzd_dhl_get_deutsche_post_products_domestic( $shipment, $parent_only );
+ } elseif ( Package::is_eu_shipment( $country, $postcode ) ) {
+ return wc_gzd_dhl_get_deutsche_post_products_eu( $shipment, $parent_only );
+ } else {
+ return wc_gzd_dhl_get_deutsche_post_products_international( $shipment, $parent_only );
+ }
+}
+
+/**
+ * @param Shipment|false $shipment
+ *
+ * @return array
+ */
+function wc_gzd_dhl_get_deutsche_post_products_domestic( $shipment = false, $parent_only = true ) {
+ $dom = Package::get_internetmarke_api()->get_available_products( array(
+ 'product_destination' => 'national',
+ 'shipment_weight' => $shipment ? wc_gzd_dhl_get_shipment_weight( $shipment, 'g' ) : false,
+ ) );
+
+ return wc_gzd_dhl_im_get_product_list( $dom, $parent_only );
+}
+
+function wc_gzd_dhl_im_get_product_list( $products, $parent_only = true ) {
+ $list = array();
+ $additional_parent_products = array();
+
+ foreach( $products as $product ) {
+ if ( $parent_only && $product->product_parent_id > 0 ) {
+ $additional_parent_products[] = $product->product_parent_id;
+ continue;
+ }
+
+ $list[ $product->product_code ] = wc_gzd_dhl_get_im_product_title( $product->product_name );
+ }
+
+ $additional_parent_products = array_unique( $additional_parent_products );
+
+ if ( ! empty( $additional_parent_products ) ) {
+ foreach( $additional_parent_products as $product_id ) {
+ $product = Package::get_internetmarke_api()->get_product_data( $product_id );
+
+ if ( ! array_key_exists( $product->product_code, $list ) ) {
+ $list[ $product->product_code ] = wc_gzd_dhl_get_im_product_title( $product->product_name );
+ }
+ }
+ }
+
+ return $list;
+}
+
+function wc_gzd_dhl_get_deutsche_post_products_eu( $shipment = false, $parent_only = true ) {
+ $non_warenpost = Package::get_internetmarke_api()->get_available_products( array(
+ 'product_destination' => 'international',
+ 'product_is_wp_int' => 0,
+ 'shipment_weight' => $shipment ? wc_gzd_dhl_get_shipment_weight( $shipment, 'g' ) : false,
+ ) );
+
+ $warenpost = Package::get_internetmarke_api()->get_available_products( array(
+ 'product_destination' => 'eu',
+ 'product_is_wp_int' => 1,
+ 'shipment_weight' => $shipment ? wc_gzd_dhl_get_shipment_weight( $shipment, 'g' ) : false,
+ ) );
+
+ $international = array_merge( $non_warenpost, $warenpost );
+
+ return wc_gzd_dhl_im_get_product_list( $international, $parent_only );
+}
+
+/**
+ * @param Shipment|false $shipment
+ *
+ * @return array
+ */
+function wc_gzd_dhl_get_deutsche_post_products_international( $shipment = false, $parent_only = true ) {
+ if ( $shipment && Package::is_eu_shipment( $shipment->get_country(), $shipment->get_postcode() ) ) {
+ return wc_gzd_dhl_get_deutsche_post_products_eu( $shipment );
+ } else {
+ $international = Package::get_internetmarke_api()->get_available_products( array(
+ 'product_destination' => 'international',
+ 'shipment_weight' => $shipment ? wc_gzd_dhl_get_shipment_weight( $shipment, 'g' ) : false,
+ ) );
+
+ return wc_gzd_dhl_im_get_product_list( $international, $parent_only );
+ }
+}
+
+/**
+ * @param Label\DHL $label
+ * @param string $type
+ *
+ * @return mixed|string|void
+ * @see https://entwickler.dhl.de/group/ep/grundlagen2
+ */
+function wc_gzd_dhl_get_custom_label_format( $label, $type = '' ) {
+ $available = array(
+ 'A4',
+ '910-300-700',
+ '910-300-700-oZ',
+ '910-300-710',
+ '910-300-600',
+ '910-300-610',
+ '910-300-400',
+ '910-300-410',
+ '910-300-300',
+ );
+
+ /**
+ * This filter allows adjusting the default label format (GUI) to a custom format e.g. 910-300-700.
+ * The following formats are available:
+ *
+ *
+ ';
+ } else {
+ echo ' ' . esc_html_x( 'Unable to connect to the URL. Please make sure that your webhost allows outgoing connections to that specific URL.', 'dhl', 'woocommerce-germanized' ) . '';
+ }
+ ?>
+
SOAPClient is required. Please contact your host and make sure that SOAPClient is installed.', 'dhl', 'woocommerce-germanize-dhl' ), 'https://www.php.net/manual/class.soapclient.php', admin_url( 'admin.php?page=wc-status' ) ); ?>
' . sprintf( _x( 'Your username (not your email address) to the DHL business customer portal. Please make sure to test your access data in advance %s.', 'dhl', 'woocommerce-germanized' ), '' . _x( 'here', 'dhl', 'woocommerce-germanized' ) . '' ) . '
' . sprintf( _x( 'Your password to the DHL business customer portal. Please note the new assignment of the password to 3 (Standard User) or 12 (System User) months and make sure to test your access data in advance %s.', 'dhl', 'woocommerce-germanized' ), '' . _x( 'here', 'dhl', 'woocommerce-germanized' ) .'' ) . '
' . sprintf( _x( 'Your username (not your email address) to the DHL developer portal. Please make sure to test your access data in advance %s.', 'dhl', 'woocommerce-germanized' ), '' . _x( 'here', 'dhl', 'woocommerce-germanized' ) . '' ) . '
' . _x( 'Enable this option to let your customers choose a pickup option from a map within the checkout. If this option is disabled a link to the DHL website is placed instead.', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Enabling this option will display options for the user to select their delivery day of delivery during the checkout.', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Enabling this option will display options for the user to select their preferred delivery location during the checkout.', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Enabling this option will display options for the user to deliver to their preferred neighbor during the checkout.', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'The cut-off time is the latest possible order time up to which the minimum delivery day (day of order + 2 working days) can be guaranteed. As soon as the time is exceeded, the earliest delivery day displayed in the frontend will be shifted to one day later (day of order + 3 working days).', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'If you need more time to prepare your shipments you might want to add a static preparation time to the possible starting date for delivery day delivery.', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Please select your default DHL shipping service for domestic shipments that you want to offer to your customers (you can always change this within each individual shipment afterwards).', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Please select your default DHL shipping service for EU shipments that you want to offer to your customers (you can always change this within each individual shipment afterwards).', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Please select your default DHL shipping service for cross-border shipments that you want to offer to your customers (you can always change this within each individual shipment afterwards).', 'dhl', 'woocommerce-germanized' ) . '
' . sprintf( _x( 'By default the customer email address is only transferred in case explicit consent has been given via a checkbox during checkout. You may force to transfer the customer email address during label creation to make sure your customers receive email notifications by DHL. Make sure to check your privacy policy and seek advice by a lawyer in case of doubt.', 'dhl', 'woocommerce-germanized' ), 'https://www.dhl.de/de/geschaeftskunden/paket/versandsoftware/dhl-paketankuendigung/formular.html' ) . '
' . sprintf( _x( 'Choose this option if you want to use a custom address profile managed within your DHL business profile as shipper reference for your labels.', 'dhl', 'woocommerce-germanized' ), 'https://vendidero.de/dokument/dhl-integration-einrichten#individuelle-absenderreferenz-samt-logo-nutzen' ) . '
' . sprintf( _x( 'Insert the address reference you have chosen within the DHL business portal for your custom shipper address.', 'dhl', 'woocommerce-germanized' ), 'https://vendidero.de/dokument/dhl-integration-einrichten#individuelle-absenderreferenz-samt-logo-nutzen' ) . '
' . _x( 'By enabling this option you might generate retoure labels for return shipments and send them to your customer via email.', 'dhl', 'woocommerce-germanized' ) . '
' . sprintf( _x( 'Germanized offers an %s to be enabled for certain products and/or product categories. By checking this option labels for shipments with applicable items will automatically have the visual age check service enabled.', 'dhl', 'woocommerce-germanized' ), '' . _x( 'age verification checkbox', 'dhl', 'woocommerce-germanized' ) . '' ) . '
' . sprintf( _x( 'Germanized offers an %s to be enabled for certain products and/or product categories. By checking this option labels for shipments with applicable items will automatically have the identity check service enabled.', 'dhl', 'woocommerce-germanized' ), '' . _x( 'age verification checkbox', 'dhl', 'woocommerce-germanized' ) . '' ) . '
' . sprintf( _x( 'Use these placeholders to add info to the payment reference: %s. This text is limited to 35 characters.', 'dhl', 'woocommerce-germanized' ), '' . esc_html( $ref_placeholders_str ) . '' ) . '
' . sprintf( _x( 'Use these placeholders to add info to the payment reference: %s. This text is limited to 35 characters.', 'dhl', 'woocommerce-germanized' ), '' . esc_html( $ref_placeholders_str ) . '' ) . '
' . esc_html_x( 'Insert your DHL business customer number (EKP) here. If you are not yet a business customer you might want to create a new account first.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'To create labels and embed DHL services, our software needs access to the API. You will need to fill out the username and password fields accordingly.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'If you want to provide your customers with inlay return labels for your shipments you might enable this feature by default here.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'If you want to create DHL labels to returns you should activate this feature. Make sure that you have DHL Online Retoure activated in your contract.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'Use this feature to sync the Germanized age verification checkbox with the DHL visual minimum age verification service. As soon as applicable products are contained within the shipment, the service will be booked by default.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'You might want to save some time and let Germanized generate labels automatically as soon as a shipment switches to a certain status.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'Let your customers choose a delivery day (if the service is available at the customer\'s location) of delivery within your checkout.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'Allow your customers to send their parcels to a drop-off location e.g. a neighbor. This service is free of charge for DHL shipments.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'Allow your customers to choose packstation (and/or other DHL location types as configured below) as shipping address.', 'dhl', 'woocommerce-germanized' ) . '
' . esc_html_x( 'This option adds a map overlay view to let your customers choose a DHL location from a map nearby. You\'ll need a valid Google Maps API key to enable the map view.', 'dhl', 'woocommerce-germanized' ) . '
',
+ 'position' => array(
+ 'edge' => 'left',
+ 'align' => 'left',
+ ),
+ ),
+ ),
+ )
+ );
+ }
+
+ return $pointers;
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-dhl/src/ShippingProvider/DeutschePost.php b/packages/woocommerce-germanized-dhl/src/ShippingProvider/DeutschePost.php
new file mode 100644
index 000000000..1233b0c20
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/src/ShippingProvider/DeutschePost.php
@@ -0,0 +1,659 @@
+get_shipping_country() ) {
+ return false;
+ }
+
+ return parent::supports_customer_returns( $order );
+ }
+
+ public function supports_labels( $label_type, $shipment = false ) {
+ $label_types = array( 'simple', 'return' );
+
+ /**
+ * Return labels are only supported for DE
+ */
+ if ( 'return' === $label_type && $shipment && 'return' === $shipment->get_type() && 'DE' !== $shipment->get_sender_country() ) {
+ return false;
+ }
+
+ return in_array( $label_type, $label_types );
+ }
+
+ public function get_title( $context = 'view' ) {
+ return _x( 'Deutsche Post', 'dhl', 'woocommerce-germanized' );
+ }
+
+ public function get_name( $context = 'view' ) {
+ return 'deutsche_post';
+ }
+
+ public function get_description( $context = 'view' ) {
+ return _x( 'Integration for products of the Deutsche Post through Internetmarke.', 'dhl', 'woocommerce-germanized' );
+ }
+
+ public function get_default_tracking_url_placeholder() {
+ return 'https://www.deutschepost.de/sendung/simpleQueryResult.html?form.sendungsnummer={tracking_id}&form.einlieferungsdatum_tag={label_date_day}&form.einlieferungsdatum_monat={label_date_month}&form.einlieferungsdatum_jahr={label_date_year}';
+ }
+
+ public function get_api_username( $context = 'view' ) {
+ return $this->get_meta( 'api_username', true, $context );
+ }
+
+ public function set_api_username( $username ) {
+ $this->update_meta_data( 'api_username', strtolower( $username ) );
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ public function get_available_label_products( $shipment ) {
+ return wc_gzd_dhl_get_deutsche_post_products( $shipment );
+ }
+
+ protected function get_available_base_countries() {
+ return Package::get_available_countries();
+ }
+
+ protected function get_general_settings( $for_shipping_method = false ) {
+ $settings = array(
+ array( 'title' => '', 'type' => 'title', 'id' => 'deutsche_post_general_options' ),
+
+ array(
+ 'title' => _x( 'Username', 'dhl', 'woocommerce-germanized' ),
+ 'type' => 'text',
+ 'desc' => '
' . sprintf( _x( 'Your credentials to the Portokasse. Please test your credentials before connecting.', 'dhl', 'woocommerce-germanized' ), 'https://portokasse.deutschepost.de/portokasse/#!/' ) . '
' . sprintf( _x( 'Choose the products you want to be available for your shipments from the list above. Manually refresh the product list to make sure it is up-to-date.', 'dhl', 'woocommerce-germanized' ), wp_nonce_url( add_query_arg( array( 'action' => 'wc-gzd-dhl-im-product-refresh' ), $settings_url ), 'wc-gzd-dhl-refresh-im-products' ) ) . '
' . _x( 'Please select your default shipping service for domestic shipments that you want to offer to your customers (you can always change this within each individual shipment afterwards).', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Please select your default shipping service for EU shipments that you want to offer to your customers.', 'dhl', 'woocommerce-germanized' ) . '
' . _x( 'Please select your default shipping service for cross-border shipments that you want to offer to your customers.', 'dhl', 'woocommerce-germanized' ) . '
' . sprintf( _x( 'Choose a print format which will be selected by default when creating labels. Manually refresh available print formats to make sure the list is up-to-date.', 'dhl', 'woocommerce-germanized' ), wp_nonce_url( add_query_arg( array( 'action' => 'wc-gzd-dhl-im-page-formats-refresh' ), $settings_url ), 'wc-gzd-dhl-refresh-im-page-formats' ) ) . '
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-dhl/templates/checkout/dhl/preferred-services.php b/packages/woocommerce-germanized-dhl/templates/checkout/dhl/preferred-services.php
new file mode 100644
index 000000000..689f3f643
--- /dev/null
+++ b/packages/woocommerce-germanized-dhl/templates/checkout/dhl/preferred-services.php
@@ -0,0 +1,109 @@
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipment-content.php b/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipment-content.php
new file mode 100644
index 000000000..ac9304d74
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipment-content.php
@@ -0,0 +1,254 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipment-list.php b/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipment-list.php
new file mode 100644
index 000000000..a3d4852c7
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipment-list.php
@@ -0,0 +1,32 @@
+get_return_shipments();
+?>
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipments.php b/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipments.php
new file mode 100644
index 000000000..a3cbab2b7
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/includes/admin/views/html-order-shipments.php
@@ -0,0 +1,93 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/includes/admin/views/label/html-shipment-label-backbone-error.php b/packages/woocommerce-germanized-shipments/includes/admin/views/label/html-shipment-label-backbone-error.php
new file mode 100644
index 000000000..5711b55f3
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/includes/admin/views/label/html-shipment-label-backbone-error.php
@@ -0,0 +1,22 @@
+
+
+
+
+ get_error_messages() as $message ) : ?>
+
+
+
+
+
+
diff --git a/packages/woocommerce-germanized-shipments/includes/admin/views/label/html-shipment-label-backbone-form.php b/packages/woocommerce-germanized-shipments/includes/admin/views/label/html-shipment-label-backbone-form.php
new file mode 100644
index 000000000..1c63ed09f
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/includes/admin/views/label/html-shipment-label-backbone-form.php
@@ -0,0 +1,17 @@
+
+
' . esc_html_x( 'Currently you cannot add new return requests to that order. If you have questions regarding the return of that order please contact us for further information.', 'shipments', 'woocommerce-germanized' ) . ( is_user_logged_in() ? ' ' . esc_html_x( 'View order', 'shipments', 'woocommerce-germanized' ) . '' : '' ) . '
';
+ return;
+ }
+
+ $notices = function_exists( 'wc_print_notices' ) ? wc_print_notices( true ) : '';
+
+ // Output notices in case notices have not been outputted yet.
+ if ( ! empty( $notices ) ) {
+ echo '
' . esc_html_x( 'You may find all the available shipping providers as a list here. Click on the link to edit the provider-specific settings.', 'shipments', 'woocommerce-germanized' ) . '
' . esc_html_x( 'You may want to manually add a new shipping provider in case an automatic integration does not exist.', 'shipments', 'woocommerce-germanized' ) . '
' . esc_html_x( 'To view all your existing shipments in a list you might follow this link or click on the shipments link within the WooCommerce sub-menu.', 'shipments', 'woocommerce-germanized' ) . '
' . esc_html_x( 'By enabling this option customers receive an email notification as soon as a shipment is marked as shipped.', 'shipments', 'woocommerce-germanized' ) . '
' . esc_html_x( 'Decide whether you want to automatically create shipments to orders reaching a specific status. You can always adjust your shipments by manually editing the shipment within the edit order screen.', 'shipments', 'woocommerce-germanized' ) . '
',
+ 'id' => 'woocommerce_gzd_shipments_notify_enable',
+ 'default' => 'yes',
+ 'type' => 'gzd_toggle',
+ ),
+
+ array(
+ 'title' => _x( 'Default provider', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Select a default shipping provider which will be selected by default in case no provider could be determined automatically.', 'shipments', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_gzd_shipments_default_shipping_provider',
+ 'default' => '',
+ 'type' => 'select',
+ 'options' => wc_gzd_get_shipping_provider_select(),
+ 'class' => 'wc-enhanced-select',
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'shipments_options' ),
+
+ array( 'title' => _x( 'Automation', 'shipments', 'woocommerce-germanized' ), 'type' => 'title', 'id' => 'shipments_auto_options' ),
+
+ array(
+ 'title' => _x( 'Enable', 'shipments', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Automatically create shipments for orders.', 'shipments', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_gzd_shipments_auto_enable',
+ 'default' => 'yes',
+ 'type' => 'gzd_toggle',
+ ),
+
+ array(
+ 'title' => _x( 'Order statuses', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Create shipments as soon as the order reaches one of the following status(es).', 'shipments', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_gzd_shipments_auto_statuses',
+ 'default' => array( 'wc-processing', 'wc-on-hold' ),
+ 'class' => 'wc-enhanced-select-nostd',
+ 'options' => wc_get_order_statuses(),
+ 'type' => 'multiselect',
+ 'custom_attributes' => array(
+ 'data-show_if_woocommerce_gzd_shipments_auto_enable' => '',
+ 'data-placeholder' => _x( 'On new order creation', 'shipments', 'woocommerce-germanized' )
+ ),
+ ),
+
+ array(
+ 'title' => _x( 'Default status', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Choose a default status for the automatically created shipment.', 'shipments', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_gzd_shipments_auto_default_status',
+ 'default' => 'gzd-processing',
+ 'class' => 'wc-enhanced-select',
+ 'options' => $statuses,
+ 'type' => 'select',
+ 'custom_attributes' => array(
+ 'data-show_if_woocommerce_gzd_shipments_auto_enable' => '',
+ ),
+ ),
+
+ array(
+ 'title' => _x( 'Update status', 'shipments', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Mark order as completed after order is fully shipped.', 'shipments', 'woocommerce-germanized' ) . '
' . _x( 'This option will automatically update the order status to completed as soon as all required shipments have been marked as shipped.', 'shipments', 'woocommerce-germanized' ) . '
' . _x( 'This option will automatically update contained shipments to shipped (if possible, e.g. not yet delivered) as soon as the order was marked as completed.', 'shipments', 'woocommerce-germanized' ) . '
',
+ 'id' => 'woocommerce_gzd_shipments_auto_order_completed_shipped_enable',
+ 'default' => 'no',
+ 'type' => 'gzd_toggle',
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'shipments_auto_options' ),
+
+ array( 'title' => _x( 'Returns', 'shipments', 'woocommerce-germanized' ), 'type' => 'title', 'id' => 'shipments_return_options', 'desc' => sprintf( _x( 'Returns can be added manually by the shop manager or by the customer. Decide what suits you best by turning customer-added returns on or off in your %s.', 'shipments', 'woocommerce-germanized' ), '' . _x( 'shipping provider settings', 'shipments', 'woocommerce-germanized' ) . '' ) ),
+
+ array(
+ 'type' => 'shipment_return_reasons',
+ ),
+
+ array(
+ 'title' => _x( 'Days to return', 'shipments', 'woocommerce-germanized' ),
+ 'desc' => '
' . sprintf( _x( 'In case one of your %s supports returns added by customers you might want to limit the number of days a customer is allowed to add returns to an order. The days are counted starting with the date the order was shipped, completed or created (by checking for existance in this order).', 'shipments', 'woocommerce-germanized' ), '' . _x( 'shipping providers', 'shipments', 'woocommerce-germanized' ) . '' ) . '
+
+
+ admin_handled();
+ /**
+ * Action that fires after a certain bulk action result has been rendered.
+ *
+ * The dynamic portion of this hook, `$this->get_hook_prefix()` is used to construct a
+ * unique hook for a shipment type e.g. return. In case of simple shipments the type is omitted.
+ * `$bulk_action` refers to the bulk action handled.
+ *
+ * Example hook name: woocommerce_gzd_return_shipments_table_mark_processing_handled
+ *
+ * @param BulkActionHandler $bulk_action_handler The bulk action handler.
+ * @param string $bulk_action The bulk action.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( "{$this->get_hook_prefix()}bulk_action_{$bulk_action}_handled", $handler, $bulk_action );
+ ?>
+
+ reset(); ?>
+
+
+
+ months_dropdown( 'shipment' );
+ $this->order_filter();
+
+ /**
+ * Action that fires after outputting Shipments table view filters.
+ * Might be used to add custom filters to the Shipments table view.
+ *
+ * The dynamic portion of this hook, `$this->get_hook_prefix()` is used to construct a
+ * unique hook for a shipment type e.g. return. In case of simple shipments the type is omitted.
+ *
+ * Example hook name: woocommerce_gzd_return_shipments_table_filters
+ *
+ * @param string $which top or bottom.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( "{$this->get_hook_prefix()}filters", $which );
+
+ $output = ob_get_clean();
+
+ if ( ! empty( $output ) ) {
+ echo $output;
+
+ submit_button( _x( 'Filter', 'shipments', 'woocommerce-germanized' ), '', 'filter_action', false, array( 'id' => 'shipment-query-submit' ) );
+ }
+ }
+ ?>
+
+
+
+ ';
+ $columns['title'] = _x( 'Title', 'shipments', 'woocommerce-germanized' );
+ $columns['date'] = _x( 'Date', 'shipments', 'woocommerce-germanized' );
+ $columns['status'] = _x( 'Status', 'shipments', 'woocommerce-germanized' );
+ $columns['items'] = _x( 'Items', 'shipments', 'woocommerce-germanized' );
+ $columns['address'] = _x( 'Address', 'shipments', 'woocommerce-germanized' );
+ $columns['packaging'] = _x( 'Packaging', 'shipments', 'woocommerce-germanized' );
+ $columns['weight'] = _x( 'Weight', 'shipments', 'woocommerce-germanized' );
+ $columns['dimensions'] = _x( 'Dimensions', 'shipments', 'woocommerce-germanized' );
+ $columns['order'] = _x( 'Order', 'shipments', 'woocommerce-germanized' );
+ $columns['actions'] = _x( 'Actions', 'shipments', 'woocommerce-germanized' );
+
+ return $columns;
+ }
+
+ /**
+ * @return array
+ */
+ public function get_columns() {
+ $columns = $this->get_custom_columns();
+
+ /**
+ * Filters the columns displayed in the Shipments list table.
+ *
+ * The dynamic portion of this hook, `$this->get_hook_prefix()` is used to construct a
+ * unique hook for a shipment type e.g. return. In case of simple shipments the type is omitted.
+ *
+ * Example hook name: woocommerce_gzd_return_shipments_table_edit_per_page
+ *
+ * @param string[] $columns An associative array of column headings.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ $columns = apply_filters( "{$this->get_hook_prefix()}columns", $columns );
+
+ return $columns;
+ }
+
+ /**
+ * @return array
+ */
+ protected function get_sortable_columns() {
+ return apply_filters( "{$this->get_hook_prefix()}sortable_columns", array(
+ 'date' => array( 'date_created', false ),
+ 'weight' => 'weight',
+ 'order' => 'order_id'
+ ), $this );
+ }
+
+ /**
+ * Gets the name of the default primary column.
+ *
+ * @since 4.3.0
+ *
+ * @return string Name of the default primary column, in this case, 'title'.
+ */
+ protected function get_default_primary_column_name() {
+ return 'title';
+ }
+
+ /**
+ * Handles the default column output.
+ *
+ * @since 4.3.0
+ *
+ * @param Shipment $shipment The current shipment object.
+ * @param string $column_name The current column name.
+ */
+ public function column_default( $shipment, $column_name ) {
+
+ /**
+ * Fires in each custom column in the Shipments list table.
+ *
+ * The dynamic portion of this hook, `$this->get_hook_prefix()` is used to construct a
+ * unique hook for a shipment type e.g. return. In case of simple shipments the type is omitted.
+ *
+ * Example hook name: woocommerce_gzd_return_shipments_table_filters
+ *
+ * @param string $column_name The name of the column to display.
+ * @param integer $shipment_id The current shipment id.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( "{$this->get_hook_prefix()}custom_column", $column_name, $shipment->get_id() );
+ }
+
+ public function get_main_page() {
+ return 'admin.php?page=wc-gzd-shipments';
+ }
+
+ /**
+ * Handles the post author column output.
+ *
+ * @since 4.3.0
+ *
+ * @param Shipment $shipment The current shipment object.
+ */
+ public function column_title( $shipment ) {
+
+ $title = sprintf( _x( '%s #%s', 'shipment title', 'woocommerce-germanized' ), wc_gzd_get_shipment_label_title( $shipment->get_type() ), $shipment->get_id() );
+
+ if ( $order = $shipment->get_order() ) {
+ echo '' . $title . ' ';
+ } else {
+ echo $title . ' ';
+ }
+
+ echo '
' . _x( 'Choose a shipment status which should trigger generation of a return label.', 'shipments', 'woocommerce-germanized' ) . '
',
+ 'options' => $shipment_statuses,
+ 'class' => 'wc-enhanced-select',
+ 'custom_attributes' => array( 'data-show_if_label_return_auto_enable' => '' ),
+ 'value' => $this->get_setting( 'label_return_auto_shipment_status' ),
+ )
+ ) );
+ }
+
+ $settings = array_merge( $settings, array(
+ array( 'type' => 'sectionend', 'id' => 'shipping_provider_label_auto_options' ),
+ ) );
+
+ return $settings;
+ }
+
+ public function get_settings_help_pointers( $section = '' ) {
+ return array();
+ }
+
+ protected function get_label_settings( $for_shipping_method = false ) {
+ $settings = array(
+ array( 'title' => '', 'type' => 'title', 'id' => 'shipping_provider_label_options' ),
+
+ array(
+ 'title' => _x( 'Default content weight (kg)', 'shipments', 'woocommerce-germanized' ),
+ 'type' => 'text',
+ 'desc' => _x( 'Choose a default shipment content weight to be used for labels if no weight has been applied to the shipment.', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => true,
+ 'id' => 'label_default_shipment_weight',
+ 'css' => 'max-width: 60px;',
+ 'class' => 'wc_input_decimal',
+ 'default' => $this->get_default_label_default_shipment_weight(),
+ 'value' => $this->get_setting( 'label_default_shipment_weight' )
+ ),
+
+ array(
+ 'title' => _x( 'Minimum weight (kg)', 'shipments', 'woocommerce-germanized' ),
+ 'type' => 'text',
+ 'desc' => _x( 'Choose a minimum weight to be used for labels e.g. to prevent low shipment weight errors.', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => true,
+ 'id' => 'label_minimum_shipment_weight',
+ 'css' => 'max-width: 60px;',
+ 'class' => 'wc_input_decimal',
+ 'default' => $this->get_default_label_minimum_shipment_weight(),
+ 'value' => $this->get_setting( 'label_minimum_shipment_weight' )
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'shipping_provider_label_options' ),
+ );
+
+ return $settings;
+ }
+
+ protected function get_available_base_countries() {
+ $countries = array();
+
+ if ( function_exists( 'WC' ) && WC()->countries ) {
+ $countries = WC()->countries->get_countries();
+ }
+
+ return $countries;
+ }
+
+ public function get_setting_sections() {
+ $sections = array(
+ '' => _x( 'General', 'shipments', 'woocommerce-germanized' ),
+ 'label' => _x( 'Labels', 'shipments', 'woocommerce-germanized' ),
+ 'automation' => _x( 'Automation', 'shipments', 'woocommerce-germanized' ),
+ );
+
+ $sections = array_replace_recursive( $sections, parent::get_setting_sections() );
+
+ return $sections;
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ public function get_label_fields( $shipment ) {
+ if ( 'return' === $shipment->get_type() ) {
+ return $this->get_return_label_fields( $shipment );
+ } else {
+ return $this->get_simple_label_fields( $shipment );
+ }
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ protected function get_simple_label_fields( $shipment ) {
+ $default = $this->get_default_label_product( $shipment );
+ $available = $this->get_available_label_products( $shipment );
+
+ $settings = array(
+ array(
+ 'id' => 'product_id',
+ 'label' => sprintf( _x( '%s Product', 'shipments', 'woocommerce-germanized' ), $this->get_title() ),
+ 'description' => '',
+ 'options' => $this->get_available_label_products( $shipment ),
+ 'value' => $default && array_key_exists( $default, $available ) ? $default : '',
+ 'type' => 'select'
+ )
+ );
+
+ return $settings;
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ protected function get_return_label_fields( $shipment ) {
+ return $this->get_simple_label_fields( $shipment );
+ }
+
+ /**
+ * @param Shipment $shipment
+ * @param $props
+ *
+ * @return \WP_Error|mixed
+ */
+ protected function validate_label_request( $shipment, $props ) {
+ return $props;
+ }
+
+ /**
+ * @param Shipment $shipment
+ *
+ * @return array
+ */
+ protected function get_default_label_props( $shipment ) {
+ $default = array(
+ 'shipping_provider' => $this->get_name(),
+ 'weight' => wc_gzd_get_shipment_label_weight( $shipment ),
+ 'net_weight' => wc_gzd_get_shipment_label_weight( $shipment, true ),
+ 'shipment_id' => $shipment->get_id(),
+ 'services' => array(),
+ 'product_id' => $this->get_default_label_product( $shipment )
+ );
+
+ $dimensions = wc_gzd_get_shipment_label_dimensions( $shipment );
+ $default = array_merge( $default, $dimensions );
+
+ return $default;
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ * @param mixed $props
+ */
+ public function create_label( $shipment, $props = false ) {
+ /**
+ * In case props is false this indicates an automatic (non-manual) request.
+ */
+ if ( false === $props ) {
+ $props = $this->get_default_label_props( $shipment );
+ } elseif ( is_array( $props ) ) {
+ $fields = $this->get_label_fields( $shipment );
+
+ /**
+ * By default checkbox fields won't be transmitted via POST data.
+ * In case the values does not exist within props, assume not checked.
+ */
+ foreach( $fields as $field ) {
+ if ( ! isset( $field['value'] ) ) {
+ continue;
+ }
+
+ if ( 'checkbox' === $field['type'] && ! isset( $props[ $field['id'] ] ) ) {
+ // Exclude array fields from default checkbox handling
+ if ( isset( $field['name'] ) && strstr( $field['name'], '[]' ) ) {
+ continue;
+ }
+
+ $props[ $field['id'] ] = 'no';
+ } elseif( 'multiselect' === $field['type'] ) {
+ if ( isset( $props[ $field['id'] ] ) ) {
+ $props[ $field['id'] ] = (array) $props[ $field['id'] ];
+ }
+ }
+ }
+
+ /**
+ * Merge with default data. That needs to be done after manually
+ * parsing checkboxes as missing data would be overridden with defaults.
+ */
+ $props = wp_parse_args( $props, $this->get_default_label_props( $shipment ) );
+
+ foreach( $props as $key => $value ) {
+ if ( substr( $key, 0, strlen( 'service_' ) ) === 'service_' ) {
+ $new_key = substr( $key, ( strlen( 'service_' ) ) );
+
+ if ( wc_string_to_bool( $value ) && in_array( $new_key, $this->get_available_label_services( $shipment ) ) ) {
+ if ( ! in_array( $new_key, $props['services'] ) ) {
+ $props['services'][] = $new_key;
+ }
+ unset( $props[ $key ] );
+ } else {
+ if ( ( $service_key = array_search( $new_key, $props['services'] ) ) !== false ) {
+ unset( $props['services'][ $service_key ] );
+ }
+ unset( $props[ $key ] );
+ }
+ }
+ }
+ }
+
+ $props = $this->validate_label_request( $shipment, $props );
+
+ if ( is_wp_error( $props ) ) {
+ return $props;
+ }
+
+ if ( isset( $props['services'] ) ) {
+ $props['services'] = array_unique( $props['services'] );
+ }
+
+ $label = Factory::get_label( 0, $this->get_name(), $shipment->get_type() );
+
+ if ( $label ) {
+ foreach( $props as $key => $value ) {
+ $setter = "set_{$key}";
+
+ if ( is_callable( array( $label, $setter ) ) ) {
+ $label->{$setter}( $value );
+ } else {
+ $label->update_meta_data( $key, $value );
+ }
+ }
+
+ $label->set_shipment( $shipment );
+
+ /**
+ * Fetch the label via API and store as file
+ */
+ $result = $label->fetch();
+
+ if ( is_wp_error( $result ) ) {
+ return $result;
+ } else {
+ do_action( "{$this->get_general_hook_prefix()}created_label", $label, $this );
+
+ return $label->save();
+ }
+ }
+
+ return new \WP_Error( 'label-error', _x( 'Error while creating the label.', 'shipments', 'woocommerce-germanized' ) );
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ public function get_available_label_services( $shipment ) {
+ return array();
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ abstract public function get_available_label_products( $shipment );
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ abstract public function get_default_label_product( $shipment );
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/src/ShippingProvider/Helper.php b/packages/woocommerce-germanized-shipments/src/ShippingProvider/Helper.php
new file mode 100644
index 000000000..6ce0c3f23
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/src/ShippingProvider/Helper.php
@@ -0,0 +1,202 @@
+get_shipping_provider_class_names();
+
+ if ( ! is_object( $provider ) ) {
+ if ( ! class_exists( $provider ) ) {
+ return false;
+ }
+
+ $provider = new $provider();
+ } else {
+ $classname = '\Vendidero\Germanized\Shipments\ShippingProvider\Simple';
+
+ if ( array_key_exists( $provider->shipping_provider_name, $classes ) ) {
+ $classname = $classes[ $provider->shipping_provider_name ];
+ }
+
+ $classname = apply_filters( 'woocommerce_gzd_shipping_provider_class_name', $classname, $provider->shipping_provider_name, $provider );
+
+ if ( ! class_exists( $classname ) ) {
+ $classname = '\Vendidero\Germanized\Shipments\ShippingProvider\Simple';
+ }
+
+ $provider = new $classname( $provider );
+ }
+
+ if ( ! $provider || ! is_a( $provider, '\Vendidero\Germanized\Shipments\Interfaces\ShippingProvider' ) ) {
+ return false;
+ }
+
+ if ( is_null( $this->shipping_providers ) ) {
+ $this->shipping_providers = array();
+ }
+
+ $this->shipping_providers[ $provider->get_name() ] = $provider;
+ }
+
+ /**
+ * Shipping providers register themselves by returning their main class name through the woocommerce_gzd_shipping_provider_integrations filter.
+ *
+ * @return array
+ */
+ public function get_shipping_provider_class_names() {
+ $class_names = array();
+
+ /**
+ * This filter may be used to register additional shipping providers
+ * by adding a unique name as key and the classname to be loaded as value of the array.
+ *
+ * @param array $shipping_providers The shipping provider array
+ *
+ * @since 1.0.5
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( 'woocommerce_gzd_shipping_provider_class_names', $class_names );
+ }
+
+ public function is_shipping_provider_activated( $name ) {
+ /**
+ * Make sure that the plugin has initialised, e.g. during installs of shipping provider
+ */
+ if ( ! did_action( 'woocommerce_gzd_shipments_init' ) ) {
+ Package::init();
+ }
+
+ return WC_Data_Store::load( 'shipping-provider' )->is_activated( $name );
+ }
+
+ /**
+ * Loads all shipping providers which are hooked in.
+ *
+ * @return ShippingProvider[]
+ */
+ public function load_shipping_providers() {
+ $this->shipping_providers = array();
+
+ // Unique provider name => provider class name.
+ $shipping_providers = array_merge( $this->get_shipping_provider_class_names(), WC_Data_Store::load( 'shipping-provider' )->get_shipping_providers() );
+
+ // For the settings in the backend, and for non-shipping zone methods, we still need to load any registered classes here.
+ foreach ( $shipping_providers as $provider_name => $provider_class ) {
+ $this->register_shipping_provider( $provider_class );
+ }
+
+ /**
+ * This hook fires as soon as shipping providers are loaded.
+ * Additional shipping provider may be registered manually afterwards.
+ *
+ * @param Helper $providers The shipping providers instance
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( 'woocommerce_gzd_load_shipping_providers', $this );
+
+ // Return loaded methods.
+ return $this->get_shipping_providers();
+ }
+
+ /**
+ * Returns all registered shipping providers for usage.
+ *
+ * @return Simple|Auto|ShippingProvider[]
+ */
+ public function get_shipping_providers() {
+ if ( is_null( $this->shipping_providers ) ) {
+ $this->load_shipping_providers();
+ }
+
+ return $this->shipping_providers;
+ }
+
+ /**
+ * @param $name
+ *
+ * @return false|Simple|Auto|ShippingProvider
+ */
+ public function get_shipping_provider( $name ) {
+ $providers = $this->get_shipping_providers();
+
+ return ( array_key_exists( $name, $providers ) ? $providers[ $name ] : false );
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/src/ShippingProvider/Method.php b/packages/woocommerce-germanized-shipments/src/ShippingProvider/Method.php
new file mode 100644
index 000000000..7551511fd
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/src/ShippingProvider/Method.php
@@ -0,0 +1,407 @@
+method = $method;
+ $this->init();
+ } else {
+ $this->is_placeholder = true;
+ $this->init_placeholder( $method );
+ }
+ }
+
+ protected function init_placeholder( $id ) {
+ if ( is_a( $id, 'WC_Shipping_Rate' ) ) {
+ $instance_id = $id->get_instance_id();
+ $id = $id->get_id();
+
+ if ( strpos( $id, ':' ) === false ) {
+ $id = $id . ':' . $instance_id;
+ }
+ } elseif ( is_a( $id, 'WC_Shipping_Method' ) ) {
+ $instance_id = $id->get_instance_id();
+ $id = $id->id;
+
+ if ( strpos( $id, ':' ) === false ) {
+ $id = $id . ':' . $instance_id;
+ }
+ }
+
+ if ( ! is_numeric( $id ) ) {
+ $expl = explode( ':', $id );
+ $instance_id = ( ( ! empty( $expl ) && sizeof( $expl ) > 1 ) ? $expl[1] : 0 );
+ $id = ( ( ! empty( $expl ) && sizeof( $expl ) > 1 ) ? $expl[0] : $id );
+ } else {
+ $instance_id = $id;
+ }
+
+ $this->placeholder_id = $id;
+ $this->placeholder_instance_id = $instance_id;
+
+ $this->instance_form_fields = Package::get_method_settings();
+ }
+
+ public function get_fallback_setting_value( $setting_key ) {
+ $setting_key = $this->maybe_prefix_key( $setting_key );
+ $setting_value = '';
+
+ /**
+ * In case the setting belongs to the current shipping provider
+ * lets allow overriding the fallback setting with data from the provider.
+ */
+ if ( ( $provider = $this->get_provider_instance() ) && $this->setting_belongs_to_provider( $setting_key ) ) {
+ $setting_value = $provider->get_setting( $setting_key );
+ }
+
+ if ( is_null( $setting_value ) ) {
+ $setting_value = Package::get_setting( $setting_key, null );
+ }
+
+ /**
+ * Convert booleans to string options
+ */
+ if ( is_bool( $setting_value ) ) {
+ $setting_value = wc_bool_to_string( $setting_value );
+ }
+
+ return apply_filters( "{$this->get_hook_prefix()}setting_fallback_value", $setting_value, $setting_key, $this );
+ }
+
+ protected function supports_instance_settings() {
+ if ( $this->is_placeholder() ) {
+ return false;
+ } else {
+ $supports_settings = ( $this->method->supports( 'instance-settings' ) && $this->method->supports( 'instance-settings-modal' ) ) ? true : false;
+
+ return apply_filters( 'woocommerce_gzd_shipping_provider_method_supports_instance_settings', $supports_settings, $this );
+ }
+ }
+
+ public function is_placeholder() {
+ return $this->is_placeholder === true;
+ }
+
+ /**
+ * Get all available shipping method settings. This method (re-) loads all
+ * the settings available across every registered shipping provider.
+ * Call the cached version instead for performance improvements.
+ *
+ * @see Package::get_method_settings()
+ *
+ * @return mixed|void
+ */
+ public static function get_admin_settings() {
+ /**
+ * Filter to adjust admin settings added to the shipment method instance specifically for shipping providers.
+ *
+ * @param array $settings Admin setting fields.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ $settings = apply_filters( 'woocommerce_gzd_shipping_provider_method_admin_settings', array(
+ 'shipping_provider_title' => array(
+ 'title' => _x( 'Shipping Provider Settings', 'shipments', 'woocommerce-germanized' ),
+ 'type' => 'title',
+ 'default' => '',
+ 'description' => _x( 'Adjust shipping provider settings used for managing shipments.', 'shipments', 'woocommerce-germanized' ),
+ ),
+ 'shipping_provider' => array(
+ 'title' => _x( 'Shipping Provider', 'shipments', 'woocommerce-germanized' ),
+ 'type' => 'select',
+ /**
+ * Filter to adjust default shipping provider pre-selected within shipping provider method settings.
+ *
+ * @param string $provider_name The shipping provider name e.g. dhl.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ 'default' => apply_filters( 'woocommerce_gzd_shipping_provider_method_default_provider', '' ),
+ 'options' => wc_gzd_get_shipping_provider_select(),
+ 'description' => _x( 'Choose a shipping provider which will be selected by default for an eligible shipment.', 'shipments', 'woocommerce-germanized' ),
+ ),
+ ) );
+
+ foreach( wc_gzd_get_shipping_providers() as $provider ) {
+ if ( ! $provider->is_activated() ) {
+ continue;
+ }
+
+ $additional_settings = $provider->get_shipping_method_settings();
+ $settings = array_merge( $settings, $additional_settings );
+ }
+
+ /**
+ * Append a stop title to make sure the table is closed within settings.
+ */
+ $settings = array_merge( $settings, array(
+ 'shipping_provider_stop_title' => array(
+ 'title' => '',
+ 'type' => 'title',
+ 'default' => '',
+ ),
+ ) );
+
+ return apply_filters( "woocommerce_gzd_shipping_provider_method_admin_settings_wrapped", $settings );
+ }
+
+ protected function init() {
+ $this->instance_form_fields = Package::get_method_settings();
+
+ if ( ! array_key_exists( 'shipping_provider', $this->get_method()->instance_form_fields ) ) {
+ $this->get_method()->instance_form_fields = array_merge( $this->get_method()->instance_form_fields, $this->instance_form_fields );
+ }
+
+ // Refresh instance settings in case they were already loaded
+ if ( ! empty( $this->get_method()->instance_settings ) ) {
+ $this->get_method()->init_instance_settings();
+ }
+ }
+
+ protected function get_hook_prefix() {
+ $prefix = "woocommerce_gzd_shipping_provider_method_";
+
+ return $prefix;
+ }
+
+ /**
+ * Returns the Woo WC_Shipping_Method original object
+ *
+ * @return object|WC_Shipping_Method
+ */
+ public function get_method() {
+ return $this->method;
+ }
+
+ public function get_id() {
+ if ( ! $this->is_placeholder() ) {
+ return $this->method->id;
+ } else {
+ return $this->placeholder_id;
+ }
+ }
+
+ public function get_instance_id() {
+ if ( ! $this->is_placeholder() ) {
+ return $this->method->get_instance_id();
+ } else {
+ return $this->placeholder_instance_id;
+ }
+ }
+
+ public function has_option( $key ) {
+ $fields = $this->instance_form_fields;
+ $key = $this->maybe_prefix_key( $key );
+ $has_option = ( array_key_exists( $key, $fields ) && $this->setting_belongs_to_provider( $key ) ) ? true : false;
+
+ /**
+ * Filter that allows checking whether a shipping provider method has a specific option or not.
+ *
+ * @param boolean $has_option Whether or not the option exists.
+ * @param string $key The setting key.
+ * @param Method $method The method instance.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( "{$this->get_hook_prefix()}setting_prefix", $has_option, $key, $this );
+ }
+
+ public function setting_belongs_to_provider( $setting_key, $provider = '' ) {
+ $prefix = $this->get_custom_setting_prefix_key();
+
+ if ( ! empty( $provider ) ) {
+ $prefix = $provider . '_';
+ }
+
+ $belongs_to_provider = false;
+
+ if ( ! empty( $prefix ) && substr( $setting_key, 0, strlen( $prefix ) ) === $prefix ) {
+ $belongs_to_provider = true;
+ }
+
+ return $belongs_to_provider;
+ }
+
+ public function is_provider_enabled( $provider ) {
+ return ( $this->get_provider() === $provider ) ? true : false;
+ }
+
+ public function set_provider( $provider_name ) {
+ $this->provider_slug = $provider_name;
+ }
+
+ public function get_provider() {
+ $id = sanitize_key( $this->get_id() );
+
+ if ( is_null( $this->provider_slug ) ) {
+ $provider_slug = $this->method ? $this->method->get_option( 'shipping_provider' ) : '';
+
+ if ( ! empty( $provider_slug ) ) {
+ if ( $provider = wc_gzd_get_shipping_provider( $provider_slug ) ) {
+
+ if ( ! $provider->is_activated() ) {
+ $provider_slug = '';
+ }
+ }
+ }
+
+ if ( empty( $provider_slug ) ) {
+ $provider_slug = wc_gzd_get_default_shipping_provider();
+ }
+
+ /**
+ * Filter that allows adjusting the shipping provider chosen for a specific shipping method.
+ *
+ * @param string $provider_slug The shipping provider.
+ * @param string $method_id The shipping method id.
+ * @param Method $method The method instance.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ $this->provider_slug = apply_filters( "woocommerce_gzd_shipping_provider_method_provider", $provider_slug, $this->get_id(), $this );
+ }
+
+ /**
+ * Filter that allows choosing a shipping provider for a specific shipping method.
+ *
+ * The dynamic portion of this hook, `$id` refers to the shipping method id.
+ *
+ * Example hook name: `woocommerce_gzd_shipping_provider_method_flat_rate_provider`
+ *
+ * @param string $provider_slug The shipping provider name to be used.
+ * @param Method $method The method instance.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( "{$this->get_hook_prefix()}{$id}_provider", $this->provider_slug, $this );
+ }
+
+ public function get_provider_instance() {
+ $provider_slug = $this->get_provider();
+
+ if ( ! empty( $provider_slug ) ) {
+ return wc_gzd_get_shipping_provider( $provider_slug );
+ }
+
+ return false;
+ }
+
+ protected function get_custom_setting_prefix_key() {
+ $prefix = '';
+
+ if ( $provider = $this->get_provider_instance() ) {
+ $prefix = $provider->get_name() . '_';
+ }
+
+ return apply_filters( "{$this->get_hook_prefix()}custom_setting_prefix", $prefix, $this );
+ }
+
+ protected function maybe_prefix_key( $key ) {
+ $fields = $this->instance_form_fields;
+ $prefix = $this->get_custom_setting_prefix_key();
+ $new_key = $key;
+
+ // Do only prefix if the prefix does not yet exist.
+ if ( ! array_key_exists( $new_key, $fields ) ) {
+ if ( substr( $key, 0, strlen( $prefix ) ) !== $prefix ) {
+ $new_key = $prefix . $key;
+ }
+ }
+
+ /**
+ * Filter that allows prefixing the setting key used for a shipping provider method.
+ *
+ * @param string $new_key The prefixed setting key.
+ * @param string $key The original setting key.
+ * @param Method $method The method instance.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( "{$this->get_hook_prefix()}setting_key_prefixed", $new_key, $key, $this );
+ }
+
+ public function get_option( $key ) {
+ $key = $this->maybe_prefix_key( $key );
+ $option_value = $this->get_fallback_setting_value( $key );
+
+ if ( ! $this->is_placeholder() ) {
+ if ( $this->has_option( $key ) && $this->supports_instance_settings() ) {
+ $option_type = isset( $this->instance_form_fields[ $key ]['type'] ) ? $this->instance_form_fields[ $key ]['type'] : 'text';
+
+ // Do only use method settings if the method is not a placeholder and method supports settings
+ $option_value = $this->method->get_option( $key, $option_value );
+
+ if ( in_array( $option_type, array( 'checkbox', 'radio' ) ) ) {
+ $option_value = wc_string_to_bool( $option_value );
+
+ if ( $option_value ) {
+ $option_value = 'yes';
+ } else {
+ $option_value = 'no';
+ }
+ }
+ }
+ }
+
+ return apply_filters( "{$this->get_hook_prefix()}setting_value", $option_value, $key, $this );
+ }
+
+ /**
+ * Call child methods if the method does not exist.
+ *
+ * @param $method
+ * @param $args
+ *
+ * @return bool|mixed
+ */
+ public function __call( $method, $args ) {
+
+ if ( method_exists( $this->method, $method ) ) {
+ return call_user_func_array( array( $this->method, $method ), $args );
+ }
+
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/src/ShippingProvider/MethodPlaceholder.php b/packages/woocommerce-germanized-shipments/src/ShippingProvider/MethodPlaceholder.php
new file mode 100644
index 000000000..2dc1ebf4b
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/src/ShippingProvider/MethodPlaceholder.php
@@ -0,0 +1,24 @@
+ true,
+ 'title' => '',
+ 'name' => '',
+ 'description' => '',
+ 'supports_customer_returns' => false,
+ 'supports_guest_returns' => false,
+ 'return_manual_confirmation' => true,
+ 'return_instructions' => '',
+ 'tracking_url_placeholder' => '',
+ 'tracking_desc_placeholder' => '',
+ );
+
+ protected $address_data = array(
+ 'shipper' => null,
+ 'return' => null,
+ );
+
+ /**
+ * Get the provider if ID is passed. In case it is an integration, data will be provided through the impl.
+ * This class should NOT be instantiated, but the `wc_gzd_get_shipping_provider` function should be used.
+ *
+ * @param int|object|ShippingProvider $provider Provider to read.
+ */
+ public function __construct( $data = 0 ) {
+ parent::__construct( $data );
+
+ if ( $data instanceof ShippingProvider ) {
+ $this->set_id( absint( $data->get_id() ) );
+ } elseif ( is_numeric( $data ) ) {
+ $this->set_id( $data );
+ } elseif( is_object( $data ) && isset( $data->shipping_provider_id ) ) {
+ $this->set_id( $data->shipping_provider_id );
+ }
+
+ $this->data_store = WC_Data_Store::load( $this->data_store_name );
+
+ // If we have an ID, load the user from the DB.
+ if ( $this->get_id() ) {
+ try {
+ $this->data_store->read( $this );
+ } catch ( Exception $e ) {
+ $this->set_id( 0 );
+ $this->set_object_read( true );
+ }
+ } else {
+ $this->set_object_read( true );
+ }
+ }
+
+ public function get_help_link() {
+ return '';
+ }
+
+ public function get_signup_link() {
+ return '';
+ }
+
+ public function is_pro() {
+ return false;
+ }
+
+ /**
+ * Whether or not this instance is a manual integration.
+ * Manual integrations are constructed dynamically from DB and do not support
+ * automatic shipment handling, e.g. label creation.
+ *
+ * @return bool
+ */
+ public function is_manual_integration() {
+ return true;
+ }
+
+ /**
+ * Whether or not this instance supports a certain label type.
+ *
+ * @param string $label_type The label type e.g. simple or return.
+ * @param false|Shipment Shipment instance
+ *
+ * @return bool
+ */
+ public function supports_labels( $label_type, $shipment = false ) {
+ return false;
+ }
+
+ public function supports_customer_return_requests() {
+ if ( $this->is_manual_integration() ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Some providers (e.g. DHL) create return labels automatically and the return
+ * address is chosen dynamically depending on the country. For that reason the return address
+ * might not show up within emails or in customer panel.
+ *
+ * @return bool
+ */
+ public function hide_return_address() {
+ return false;
+ }
+
+ public function get_edit_link( $section = '' ) {
+ $url = admin_url( 'admin.php?page=wc-settings&tab=germanized-shipping_provider&provider=' . esc_attr( $this->get_name() ) );
+ $url = add_query_arg( array( 'section' => $section ), $url );
+
+ return $url;
+ }
+
+ /**
+ * Returns whether the shipping provider is active for usage or not.
+ *
+ * @return bool
+ */
+ public function is_activated() {
+ return $this->get_activated() === true;
+ }
+
+ public function needs_manual_confirmation_for_returns() {
+ return $this->get_return_manual_confirmation() === true;
+ }
+
+ /**
+ * @param false|\WC_Order $order
+ *
+ * @return bool
+ */
+ public function supports_customer_returns( $order = false ) {
+ return $this->get_supports_customer_returns() === true;
+ }
+
+ public function supports_guest_returns() {
+ return $this->get_supports_customer_returns() === true && $this->get_supports_guest_returns() === true;
+ }
+
+ /**
+ * Returns a title for the shipping provider.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_title( $context = 'view' ) {
+ return $this->get_prop( 'title', $context );
+ }
+
+ /**
+ * Returns a unique slug/name for the shipping provider.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_name( $context = 'view' ) {
+ return $this->get_prop( 'name', $context );
+ }
+
+ /**
+ * Returns a description for the provider.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_description( $context = 'view' ) {
+ $desc = $this->get_prop( 'description', $context );
+
+ if ( 'view' === $context && empty( $desc ) ) {
+ return '-';
+ }
+
+ return $desc;
+ }
+
+ /**
+ * Returns whether the shipping provider is activated or not.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_activated( $context = 'view' ) {
+ return $this->get_prop( 'activated', $context );
+ }
+
+ /**
+ * Returns whether the shipping provider needs manual confirmation for a return.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_return_manual_confirmation( $context = 'view' ) {
+ return $this->get_prop( 'return_manual_confirmation', $context );
+ }
+
+ /**
+ * Returns whether the shipping provider supports returns added by customers or not.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_supports_customer_returns( $context = 'view' ) {
+ return $this->get_prop( 'supports_customer_returns', $context );
+ }
+
+ /**
+ * Returns whether the shipping provider supports returns added by guests or not.
+ *
+ * @param string $context
+ *
+ * @return string
+ */
+ public function get_supports_guest_returns( $context = 'view' ) {
+ return $this->get_prop( 'supports_guest_returns', $context );
+ }
+
+ /**
+ * Returns the tracking url placeholder which is being used to
+ * construct a tracking url.
+ *
+ * @param string $context
+ *
+ * @return mixed
+ */
+ public function get_tracking_url_placeholder( $context = 'view' ) {
+ $data = $this->get_prop( 'tracking_url_placeholder', $context );
+
+ // In case the option value is not stored in DB yet
+ if ( 'view' === $context && empty( $data ) ) {
+ $data = $this->get_default_tracking_url_placeholder();
+ }
+
+ return $data;
+ }
+
+ public function get_default_tracking_url_placeholder() {
+ return '';
+ }
+
+ /**
+ * Returns the tracking description placeholder which is being used to
+ * construct a tracking description.
+ *
+ * @param string $context
+ *
+ * @return mixed
+ */
+ public function get_tracking_desc_placeholder( $context = 'view' ) {
+ $data = $this->get_prop( 'tracking_desc_placeholder', $context );
+
+ // In case the option value is not stored in DB yet
+ if ( 'view' === $context && empty( $data ) ) {
+ $data = $this->get_default_tracking_desc_placeholder();
+ }
+
+ return $data;
+ }
+
+ public function get_default_tracking_desc_placeholder() {
+ return _x( 'Your shipment is being processed by {shipping_provider}. If you want to track the shipment, please use the following tracking number: {tracking_id}. Depending on the chosen shipping method it is possible that the tracking data does not reflect the current status when receiving this email.', 'shipments', 'woocommerce-germanized' );
+ }
+
+ /**
+ * Returns the return instructions.
+ *
+ * @param string $context
+ *
+ * @return mixed
+ */
+ public function get_return_instructions( $context = 'view' ) {
+ return $this->get_prop( 'return_instructions', $context );
+ }
+
+ public function has_return_instructions() {
+ $instructions = $this->get_return_instructions();
+
+ return empty( $instructions ) ? false : true;
+ }
+
+ protected function get_address_props( $address_type = 'shipper' ) {
+ if ( is_null( $this->address_data[ $address_type ] ) ) {
+ $this->address_data[ $address_type ] = wc_gzd_get_shipment_setting_address_fields( $address_type );
+ }
+
+ return $this->address_data[ $address_type ];
+ }
+
+ public function get_shipper_address_data() {
+ return $this->get_address_props( 'shipper' );
+ }
+
+ public function get_address_prop( $prop, $type = 'shipper' ) {
+ $address_fields = $this->get_address_props( $type );
+
+ return array_key_exists( $prop, $address_fields ) ? $address_fields[ $prop ] : '';
+ }
+
+ public function get_shipper_email() {
+ return $this->get_address_prop( 'email' );
+ }
+
+ public function get_shipper_phone() {
+ return $this->get_address_prop( 'phone' );
+ }
+
+ public function get_contact_phone() {
+ return get_option( 'woocommerce_gzd_shipments_contact_phone' );
+ }
+
+ public function get_shipper_first_name() {
+ return $this->get_address_prop( 'first_name' );
+ }
+
+ public function get_shipper_last_name() {
+ return $this->get_address_prop( 'last_name' );
+ }
+
+ public function get_shipper_name() {
+ return $this->get_shipper_formatted_full_name();
+ }
+
+ public function get_shipper_formatted_full_name() {
+ return $this->get_address_prop( 'full_name' );
+ }
+
+ public function get_shipper_company() {
+ return $this->get_address_prop( 'company' );
+ }
+
+ public function get_shipper_address() {
+ return $this->get_address_prop( 'address_1' );
+ }
+
+ public function get_shipper_address_1() {
+ return $this->get_shipper_address();
+ }
+
+ public function get_shipper_address_2() {
+ return $this->get_address_prop( 'address_2' );
+ }
+
+ public function get_shipper_street() {
+ return $this->get_address_prop( 'street' );
+ }
+
+ public function get_shipper_street_number() {
+ return $this->get_address_prop( 'street_number' );
+ }
+
+ public function get_shipper_postcode() {
+ return $this->get_address_prop( 'postcode' );
+ }
+
+ public function get_shipper_city() {
+ return $this->get_address_prop( 'city' );
+ }
+
+ public function get_shipper_customs_reference_number() {
+ return $this->get_address_prop( 'customs_reference_number' );
+ }
+
+ public function get_shipper_country() {
+ $country_data = wc_format_country_state_string( $this->get_address_prop( 'country' ) );
+
+ return $country_data['country'];
+ }
+
+ public function get_shipper_state() {
+ $country_data = wc_format_country_state_string( $this->get_address_prop( 'country' ) );
+
+ return $country_data['state'];
+ }
+
+ public function get_return_address_data() {
+ return $this->get_address_props( 'return' );
+ }
+
+ public function get_return_first_name() {
+ return $this->get_address_prop( 'first_name', 'return' );
+ }
+
+ public function get_return_last_name() {
+ return $this->get_address_prop( 'last_name', 'return' );
+ }
+
+ public function get_return_company() {
+ return $this->get_address_prop( 'company', 'return' );
+ }
+
+ public function get_return_name() {
+ return $this->get_return_formatted_full_name();
+ }
+
+ public function get_return_formatted_full_name() {
+ return $this->get_address_prop( 'full_name', 'return' );
+ }
+
+ public function get_return_address() {
+ return $this->get_address_prop( 'address_1', 'return' );
+ }
+
+ public function get_return_address_2() {
+ return $this->get_address_prop( 'address_2', 'return' );
+ }
+
+ public function get_return_street() {
+ return $this->get_address_prop( 'street', 'return' );
+ }
+
+ public function get_return_street_number() {
+ return $this->get_address_prop( 'street_number', 'return' );
+ }
+
+ public function get_return_postcode() {
+ return $this->get_address_prop( 'postcode', 'return' );
+ }
+
+ public function get_return_city() {
+ return $this->get_address_prop( 'city', 'return' );
+ }
+
+ public function get_return_country() {
+ $country_data = wc_format_country_state_string( $this->get_address_prop( 'country', 'return' ) );
+
+ return $country_data['country'];
+ }
+
+ public function get_return_state() {
+ $country_data = wc_format_country_state_string( $this->get_address_prop( 'country', 'return' ) );
+
+ return $country_data['state'];
+ }
+
+ public function get_return_email() {
+ return $this->get_address_prop( 'email', 'return' );
+ }
+
+ public function get_return_phone() {
+ return $this->get_address_prop( 'phone', 'return' );
+ }
+
+ /**
+ * Set the current shipping provider to active or inactive.
+ *
+ * @param bool $is_activated
+ */
+ public function set_activated( $is_activated ) {
+ $this->set_prop( 'activated', wc_string_to_bool( $is_activated ) );
+ }
+
+ /**
+ * Mark the current shipping provider as manual needed confirmation for returns.
+ *
+ * @param bool $needs_confirmation
+ */
+ public function set_return_manual_confirmation( $needs_confirmation ) {
+ $this->set_prop( 'return_manual_confirmation', wc_string_to_bool( $needs_confirmation ) );
+ }
+
+ /**
+ * Set whether or not the current shipping provider supports customer returns
+ *
+ * @param bool $supports
+ */
+ public function set_supports_customer_returns( $supports ) {
+ $this->set_prop( 'supports_customer_returns', wc_string_to_bool( $supports ) );
+ }
+
+ /**
+ * Set whether or not the current shipping provider supports guest returns
+ *
+ * @param bool $supports
+ */
+ public function set_supports_guest_returns( $supports ) {
+ $this->set_prop( 'supports_guest_returns', wc_string_to_bool( $supports ) );
+ }
+
+ public function update_settings_with_defaults() {
+ foreach( $this->get_all_settings() as $section => $settings ) {
+ foreach( $settings as $setting ) {
+ $type = isset( $setting['type'] ) ? $setting['type'] : 'title';
+ $default = isset( $setting['default'] ) ? $setting['default'] : null;
+
+ if ( in_array( $type, array( 'title', 'sectionend', 'html' ) ) || ! isset( $setting['id'] ) || empty( $setting['id'] ) ) {
+ continue;
+ }
+
+ $current_value = $this->get_setting( $setting['id'], null, 'edit' );
+
+ /**
+ * Update meta data with default value in case it does not yet exist.
+ */
+ if ( is_null( $current_value ) && ! is_null( $default ) ) {
+ $this->update_setting( $setting['id'], $default );
+ }
+ }
+ }
+ }
+
+ /**
+ * Activate current ShippingProvider instance.
+ */
+ public function activate() {
+ $this->set_activated( true );
+ $this->update_settings_with_defaults();
+ $this->save();
+
+ /**
+ * This action fires as soon as a certain shipping provider gets activated.
+ *
+ * @param ShippingProvider $shipping_provider The shipping provider instance.
+ */
+ do_action( 'woocommerce_gzd_shipping_provider_activated', $this );
+ }
+
+ /**
+ * Deactivate current ShippingProvider instance.
+ */
+ public function deactivate() {
+ $this->set_activated( false );
+ $this->save();
+
+ /**
+ * This action fires as soon as a certain shipping provider gets deactivated.
+ *
+ * @param ShippingProvider $shipping_provider The shipping provider instance.
+ */
+ do_action( 'woocommerce_gzd_shipping_provider_deactivated', $this );
+ }
+
+ /**
+ * Set the name of the current shipping provider.
+ *
+ * @param string $name
+ */
+ public function set_name( $name ) {
+ $this->set_prop( 'name', $name );
+ }
+
+ /**
+ * Set the title of the current shipping provider.
+ *
+ * @param string $title
+ */
+ public function set_title( $title ) {
+ $this->set_prop( 'title', $title );
+ }
+
+ /**
+ * Set the description of the current shipping provider.
+ *
+ * @param string $description
+ */
+ public function set_description( $description ) {
+ $this->set_prop( 'description', $description );
+ }
+
+ /**
+ * Set the return instructions of the current shipping provider.
+ *
+ * @param string $instructions
+ */
+ public function set_return_instructions( $instructions ) {
+ $this->set_prop( 'return_instructions', $instructions );
+ }
+
+ /**
+ * Set the tracking url placeholder of the current shipping provider.
+ *
+ * @param string $placeholder
+ */
+ public function set_tracking_url_placeholder( $placeholder ) {
+ $this->set_prop( 'tracking_url_placeholder', $placeholder );
+ }
+
+ /**
+ * Set the tracking description placeholder of the current shipping provider.
+ *
+ * @param string $placeholder
+ */
+ public function set_tracking_desc_placeholder( $placeholder ) {
+ $this->set_prop( 'tracking_desc_placeholder', $placeholder );
+ }
+
+ /**
+ * Returns the tracking url for a specific shipment.
+ *
+ * @param Shipment $shipment
+ *
+ * @return string
+ */
+ public function get_tracking_url( $shipment ) {
+
+ $tracking_url = '';
+ $tracking_id = $shipment->get_tracking_id();
+
+ if ( '' !== $this->get_tracking_url_placeholder() && ! empty( $tracking_id ) ) {
+ $placeholders = $this->get_tracking_placeholders( $shipment );
+ $tracking_url = str_replace( array_keys( $placeholders ), array_values( $placeholders ), $this->get_tracking_url_placeholder() );
+ }
+
+ /**
+ * This filter returns the tracking url provided by the shipping provider for a certain shipment.
+ *
+ * The dynamic portion of the hook `$this->get_hook_prefix()` refers to the
+ * current provider name.
+ *
+ * Example hook name: woocommerce_gzd_shipping_provider_dhl_get_tracking_url
+ *
+ * @param string $tracking_url The tracking url.
+ * @param Shipment $shipment The shipment used to build the url.
+ * @param ShippingProvider $provider The shipping provider.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( $this->get_hook_prefix() . 'tracking_url', $tracking_url, $shipment, $this );
+ }
+
+ /**
+ * Returns the tracking description for a certain shipment.
+ *
+ * @param Shipment $shipment
+ *
+ * @return string
+ */
+ public function get_tracking_desc( $shipment, $plain = false ) {
+ $tracking_desc = '';
+ $tracking_id = $shipment->get_tracking_id();
+
+ if ( '' !== $this->get_tracking_desc_placeholder() && ! empty( $tracking_id ) ) {
+ $placeholders = $this->get_tracking_placeholders( $shipment );
+
+ if ( ! $plain && apply_filters( "{$this->get_general_hook_prefix()}tracking_id_with_link", true, $shipment ) && $shipment->has_tracking() ) {
+ $placeholders['{tracking_id}'] = '' . $shipment->get_tracking_id() . '';
+ }
+
+ $tracking_desc = str_replace( array_keys( $placeholders ), array_values( $placeholders ), $this->get_tracking_desc_placeholder() );
+ }
+
+ /**
+ * This filter returns the tracking description provided by the shipping provider for a certain shipment.
+ *
+ * The dynamic portion of the hook `$this->get_hook_prefix()` refers to the
+ * current provider name.
+ *
+ * Example hook name: woocommerce_gzd_shipping_provider_dhl_get_tracking_description
+ *
+ * @param string $tracking_url The tracking description.
+ * @param Shipment $shipment The shipment used to build the url.
+ * @param ShippingProvider $provider The shipping provider.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( $this->get_hook_prefix() . 'tracking_desc', $tracking_desc, $shipment, $this );
+ }
+
+ protected function set_prop( $prop, $value ) {
+ parent::set_prop( $prop, $value );
+ }
+
+ /**
+ * @param bool|Shipment $shipment
+ *
+ * @return array
+ */
+ public function get_tracking_placeholders( $shipment = false ) {
+ $label = false;
+
+ if ( $shipment ) {
+ $label = $shipment->get_label();
+ }
+
+ /**
+ * This filter may be used to add or manipulate tracking placeholder data
+ * for a certain shipping provider.
+ *
+ * The dynamic portion of the hook `$this->get_hook_prefix()` refers to the
+ * current provider name.
+ *
+ * Example hook name: woocommerce_gzd_shipping_provider_dhl_get_tracking_placeholders
+ *
+ * @param array $placeholders Placeholders in key => value pairs.
+ * @param ShippingProvider $provider The shipping provider.
+ * @param Shipment|bool $shipment The shipment instance if available.
+ *
+ * @since 3.0.6
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( "{$this->get_hook_prefix()}tracking_placeholders", array(
+ '{shipment_number}' => $shipment ? $shipment->get_shipment_number() : '',
+ '{order_number}' => $shipment ? $shipment->get_order_number() : '',
+ '{tracking_id}' => $shipment ? $shipment->get_tracking_id() : '',
+ '{postcode}' => $shipment ? $shipment->get_postcode() : '',
+ '{date_sent_day}' => $shipment && $shipment->get_date_sent() ? $shipment->get_date_sent()->format( 'd' ) : '',
+ '{date_sent_month}' => $shipment && $shipment->get_date_sent() ? $shipment->get_date_sent()->format( 'm' ) : '',
+ '{date_sent_year}' => $shipment && $shipment->get_date_sent() ? $shipment->get_date_sent()->format( 'Y' ) : '',
+ '{date_day}' => $shipment && $shipment->get_date_created() ? $shipment->get_date_created()->format( 'd' ) : '',
+ '{date_month}' => $shipment && $shipment->get_date_created() ? $shipment->get_date_created()->format( 'm' ) : '',
+ '{date_year}' => $shipment && $shipment->get_date_created() ? $shipment->get_date_created()->format( 'Y' ) : '',
+ '{label_date_day}' => $label ? $label->get_date_created()->format( 'd' ) : '',
+ '{label_date_month}' => $label ? $label->get_date_created()->format( 'm' ) : '',
+ '{label_date_year}' => $label ? $label->get_date_created()->format( 'Y' ) : '',
+ '{shipping_provider}' => $this->get_title()
+ ), $this, $shipment );
+ }
+
+ /**
+ * Prefix for action and filter hooks on data.
+ *
+ * @since 3.0.0
+ * @return string
+ */
+ protected function get_hook_prefix() {
+ return $this->get_general_hook_prefix() . 'get_';
+ }
+
+ /**
+ * Prefix for action and filter hooks on data.
+ *
+ * @since 3.0.0
+ * @return string
+ */
+ protected function get_general_hook_prefix() {
+ $name = sanitize_key( $this->get_name( 'edit' ) );
+
+ if ( empty( $name ) ) {
+ return "woocommerce_gzd_shipping_provider_";
+ } else {
+ return "woocommerce_gzd_shipping_provider_{$name}_";
+ }
+ }
+
+ protected function get_general_settings( $for_shipping_method = false ) {
+ $settings = array(
+ array( 'title' => '', 'type' => 'title', 'id' => 'shipping_provider_options' ),
+ );
+
+ if ( $this->is_manual_integration() ) {
+ $settings = array_merge( $settings, array(
+ array(
+ 'title' => _x( 'Title', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Choose a title for the shipping provider.', 'shipments', 'woocommerce-germanized' ),
+ 'id' => 'shipping_provider_title',
+ 'value' => $this->get_title( 'edit' ),
+ 'default' => '',
+ 'type' => 'text',
+ ),
+
+ array(
+ 'title' => _x( 'Description', 'shipments', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Choose a description for the shipping provider.', 'shipments', 'woocommerce-germanized' ),
+ 'id' => 'shipping_provider_description',
+ 'value' => $this->get_description( 'edit' ),
+ 'default' => '',
+ 'type' => 'textarea',
+ 'css' => 'width: 100%;',
+ ),
+ ) );
+ }
+
+ $settings = array_merge( $settings, array(
+ array(
+ 'title' => _x( 'Tracking URL', 'shipments', 'woocommerce-germanized' ),
+ 'desc' => '
' . sprintf( _x( 'Adjust the placeholder used to construct the tracking URL for this shipping provider. You may use on of the following placeholders to insert the tracking id or other dynamic data: %s', 'shipments', 'woocommerce-germanized' ), '' . implode( ', ', array_keys( $this->get_tracking_placeholders() ) ) . '' ) . '
' . sprintf( _x( 'Adjust the placeholder used to construct the tracking description for this shipping provider (e.g. used within notification emails). You may use on of the following placeholders to insert the tracking id or other dynamic data: %s', 'shipments', 'woocommerce-germanized' ), '' . implode( ', ', array_keys( $this->get_tracking_placeholders() ) ) . '' ) . '
' . sprintf( _x( 'Guests will need to provide their email address and the order id to receive a one-time link to submit a return request. The placeholder %s might be used to place the request form on your site.', 'shipments', 'woocommerce-germanized' ), '[gzd_return_request_form]' ) . '
' . _x( 'By default return request need manual confirmation e.g. a shop manager needs to review return requests which by default are added with the status "requested" after a customer submitted a return request. If you choose to disable this option, customer return requests will be added as "processing" and an email confirmation including instructions will be sent immediately to the customer.', 'shipments', 'woocommerce-germanized' ) . '
' . _x( 'Provide your customer with instructions on how to return the shipment after a return request has been confirmed e.g. explain how to prepare the return for shipment. In case a label cannot be generated automatically, make sure to provide your customer with information on how to obain a return label.', 'shipments', 'woocommerce-germanized' ) . '
',
+ 'id' => 'return_instructions',
+ 'placeholder' => '',
+ 'value' => $this->get_return_instructions( 'edit' ),
+ 'default' => '',
+ 'type' => 'textarea',
+ 'css' => 'width: 100%; min-height: 60px; margin-top: 1em;',
+ 'custom_attributes' => array(
+ 'data-show_if_shipping_provider_supports_customer_returns' => '',
+ ),
+ ),
+ ) );
+
+ $settings = array_merge( $settings, array(
+ array( 'type' => 'sectionend', 'id' => 'shipping_provider_return_options' ),
+ ) );
+
+ return $settings;
+ }
+
+ protected function get_all_settings( $for_shipping_method = false ) {
+ $settings = array();
+ $sections = array_keys( $this->get_setting_sections() );
+
+ foreach( $sections as $section ) {
+ $settings[ $section ] = $this->get_settings( $section, $for_shipping_method );
+ }
+
+ return $settings;
+ }
+
+ public function get_shipping_method_settings() {
+ $settings = $this->get_all_settings( true );
+ $sections = $this->get_setting_sections();
+
+ $method_settings = array();
+ $include_current_section = false;
+
+ foreach( $settings as $section => $section_settings ) {
+ $global_settings_url = $this->get_edit_link( $section );
+ $default_title = $sections[ $section ];
+
+ foreach( $section_settings as $setting ) {
+ $include = false;
+ $setting = wp_parse_args( $setting, array(
+ 'allow_override' => ( $include_current_section && ! in_array( $setting['type'], array( 'title', 'sectionend' ) ) ) ? true : false,
+ 'type' => '',
+ 'id' => '',
+ 'value' => '',
+ 'title_method' => '',
+ 'title' => ''
+ ) );
+
+ if ( true === $setting['allow_override'] ) {
+ $include = true;
+
+ if ( 'title' === $setting['type'] ) {
+ $include_current_section = true;
+ }
+ } elseif ( $include_current_section && ! in_array( $setting['type'], array( 'title', 'sectionend' ) ) && false !== $setting['allow_override'] ) {
+ $include = true;
+ } elseif( in_array( $setting['type'], array( 'title', 'sectionend' ) ) ) {
+ $include_current_section = false;
+ }
+
+ if ( $include ) {
+ $new_setting = array();
+ $new_setting['id'] = $this->get_name() . '_' . $setting['id'];
+ $new_setting['type'] = str_replace( 'gzd_toggle', 'checkbox', $setting['type'] );
+ $new_setting['default'] = $setting['value'];
+
+ if ( 'checkbox' === $new_setting['type'] ) {
+ $new_setting['label'] = $setting['desc'];
+ } elseif ( isset( $setting['desc'] ) ) {
+ $new_setting['description'] = $setting['desc'];
+ }
+
+ $copy = array( 'options', 'title', 'desc_tip' );
+
+ foreach ( $copy as $cp ) {
+ if ( isset( $setting[ $cp ] ) ) {
+ $new_setting[ $cp ] = $setting[ $cp ];
+ }
+ }
+
+ if( 'title' === $new_setting['type'] ) {
+ $new_setting['description'] = sprintf( _x( 'These settings override your global %2$s options. Do only adjust these settings in case you would like to specifically adjust them for this specific shipping method.', 'shipments', 'woocommerce-germanized' ), $global_settings_url, $this->get_title() );
+
+ if ( empty( $setting['title'] ) ) {
+ $new_setting['title'] = $default_title;
+ }
+
+ if ( ! empty( $setting['title_method'] ) ) {
+ $new_setting['title'] = $setting['title_method'];
+ }
+ }
+
+ $method_settings[ $new_setting['id'] ] = $new_setting;
+ }
+ }
+ }
+
+ return $method_settings;
+ }
+
+ public function get_setting_sections() {
+ $sections = array(
+ '' => _x( 'General', 'shipments', 'woocommerce-germanized' ),
+ );
+
+ if ( $this->supports_customer_return_requests() ) {
+ $sections['returns'] = _x( 'Return Requests', 'shipments', 'woocommerce-germanized' );
+ }
+
+ return $sections;
+ }
+
+ public function save() {
+ return parent::save();
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ *
+ * @return ShipmentLabel|false
+ */
+ public function get_label( $shipment ) {
+ return apply_filters( "{$this->get_hook_prefix()}label", false, $shipment, $this );
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ */
+ public function get_label_fields_html( $shipment ) {
+ return apply_filters( "{$this->get_hook_prefix()}label_fields_html", '', $shipment, $this );
+ }
+
+ /**
+ * @param \Vendidero\Germanized\Shipments\Shipment $shipment
+ * @param mixed $props
+ */
+ public function create_label( $shipment, $props = false ) {
+ $result = new \WP_Error( 'shipping-provider', _x( 'This shipping provider does not support creating labels.', 'shipments', 'woocommerce-germanized' ) );
+
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/src/SimpleShipment.php b/packages/woocommerce-germanized-shipments/src/SimpleShipment.php
new file mode 100644
index 000000000..40cec5820
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/src/SimpleShipment.php
@@ -0,0 +1,369 @@
+ 0,
+ );
+
+ /**
+ * Returns the shipment type.
+ *
+ * @return string
+ */
+ public function get_type() {
+ return 'simple';
+ }
+
+ /**
+ * Returns the order id belonging to the shipment.
+ *
+ * @param string $context What the value is for. Valid values are 'view' and 'edit'.
+ * @return integer
+ */
+ public function get_order_id( $context = 'view' ) {
+ return $this->get_prop( 'order_id', $context );
+ }
+
+ /**
+ * Set shipment order id.
+ *
+ * @param string $order_id The order id.
+ */
+ public function set_order_id( $order_id ) {
+ // Reset order object
+ $this->order = null;
+
+ $this->set_prop( 'order_id', absint( $order_id ) );
+ }
+
+ /**
+ * Set shipment order.
+ *
+ * @param Order $order_shipment The order shipment.
+ */
+ public function set_order_shipment( &$order_shipment ) {
+ $this->order_shipment = $order_shipment;
+ }
+
+ /**
+ * Tries to fetch the order for the current shipment.
+ *
+ * @return bool|WC_Order|null
+ */
+ public function get_order() {
+ if ( is_null( $this->order ) ) {
+ $this->order = ( $this->get_order_id() > 0 ? wc_get_order( $this->get_order_id() ) : false );
+ }
+
+ return $this->order;
+ }
+
+ /**
+ * Returns the order shipment instance. Loads from DB if not yet exists.
+ *
+ * @return bool|Order
+ */
+ public function get_order_shipment() {
+ if ( is_null( $this->order_shipment ) ) {
+ $order = $this->get_order();
+ $this->order_shipment = ( $order ? wc_gzd_get_shipment_order( $order ) : false );
+ }
+
+ return $this->order_shipment;
+ }
+
+ /**
+ * Sync the shipment with it's corresponding order.
+ *
+ * @param array $args
+ *
+ * @return bool
+ */
+ public function sync( $args = array() ) {
+ try {
+
+ if ( ! $order_shipment = $this->get_order_shipment() ) {
+ throw new Exception( _x( 'Invalid shipment order', 'shipments', 'woocommerce-germanized' ) );
+ }
+
+ /**
+ * Hotfix WCML infinite loop
+ *
+ */
+ if ( function_exists( 'wc_gzd_remove_class_filter' ) ) {
+ wc_gzd_remove_class_filter( 'woocommerce_order_get_items', 'WCML_Orders', 'woocommerce_order_get_items', 10 );
+ }
+
+ $order = $order_shipment->get_order();
+
+ /**
+ * Make sure that manually adjusted providers are not overridden by syncing.
+ */
+ $default_provider_instance = wc_gzd_get_order_shipping_provider( $order );
+ $default_provider = $default_provider_instance ? $default_provider_instance->get_name() : '';
+ $provider = $this->get_shipping_provider( 'edit' );
+ $address_data = array_merge( ( $order->has_shipping_address() ? $order->get_address( 'shipping' ) : $order->get_address( 'billing' ) ), array( 'email' => $order->get_billing_email(), 'phone' => $order->get_billing_phone() ) );
+
+ // Prefer shipping phone in case exists
+ if ( is_callable( array( $order, 'get_shipping_phone' ) ) && $order->get_shipping_phone() ) {
+ $address_data['phone'] = $order->get_shipping_phone();
+ }
+
+ /**
+ * Fix to make sure that we are not syncing formatted customer titles (e.g. Herr)
+ * which prevents shipment addresses from being translated.
+ */
+ if ( isset( $address_data['title'] ) && ! empty( $address_data['title'] ) ) {
+ if ( $title = $order->get_meta( "_shipping_title", true ) ) {
+ $address_data['title'] = $title;
+ }
+ }
+
+ /**
+ * Force the country to have a max length of 2.
+ * https://github.com/woocommerce/woocommerce/issues/27521
+ */
+ $country = substr( strtoupper( ( $order->has_shipping_address() ? $order->get_shipping_country() : $order->get_billing_country() ) ), 0, 2 );
+ $packaging_id = $this->get_packaging_id( 'edit' );
+
+ $dimensions = array(
+ 'width' => $this->get_width( 'edit' ),
+ 'length' => $this->get_length( 'edit' ),
+ 'height' => $this->get_height( 'edit' )
+ );
+
+ $args = wp_parse_args( $args, array(
+ 'order_id' => $order->get_id(),
+ 'shipping_method' => wc_gzd_get_shipment_order_shipping_method_id( $order ),
+ 'shipping_provider' => ( ! empty( $provider ) ) ? $provider : $default_provider,
+ 'packaging_id' => $this->get_packaging_id( 'edit' ),
+ 'address' => $address_data,
+ 'country' => $country,
+ 'weight' => $this->get_weight( 'edit' ),
+ 'packaging_weight' => $this->get_packaging_weight( 'edit' ),
+ 'length' => $dimensions['length'],
+ 'width' => $dimensions['width'],
+ 'height' => $dimensions['height'],
+ 'additional_total' => $order_shipment->calculate_shipment_additional_total( $this ),
+ ) );
+
+ /**
+ * Filter to allow adjusting the shipment props synced from the corresponding order.
+ *
+ * @param mixed $args The properties in key => value pairs.
+ * @param SimpleShipment $shipment The shipment object.
+ * @param Order $order_shipment The shipment order object.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ $args = apply_filters( 'woocommerce_gzd_shipment_sync_props', $args, $this, $order_shipment );
+
+ $this->set_props( $args );
+
+ /**
+ * Action that fires after a shipment has been synced. Syncing is used to
+ * keep the shipment in sync with the corresponding order.
+ *
+ * @param SimpleShipment $shipment The shipment object.
+ * @param Order $order_shipment The shipment order object.
+ * @param array $args Array containing properties in key => value pairs to be updated.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( 'woocommerce_gzd_shipment_synced', $this, $order_shipment, $args );
+
+ } catch ( Exception $e ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Sync items with the corresponding order items.
+ * Limits quantities and removes non-existing items.
+ *
+ * @param array $args
+ *
+ * @return bool
+ */
+ public function sync_items( $args = array() ) {
+ try {
+
+ if ( ! $order_shipment = $this->get_order_shipment() ) {
+ throw new Exception( _x( 'Invalid shipment order', 'shipments', 'woocommerce-germanized' ) );
+ }
+
+ $order = $order_shipment->get_order();
+
+ $args = wp_parse_args( $args, array(
+ 'items' => array(),
+ ) );
+
+ $available_items = $order_shipment->get_available_items_for_shipment( array(
+ 'shipment_id' => $this->get_id(),
+ 'exclude_current_shipment' => true,
+ ) );
+
+ foreach( $available_items as $item_id => $item_data ) {
+
+ if ( $order_item = $order->get_item( $item_id ) ) {
+ $quantity = $item_data['max_quantity'];
+
+ if ( ! empty( $args['items'] ) ) {
+ if ( isset( $args['items'][ $item_id ] ) ) {
+ $new_quantity = absint( $args['items'][ $item_id ] );
+
+ if ( $new_quantity < $quantity ) {
+ $quantity = $new_quantity;
+ }
+ } else {
+ continue;
+ }
+ }
+
+ if ( ! $shipment_item = $this->get_item_by_order_item_id( $item_id ) ) {
+ $shipment_item = wc_gzd_create_shipment_item( $this, $order_item, array( 'quantity' => $quantity ) );
+
+ $this->add_item( $shipment_item );
+ } else {
+ $shipment_item->sync( array( 'quantity' => $quantity ) );
+ }
+ }
+ }
+
+ foreach( $this->get_items() as $item ) {
+
+ // Remove non-existent items
+ if( ! $order_item = $order->get_item( $item->get_order_item_id() ) ) {
+ $this->remove_item( $item->get_id() );
+ }
+ }
+
+ // Sync packaging
+ $this->sync_packaging();
+
+ /**
+ * Action that fires after items of a shipment have been synced.
+ *
+ * @param SimpleShipment $shipment The shipment object.
+ * @param Order $order_shipment The shipment order object.
+ * @param array $args Array containing additional data e.g. items.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( 'woocommerce_gzd_shipment_items_synced', $this, $order_shipment, $args );
+
+ } catch ( Exception $e ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns available shipment methods by checking the corresponding order.
+ *
+ * @return string[]
+ */
+ public function get_available_shipping_methods() {
+ $methods = array();
+
+ if ( $order = $this->get_order() ) {
+ $items = $order->get_shipping_methods();
+
+ foreach( $items as $item ) {
+ $methods[ $item->get_method_id() . ':' . $item->get_instance_id() ] = $item->get_name();
+ }
+ }
+
+ return $methods;
+ }
+
+ /**
+ * Returns the number of items available for shipment.
+ *
+ * @return int|mixed|void
+ */
+ public function get_shippable_item_count() {
+ if ( $order_shipment = $this->get_order_shipment() ) {
+ return $order_shipment->get_shippable_item_count();
+ }
+
+ return 0;
+ }
+
+ /**
+ * Returns whether the Shipment needs additional items or not.
+ *
+ * @param bool|integer[] $available_items
+ *
+ * @return bool
+ */
+ public function needs_items( $available_items = false ) {
+
+ if ( ! $available_items && ( $order = wc_gzd_get_shipment_order( $this->get_order() ) ) ) {
+ $available_items = array_keys( $order->get_available_items_for_shipment() );
+ }
+
+ return ( $this->is_editable() && ! $this->contains_order_item( $available_items ) );
+ }
+
+ /**
+ * Returns the edit shipment URL.
+ *
+ * @return mixed|string|void
+ */
+ public function get_edit_shipment_url() {
+ /**
+ * Filter to adjust the edit Shipment admin URL.
+ *
+ * The dynamic portion of this hook, `$this->get_hook_prefix()` is used to construct a
+ * unique hook for a shipment type.
+ *
+ * Example hook name: woocommerce_gzd_shipment_get_edit_url
+ *
+ * @param string $url The URL.
+ * @param Shipment $this The shipment object.
+ *
+ * @since 3.0.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ return apply_filters( "{$this->get_hook_prefix()}edit_url", get_admin_url( null, 'post.php?post=' . $this->get_order_id() . '&action=edit&shipment_id=' . $this->get_id() ), $this );
+ }
+}
diff --git a/packages/woocommerce-germanized-shipments/src/Validation.php b/packages/woocommerce-germanized-shipments/src/Validation.php
new file mode 100644
index 000000000..41268b13a
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/src/Validation.php
@@ -0,0 +1,222 @@
+get_id() ) {
+ self::new_order( $order );
+ }
+ }, 300, 1 );
+ }, 10, 1 );
+
+ add_action( 'woocommerce_delete_order', array( __CLASS__, 'delete_order' ), 10, 1 );
+
+ foreach( array( 'cancelled', 'failed', 'refunded' ) as $cancelled_status ) {
+ add_action( "woocommerce_order_status_{$cancelled_status}", array( __CLASS__, 'maybe_cancel_shipments' ), 10, 2 );
+ }
+
+ add_action( 'before_delete_post', array( __CLASS__, 'before_delete_refund' ), 10, 1 );
+ add_action( 'woocommerce_delete_order_refund', array( __CLASS__, 'delete_refund_order' ), 10, 1 );
+ add_action( 'woocommerce_order_refund_object_updated_props', array( __CLASS__, 'refresh_refund_order' ), 10, 1 );
+
+ // Check if order is shipped
+ add_action( 'woocommerce_gzd_shipment_status_changed', array( __CLASS__, 'maybe_update_order_date_shipped' ), 10, 4 );
+
+ add_action( 'woocommerce_gzd_shipping_provider_deactivated', array( __CLASS__, 'maybe_disable_default_shipping_provider' ), 10 );
+ }
+
+ /**
+ * In case a certain shipping provider is being deactivated make sure that the default
+ * shipping provider option is removed in case the option equals the deactivated provider.
+ *
+ * @param ShippingProvider $provider
+ */
+ public static function maybe_disable_default_shipping_provider( $provider ) {
+ $default_provider = wc_gzd_get_default_shipping_provider();
+
+ if ( $default_provider === $provider->get_name() ) {
+ update_option( 'woocommerce_gzd_shipments_default_shipping_provider', '' );
+ }
+ }
+
+ /**
+ * @param $shipment_id
+ * @param $status_from
+ * @param $status_to
+ * @param Shipment $shipment
+ */
+ public static function maybe_update_order_date_shipped( $shipment_id, $status_from, $status_to, $shipment ) {
+ if ( 'simple' === $shipment->get_type() && ( $order = $shipment->get_order() ) ) {
+ self::check_order_shipped( $order );
+ }
+ }
+
+ public static function check_order_shipped( $order ) {
+ if ( $shipment_order = wc_gzd_get_shipment_order( $order ) ) {
+ if ( 'shipped' === $shipment_order->get_shipping_status() ) {
+ /**
+ * Action that fires as soon as an order has been shipped completely.
+ * That is the case when the order contains all relevant shipments and all the shipments are marked as shipped.
+ *
+ * @param string $order_id The order id.
+ *
+ * @since 3.1.0
+ * @package Vendidero/Germanized/Shipments
+ */
+ do_action( 'woocommerce_gzd_shipments_order_shipped', $shipment_order->get_order()->get_id() );
+
+ $shipment_order->get_order()->update_meta_data( '_date_shipped', current_time( 'timestamp', true ) );
+ $shipment_order->get_order()->save();
+ } else {
+ $shipment_order->get_order()->delete_meta_data( '_date_shipped' );
+ $shipment_order->get_order()->save();
+ }
+ }
+ }
+
+ /**
+ * Delete editable shipments if an order is cancelled.
+ *
+ * @param $order_id
+ * @param WC_Order $order
+ */
+ public static function maybe_cancel_shipments( $order_id, $order ) {
+ $shipments = wc_gzd_get_shipments_by_order( $order );
+
+ foreach( $shipments as $shipment ) {
+ if ( $shipment->is_editable() ) {
+ $shipment->delete();
+ }
+ }
+ }
+
+ public static function before_delete_refund( $refund_id ) {
+ if ( $refund = wc_get_order( $refund_id ) ) {
+
+ if ( is_a( $refund, 'WC_Order_Refund' ) ) {
+ self::$current_refund_parent_order = $refund->get_parent_id();
+ }
+ }
+ }
+
+ public static function delete_refund_order( $refund_id ) {
+ if ( self::$current_refund_parent_order !== false ) {
+
+ if ( $order_shipment = wc_gzd_get_shipment_order( self::$current_refund_parent_order ) ) {
+ $order_shipment->validate_shipments();
+ }
+
+ self::$current_refund_parent_order = false;
+ }
+ }
+
+ public static function refresh_refund_order( $refund ) {
+ if ( $refund->get_parent_id() <= 0 ) {
+ return;
+ }
+
+ if ( $order_shipment = wc_gzd_get_shipment_order( $refund->get_parent_id() ) ) {
+ $order_shipment->validate_shipments();
+ }
+ }
+
+ public static function delete_order( $order_id ) {
+ if ( $order_shipment = wc_gzd_get_shipment_order( $order_id ) ) {
+
+ foreach( $order_shipment->get_shipments() as $shipment ) {
+
+ if ( $shipment->is_editable() ) {
+ $order_shipment->remove_shipment( $shipment->get_id() );
+ }
+ }
+
+ $order_shipment->save();
+ }
+ }
+
+ public static function new_order( $order ) {
+ if ( $order_shipment = wc_gzd_get_shipment_order( $order ) ) {
+ $order_shipment->validate_shipments();
+ }
+ }
+
+ public static function update_order( $order_id ) {
+ if ( $order_shipment = wc_gzd_get_shipment_order( $order_id ) ) {
+ $order_shipment->validate_shipments();
+ }
+ }
+
+ public static function delete_order_item( $order_item_id ) {
+ try {
+ if ( $order_id = wc_get_order_id_by_order_item_id( $order_item_id ) ) {
+
+ if ( $order_shipment = wc_gzd_get_shipment_order( $order_id ) ) {
+ foreach( $order_shipment->get_shipments() as $shipment ) {
+
+ if ( $shipment->is_editable() ) {
+ if ( $item = $shipment->get_item_by_order_item_id( $order_item_id ) ) {
+ $shipment->remove_item( $item->get_id() );
+ }
+ }
+ }
+
+ $order_shipment->save();
+ }
+ }
+ } catch( Exception $e ) {}
+ }
+
+ public static function create_order_item( $order_item_id, $order_item, $order_id ) {
+ if ( $order_shipment = wc_gzd_get_shipment_order( $order_id ) ) {
+ $order_shipment->validate_shipments();
+ }
+ }
+
+ protected static function is_admin_save_order_request() {
+ $is_admin_order_save_request = doing_action( 'save_post' );
+
+ /**
+ * Detect admin order adjustments e.g. add item, remove item, save post etc. and
+ * prevent singular order item hooks from executing to prevent multiple shipment validation requests
+ * which will execute on order save hook as well.
+ */
+ if ( ! $is_admin_order_save_request && wp_doing_ajax() && isset( $_REQUEST['action'] ) && isset( $_REQUEST['order_id'] ) && strpos( $_REQUEST['action'], 'woocommerce_' ) !== false ) {
+ $is_admin_order_save_request = true;
+ }
+
+ return $is_admin_order_save_request;
+ }
+
+ /**
+ * @param $order_item_id
+ * @param WC_Order_Item $order_item
+ */
+ public static function update_order_item( $order_item_id, $order_item ) {
+ if ( ! self::is_admin_save_order_request() ) {
+ if ( is_callable( array( $order_item, 'get_order_id' ) ) ) {
+
+ if ( $order_shipment = wc_gzd_get_shipment_order( $order_item->get_order_id() ) ) {
+ $order_shipment->validate_shipments();
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/src/WPMLHelper.php b/packages/woocommerce-germanized-shipments/src/WPMLHelper.php
new file mode 100644
index 000000000..3f8cb95fe
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/src/WPMLHelper.php
@@ -0,0 +1,142 @@
+get_shipping_providers() as $provider ) {
+ add_filter( "woocommerce_gzd_shipping_provider_{$provider->get_name()}_get_tracking_desc_placeholder", array( __CLASS__, 'filter_shipping_provider_placeholder' ), 10, 2 );
+ add_filter( "woocommerce_gzd_shipping_provider_{$provider->get_name()}_get_tracking_url_placeholder", array( __CLASS__, 'filter_shipping_provider_url' ), 10, 2 );
+ add_filter( "woocommerce_gzd_shipping_provider_{$provider->get_name()}_get_return_instructions", array( __CLASS__, 'filter_shipping_provider_return_instructions' ), 10, 2 );
+ }
+ }
+
+ public static function filter_shipping_provider_return_instructions( $instructions, $provider ) {
+ $string_name = "return_instructions";
+ $translated_string = apply_filters( 'wpml_translate_string', $instructions, self::get_shipping_provider_string_id( $string_name, $provider ), self::get_shipping_provider_string_package( $string_name, $provider ) );
+
+ return $translated_string;
+ }
+
+ public static function filter_shipping_provider_url( $placeholder, $provider ) {
+ $string_name = "tracking_url_placeholder";
+ $translated_string = apply_filters( 'wpml_translate_string', $placeholder, self::get_shipping_provider_string_id( $string_name, $provider ), self::get_shipping_provider_string_package( $string_name, $provider ) );
+
+ return $translated_string;
+ }
+
+ public static function filter_shipping_provider_placeholder( $placeholder, $provider ) {
+ $string_name = "tracking_desc_placeholder";
+ $translated_string = apply_filters( 'wpml_translate_string', $placeholder, self::get_shipping_provider_string_id( $string_name, $provider ), self::get_shipping_provider_string_package( $string_name, $provider ) );
+
+ return $translated_string;
+ }
+
+ /**
+ * @param integer $provider_id
+ * @param Simple $provider
+ */
+ public static function register_shipping_provider_strings( $provider_id, $provider ) {
+
+ foreach( self::get_shipping_provider_strings() as $string_name => $title ) {
+ $title = sprintf( $title, $provider->get_title() );
+ $getter = "get_{$string_name}";
+
+ if ( is_callable( array( $provider, $getter ) ) ) {
+ $value = $provider->{$getter}();
+
+ do_action( 'wpml_register_string', $value, self::get_shipping_provider_string_id( $string_name, $provider ), self::get_shipping_provider_string_package( $string_name, $provider ), $title, 'AREA' );
+ }
+ }
+ }
+
+ protected static function get_shipping_provider_strings() {
+ $strings = array(
+ 'tracking_desc_placeholder' => _x( '%s tracking description', 'shipments', 'woocommerce-germanized' ),
+ 'tracking_url_placeholder' => _x( '%s tracking URL', 'shipments', 'woocommerce-germanized' ),
+ 'return_instructions' => _x( '%s return instructions', 'shipments', 'woocommerce-germanized' ),
+ );
+
+ return $strings;
+ }
+
+ /**
+ * @param $string_name
+ * @param Simple $provider
+ */
+ protected static function get_shipping_provider_string_id( $string_name, $provider ) {
+ return "woocommerce_gzd_shipping_provider_{$provider->get_name()}_{$string_name}";
+ }
+
+ /**
+ * @param $string_name
+ * @param Simple $provider
+ */
+ protected static function get_shipping_provider_string_package( $string_name, $provider ) {
+ $strings = self::get_shipping_provider_strings();
+ $package = array();
+
+ if ( array_key_exists( $string_name, $strings ) ) {
+ $title = sprintf( $strings[ $string_name ], $provider->get_title() );
+
+ $package = array(
+ 'kind' => 'Shipping Provider',
+ 'name' => "{$provider->get_name()}_{$string_name}",
+ 'edit_link' => $provider->get_edit_link(),
+ 'title' => $title,
+ );
+ }
+
+ return $package;
+ }
+
+ /**
+ * @param $emails
+ */
+ public static function register_emails( $emails ) {
+ $emails['WC_GZD_Email_Customer_Shipment'] = 'customer_shipment';
+ $emails['WC_GZD_Email_Customer_Return_Shipment'] = 'customer_return_shipment';
+ $emails['WC_GZD_Email_Customer_Return_Shipment_Delivered'] = 'customer_return_shipment_delivered';
+ $emails['WC_GZD_Email_Customer_Guest_Return_Shipment_Request'] = 'customer_guest_return_shipment_request';
+
+ return $emails;
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/templates/emails/admin-new-return-shipment-request.php b/packages/woocommerce-germanized-shipments/templates/emails/admin-new-return-shipment-request.php
new file mode 100644
index 000000000..5dcd06ebe
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/templates/emails/admin-new-return-shipment-request.php
@@ -0,0 +1,60 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-germanized-shipments/templates/myaccount/view-shipment.php b/packages/woocommerce-germanized-shipments/templates/myaccount/view-shipment.php
new file mode 100644
index 000000000..7c28e5636
--- /dev/null
+++ b/packages/woocommerce-germanized-shipments/templates/myaccount/view-shipment.php
@@ -0,0 +1,42 @@
+
+
"),s("html, body").animate({scrollTop:o.getSettingsWrapper().offset().top-100},1e3)},validate:function(e){var t=a.admin,o=!0,i=e.attr("id"),r="_code"===i.substr(i.length-5),i=e.val();return e.data("validate")?"integer"===e.data("validate")&&(i=parseInt(i),isNaN(i)&&(o=!1)):t.isExpertMode()&&r&&""===i&&(o=!1),o},onSaveForm:function(){var o=a.admin,i=!0;return s("textarea, input, select").removeClass("wc-ts-has-error"),s("textarea:visible, input:visible, select:visible").each(function(){var e=s(this).attr("id"),t="_code"===e.substr(e.length-5),e=s(this).parents("tr").find("td");e.find(".wc-ts-error").remove(),o.validate(s(this))||(s(this).addClass("wc-ts-has-error"),t=t?o.params.i18n_error_mandatory:s(this).data("validate-msg"),e.append(''+t+""),i=!1)}),i||s("html, body").animate({scrollTop:o.getSettingsWrapper().find(".wc-ts-has-error:first").offset().top-100},1e3),i},isExpertMode:function(){a.admin;return"expert"===s("#woocommerce_"+this.optionPrefix+"trusted_shops_integration_mode").val()},onClickExport:function(){var e=a.admin,t=s(this).data("href-org");s(this).attr("href",t+"&interval="+s("#woocommerce_"+e.optionPrefix+"trusted_shops_review_collector").val()+"&days="+s("#woocommerce_"+e.params.option_prefix+"trusted_shops_review_collector_days_to_send").val())}},s(document).ready(function(){a.admin.init()})}(jQuery,(wp,window.trusted_shops));
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE.mo b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE.mo
new file mode 100644
index 000000000..06afcb3b9
Binary files /dev/null and b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE.mo differ
diff --git a/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE.po b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE.po
new file mode 100644
index 000000000..56fe16296
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE.po
@@ -0,0 +1,1166 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: WooCommerce Trusted Shops\n"
+"POT-Creation-Date: 2019-10-30 17:53+0100\n"
+"PO-Revision-Date: 2019-10-30 19:17+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.4\n"
+"X-Poedit-Basepath: ../..\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
+"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;"
+"esc_attr_e;esc_html_e;esc_html__\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Poedit-SearchPathExcluded-0: node_modules\n"
+"X-Poedit-SearchPathExcluded-1: vendor\n"
+
+#: includes/admin/settings/class-wc-ts-gzd-settings-tab.php:48
+msgctxt "trusted-shops"
+msgid "Setup your Trusted Shops Integration."
+msgstr "Setze deine Trusted Shops Integration auf."
+
+#: includes/admin/settings/class-wc-ts-gzd-settings-tab.php:52
+#: includes/class-wc-ts-settings-handler.php:23
+msgctxt "trusted-shops"
+msgid "Trusted Shops"
+msgstr "Trusted Shops"
+
+#: includes/admin/views/html-notice-dependencies.php:16
+msgctxt "trusted-shops"
+msgid "Dependencies Missing or Outdated"
+msgstr "Wichtige Plugins fehlen oder sind veraltet"
+
+#: includes/admin/views/html-notice-dependencies.php:24
+msgctxt "trusted-shops"
+msgid ""
+"To use WooCommerce Trusted Shops you may at first install the following "
+"plugins:"
+msgstr ""
+"Um WooCommerce Trusted Shops zuverlässig nutzen zu können, musst du erst "
+"folgende Plugins installieren:"
+
+#: includes/admin/views/html-notice-dependencies.php:28
+#, php-format
+msgctxt "trusted-shops"
+msgid "Install %s"
+msgstr "Install %s"
+
+#: includes/admin/views/html-notice-dependencies.php:36
+msgctxt "trusted-shops"
+msgid ""
+"To use WooCommerce Trusted Shops you may at first update the following "
+"plugins to a newer version:"
+msgstr ""
+"Um WooCommerce Trusted Shops zuverlässig nutzen zu können, update bitte "
+"folgende Plugins:"
+
+#: includes/admin/views/html-notice-dependencies.php:40
+#, php-format
+msgctxt "trusted-shops"
+msgid "%s required in at least version %s"
+msgstr "%s wird mindestens in Version %s benötigt"
+
+#: includes/admin/views/html-notice-dependencies.php:49
+msgctxt "trusted-shops"
+msgid "Check for Updates"
+msgstr "nach Updates suchen"
+
+#: includes/admin/views/html-notice-dependencies.php:50
+msgctxt "trusted-shops"
+msgid "or"
+msgstr "oder"
+
+#: includes/admin/views/html-notice-dependencies.php:51
+msgctxt "trusted-shops"
+msgid "Install an older version"
+msgstr "Installiere eine ältere Version"
+
+#: includes/admin/views/html-notice-update.php:14
+msgctxt "trusted-shops"
+msgid ""
+"WooCommerce Trusted Shops Data Update Required – We "
+"just need to update your installation to the latest version"
+msgstr ""
+"WooCommerce Trusted Shops Datenaktualisierung erforderlich "
+"– Wir müssen deine Installation auf die neueste Version updaten"
+
+#: includes/admin/views/html-notice-update.php:15
+msgctxt "trusted-shops"
+msgid "Run the updater"
+msgstr "Update starten"
+
+#: includes/admin/views/html-notice-update.php:19
+msgctxt "trusted-shops"
+msgid ""
+"It is strongly recommended that you backup your database before proceeding. "
+"Are you sure you wish to run the updater now?"
+msgstr ""
+"Du solltest vor einem Update immer ein Backup deiner Datenbank anlegen. Bist "
+"du sicher das Update jetzt zu installieren?"
+
+#: includes/admin/views/html-wpml-notice.php:11
+msgctxt "trusted-shops"
+msgid "WPML Support"
+msgstr "WPML Unterstützung"
+
+#: includes/admin/views/html-wpml-notice.php:14
+msgctxt "trusted-shops"
+msgid ""
+"These settings serve as default settings for all your languages. To adjust "
+"the settings for a certain language, please switch your admin language "
+"through the WPML language switcher and adjust the corresponding settings."
+msgstr ""
+"Diese Einstellungen werden als Standard für alle deine Sprachen verwendet. "
+"Um die Einstellungen für eine spezielle Sprache zu ändern, wechsle bitte zur "
+"entsprechenden Sprache über den WPML Sprachumschalter."
+
+#: includes/admin/views/html-wpml-notice.php:16
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"These settings apply for your %s shop. To adjust settings for another "
+"language, please switch your admin language through the WPML language "
+"switcher."
+msgstr ""
+"Diese Einstellungen werden für deinen %s Shop verwendet. Um die "
+"Einstellungen für eine andere Sprache anzupassen, wechsle bitte die Sprache "
+"über den WPML Sprachumschalter."
+
+#: includes/class-wc-trusted-shops-admin.php:84
+#: includes/class-wc-trusted-shops-admin.php:121
+msgctxt "trusted-shops"
+msgid "GTIN"
+msgstr "GTIN"
+
+#: includes/class-wc-trusted-shops-admin.php:84
+#: includes/class-wc-trusted-shops-admin.php:121
+msgctxt "trusted-shops"
+msgid ""
+"ID that allows your products to be identified worldwide. If you want to "
+"display your Trusted Shops Product Reviews in Google Shopping and paid "
+"Google adverts, Google needs the GTIN."
+msgstr ""
+"Identifikationsnummer, mit der Produkte weltweit eindeutig identifiziert "
+"werden können. Wenn du deine Trusted Shops Produktbewertungen in Google "
+"Shopping und bezahlten Google Produktanzeigen ausspielen möchtest, benötigt "
+"Google die GTIN."
+
+#: includes/class-wc-trusted-shops-admin.php:88
+#: includes/class-wc-trusted-shops-admin.php:122
+msgctxt "trusted-shops"
+msgid "MPN"
+msgstr "MPN"
+
+#: includes/class-wc-trusted-shops-admin.php:88
+#: includes/class-wc-trusted-shops-admin.php:122
+msgctxt "trusted-shops"
+msgid ""
+"If you don't have a GTIN for your products, you can pass the brand name and "
+"the MPN on to Google to use the Trusted Shops Google Integration."
+msgstr ""
+"Wenn deine Produkte keine GTIN haben, kannst du den Markennamen zusammen mit "
+"der MPN übergeben, um die Trusted Shops Google Integration zu nutzen."
+
+#: includes/class-wc-trusted-shops-admin.php:142
+msgctxt "trusted-shops"
+msgid "Brand"
+msgstr "Marke"
+
+#: includes/class-wc-trusted-shops-admin.php:176
+msgctxt "trusted-shops"
+msgid "This field is mandatory"
+msgstr "Dieses Feld ist ein Pflichtfeld"
+
+#: includes/class-wc-trusted-shops-admin.php:183
+msgctxt "trusted-shops"
+msgid "Trusted Shops Options"
+msgstr "Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:190
+msgctxt "trusted-shops"
+msgid "Arial"
+msgstr "Arial"
+
+#: includes/class-wc-trusted-shops-admin.php:191
+msgctxt "trusted-shops"
+msgid "Geneva"
+msgstr "Geneva"
+
+#: includes/class-wc-trusted-shops-admin.php:192
+msgctxt "trusted-shops"
+msgid "Georgia"
+msgstr "Georgia"
+
+#: includes/class-wc-trusted-shops-admin.php:193
+msgctxt "trusted-shops"
+msgid "Helvetica"
+msgstr "Helvetica"
+
+#: includes/class-wc-trusted-shops-admin.php:194
+msgctxt "trusted-shops"
+msgid "Sans-serif"
+msgstr "Sans-serif"
+
+#: includes/class-wc-trusted-shops-admin.php:195
+msgctxt "trusted-shops"
+msgid "Serif"
+msgstr "Serif"
+
+#: includes/class-wc-trusted-shops-admin.php:196
+msgctxt "trusted-shops"
+msgid "Trebuchet MS"
+msgstr "Trebuchet MS"
+
+#: includes/class-wc-trusted-shops-admin.php:197
+msgctxt "trusted-shops"
+msgid "Verdana"
+msgstr "Verdana"
+
+#: includes/class-wc-trusted-shops-admin.php:220
+msgctxt "trusted-shops"
+msgid "Trusted Shops Integration"
+msgstr "Trusted Shops Integration"
+
+#: includes/class-wc-trusted-shops-admin.php:221
+#, php-format
+msgctxt "trusted-shops"
+msgid "Do you need help with integrating your Trustbadge? %s"
+msgstr "Brauchst du Hilfe bei der Einbindung deines Trustbadges? %s"
+
+#: includes/class-wc-trusted-shops-admin.php:221
+msgctxt "trusted-shops"
+msgid "To the step-by-step instructions"
+msgstr "Zur Schritt-für-Schritt Anleitung"
+
+#: includes/class-wc-trusted-shops-admin.php:227
+msgctxt "trusted-shops"
+msgid "Trusted Shops ID"
+msgstr "Trusted Shops ID"
+
+#: includes/class-wc-trusted-shops-admin.php:228
+msgctxt "trusted-shops"
+msgid ""
+"The Trusted Shops ID is a unique identifier for your shop. You can find your "
+"Trusted Shops ID in your My Trusted Shops account."
+msgstr ""
+"Die Trusted Shops ID identifiziert deinen Shop eindeutig bei Trusted Shops. "
+"Du findest deine Trusted Shops ID in deinem My Trusted Shops Account."
+
+#: includes/class-wc-trusted-shops-admin.php:237
+msgctxt "trusted-shops"
+msgid "Edit Mode"
+msgstr "Bearbeitungsmodus"
+
+#: includes/class-wc-trusted-shops-admin.php:239
+#: includes/class-wc-trusted-shops-admin.php:300
+#: includes/class-wc-trusted-shops-admin.php:423
+msgctxt "trusted-shops"
+msgid ""
+"The advanced configuration is for users with programming skills. Here you "
+"can create even more individual settings."
+msgstr ""
+"Der Expertenmodus ist für fortgeschrittene Nutzer mit Programmierkenntnissen "
+"gedacht. Hier kannst du noch mehr individuelle Einstellungen vornehmen."
+
+#: includes/class-wc-trusted-shops-admin.php:243
+msgctxt "trusted-shops"
+msgid "Standard configuration"
+msgstr "Standardmodus"
+
+#: includes/class-wc-trusted-shops-admin.php:244
+msgctxt "trusted-shops"
+msgid "Advanced configuration"
+msgstr "Expertenmodus"
+
+#: includes/class-wc-trusted-shops-admin.php:252
+msgctxt "trusted-shops"
+msgid "Configure your Trustbadge"
+msgstr "Konfiguriere dein Trustbadge"
+
+#: includes/class-wc-trusted-shops-admin.php:258
+msgctxt "trusted-shops"
+msgid "Display Trustbadge"
+msgstr "Trustbadge anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:260
+msgctxt "trusted-shops"
+msgid "Display the Trustbadge on all the pages of your shop."
+msgstr "Zeige das Trustbadge auf allen Seiten deines Shops an."
+
+#: includes/class-wc-trusted-shops-admin.php:267
+msgctxt "trusted-shops"
+msgid "Variant"
+msgstr "Variante"
+
+#: includes/class-wc-trusted-shops-admin.php:269
+msgctxt "trusted-shops"
+msgid "You can display your Trustbadge with or without Review Stars."
+msgstr "Du kannst dein Trustbadge mit oder ohne Bewertungssterne anzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:273
+#: includes/class-wc-trusted-shops-admin.php:763
+msgctxt "trusted-shops"
+msgid "Display Trustbadge with review stars"
+msgstr "Trustbadge mit Bewertungssternen anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:274
+#: includes/class-wc-trusted-shops-admin.php:767
+msgctxt "trusted-shops"
+msgid "Display Trustbadge without review stars"
+msgstr "Trustbadge ohne Bewertungssterne anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:280
+msgctxt "trusted-shops"
+msgid "Vertical Offset"
+msgstr "Vertikaler Abstand"
+
+#: includes/class-wc-trusted-shops-admin.php:281
+msgctxt "trusted-shops"
+msgid ""
+"Choose the distance that the Trustbadge will appear from the bottom-right "
+"corner of the screen."
+msgstr ""
+"Wähle einen Abstand für dein Trustbadge vom unteren rechten Bildschirmrand."
+
+#: includes/class-wc-trusted-shops-admin.php:284
+#: includes/class-wc-trusted-shops-admin.php:492
+#: includes/class-wc-trusted-shops-admin.php:543
+#: includes/class-wc-trusted-shops-admin.php:558
+msgctxt "trusted-shops"
+msgid "px"
+msgstr "px"
+
+#: includes/class-wc-trusted-shops-admin.php:290
+#: includes/class-wc-trusted-shops-admin.php:499
+#: includes/class-wc-trusted-shops-admin.php:549
+#: includes/class-wc-trusted-shops-admin.php:565
+#, php-format
+msgctxt "trusted-shops"
+msgid "Please choose a non-negative number (at least %d)"
+msgstr "Bitte verwende eine nicht-negative Nummer (mindestens %d)"
+
+#: includes/class-wc-trusted-shops-admin.php:296
+msgctxt "trusted-shops"
+msgid "Trustbadge code"
+msgstr "Trustbadge Code"
+
+#: includes/class-wc-trusted-shops-admin.php:308
+msgctxt "trusted-shops"
+msgid "Configure your Shop Reviews"
+msgstr "Konfiguriere deine Shopbewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:314
+msgctxt "trusted-shops"
+msgid "Display Shop Review Sticker"
+msgstr "Shopbewertungssticker anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:315
+msgctxt "trusted-shops"
+msgid ""
+"To display the Shop Review Sticker, you have to assign the widget \"Trusted "
+"Shops Review Sticker\"."
+msgstr ""
+"Um den Shopbewertungssticker anzuzeigen, musst du das Widget „Trusted Shops "
+"Shopbewertungssticker“ zuweisen."
+
+#: includes/class-wc-trusted-shops-admin.php:316
+#, php-format
+msgctxt "trusted-shops"
+msgid "Assign widget %s"
+msgstr "Widget %s zuweisen"
+
+#: includes/class-wc-trusted-shops-admin.php:316
+#: includes/class-wc-trusted-shops-admin.php:588
+#: includes/class-wc-trusted-shops-admin.php:896
+msgctxt "trusted-shops"
+msgid "here"
+msgstr "hier"
+
+#: includes/class-wc-trusted-shops-admin.php:324
+#: includes/class-wc-trusted-shops-admin.php:472
+msgctxt "trusted-shops"
+msgid "Background color"
+msgstr "Hintergrundfarbe"
+
+#: includes/class-wc-trusted-shops-admin.php:325
+msgctxt "trusted-shops"
+msgid "Choose the background color for your Review Sticker."
+msgstr "Wähle die Hintergrundfarbe für deinen Review Sticker."
+
+#: includes/class-wc-trusted-shops-admin.php:332
+msgctxt "trusted-shops"
+msgid "Font"
+msgstr "Schriftart"
+
+#: includes/class-wc-trusted-shops-admin.php:334
+msgctxt "trusted-shops"
+msgid "Choose the font for your Review Sticker."
+msgstr "Wähle die Schriftart für deinen Review Sticker."
+
+#: includes/class-wc-trusted-shops-admin.php:341
+msgctxt "trusted-shops"
+msgid "Number of reviews displayed"
+msgstr "Anzahl Bewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:342
+msgctxt "trusted-shops"
+msgid ""
+"Display x alternating Shop Reviews in your Shop Review Sticker. You can "
+"display between 1 and 5 alternating Shop Reviews."
+msgstr ""
+"Zeige x Shopbewertungen im Wechsel in deinem Shopbewertungssticker an. Es "
+"können mindestens 1 und maximal 5 Bewertungen im Wechsel angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:345
+msgctxt "trusted-shops"
+msgid "Show x alternating reviews"
+msgstr "x Bewertungen im Wechsel zeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:352
+#: includes/class-wc-trusted-shops-admin.php:369
+#, php-format
+msgctxt "trusted-shops"
+msgid "Please choose a non-negative number between %d and %d"
+msgstr "Bitte verwende eine nicht-negative Nummer zwischen %d und %d"
+
+#: includes/class-wc-trusted-shops-admin.php:358
+msgctxt "trusted-shops"
+msgid "Minimum rating displayed"
+msgstr "Angezeigte Mindestnote"
+
+#: includes/class-wc-trusted-shops-admin.php:359
+msgctxt "trusted-shops"
+msgid "Only show Shop Reviews with a minimum rating of x stars. "
+msgstr "Zeige nur Shopbewertungen mit einer Mindestanzahl von x Sternen."
+
+#: includes/class-wc-trusted-shops-admin.php:362
+msgctxt "trusted-shops"
+msgid "Star(s)"
+msgstr "Stern(e)"
+
+#: includes/class-wc-trusted-shops-admin.php:375
+msgctxt "trusted-shops"
+msgid "Sticker code"
+msgstr "Sticker Code"
+
+#: includes/class-wc-trusted-shops-admin.php:379
+#: includes/class-wc-trusted-shops-admin.php:506
+#: includes/class-wc-trusted-shops-admin.php:571
+msgctxt "trusted-shops"
+msgid ""
+"The advanced configuration is for users with programming skills. Here you "
+"can perform even more individual settings."
+msgstr ""
+"Der Expertenmodus ist für fortgeschrittene Nutzer mit Programmierkenntnissen "
+"gedacht. Hier kannst du noch mehr individuelle Einstellungen vornehmen."
+
+#: includes/class-wc-trusted-shops-admin.php:385
+msgctxt "trusted-shops"
+msgid "Google Organic Search"
+msgstr "Organische Google Suche"
+
+#: includes/class-wc-trusted-shops-admin.php:386
+msgctxt "trusted-shops"
+msgid ""
+"Activate this option to give Google the opportunity to show your Shop "
+"Reviews in Google organic search results."
+msgstr ""
+"Aktiviere diese Funktion, um Google die Möglichkeit zu geben, deine "
+"Shopbewertungen in den organischen Google Suchergebnissen anzuzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:387
+msgctxt "trusted-shops"
+msgid ""
+"By activating this option, rich snippets will be integrated in the selected "
+"pages so your shop review stars may be displayed in Google organic search "
+"results. If you use Product Reviews and already activated rich snippets in "
+"expert mode, we recommend integrating rich snippets for Shop Reviews on "
+"category pages only."
+msgstr ""
+"Wenn du diese Option aktivierst, werden Rich Snippets in die ausgewählten "
+"Seiten eingebunden, sodass deine Shopbewertungssterne in den organischen "
+"Google Suchergebnissen angezeigt werden können. Wenn du Produktbewertungen "
+"aktiviert hast und dort im Expertenmodus bereits Rich Snippets aktiviert "
+"hast, empfehlen wir die Ausgabe der Rich Snippets für Shopbewertungen nur "
+"auf der Kategorieseite."
+
+#: includes/class-wc-trusted-shops-admin.php:394
+msgctxt "trusted-shops"
+msgid "Activate rich snippets on"
+msgstr "Rich Snippets aktivieren auf"
+
+#: includes/class-wc-trusted-shops-admin.php:395
+msgctxt "trusted-shops"
+msgid "category pages"
+msgstr "Kategorieseiten"
+
+#: includes/class-wc-trusted-shops-admin.php:403
+msgctxt "trusted-shops"
+msgid "product pages"
+msgstr "Produktdetailseiten"
+
+#: includes/class-wc-trusted-shops-admin.php:411
+msgctxt "trusted-shops"
+msgid "homepage (not recommended)"
+msgstr "Startseite (nicht empfohlen)"
+
+#: includes/class-wc-trusted-shops-admin.php:419
+msgctxt "trusted-shops"
+msgid "Rich snippets code"
+msgstr "Rich Snippets Code"
+
+#: includes/class-wc-trusted-shops-admin.php:431
+msgctxt "trusted-shops"
+msgid "Configure your Product Reviews "
+msgstr "Konfiguriere deine Produktbewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:432
+#, php-format
+msgctxt "trusted-shops"
+msgid "To use Product Reviews, activate them in your %s first."
+msgstr ""
+"Um Produktbewertungen nutzen zu können, schalte diese zuerst in deinem %s "
+"frei."
+
+#: includes/class-wc-trusted-shops-admin.php:432
+msgctxt "trusted-shops"
+msgid "Trusted Shops package"
+msgstr "Trusted Shops Paket"
+
+#: includes/class-wc-trusted-shops-admin.php:438
+msgctxt "trusted-shops"
+msgid "Collect Product Reviews"
+msgstr "Produktbewertungen sammeln"
+
+#: includes/class-wc-trusted-shops-admin.php:439
+msgctxt "trusted-shops"
+msgid ""
+"Show Product Reviews on the product page in a separate tab, just as shown on "
+"the picture on the right."
+msgstr ""
+"Zeige Produktbewertungen auf der Produktseite in einem separaten Reiter, wie "
+"in der Grafik rechts abgebildet."
+
+#: includes/class-wc-trusted-shops-admin.php:447
+msgctxt "trusted-shops"
+msgid "Reviews"
+msgstr "Bewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:448
+#: includes/class-wc-trusted-shops-admin.php:457
+msgctxt "trusted-shops"
+msgid "You can choose a name for the tab with your Product Reviews."
+msgstr ""
+"Du kannst selbst bestimmen, wie der Reiter in dem deine Produktbewertungen "
+"angezeigt werden, heißen soll."
+
+#: includes/class-wc-trusted-shops-admin.php:449
+msgctxt "trusted-shops"
+msgid "Show Product Reviews on the product detail page in an additional tab."
+msgstr "Produktbewertungen auf der Produktseite in separatem Reiter anzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:456
+msgctxt "trusted-shops"
+msgid "Name of Product Reviews tab"
+msgstr "Bezeichnung Reiter"
+
+#: includes/class-wc-trusted-shops-admin.php:460
+msgctxt "trusted-shops"
+msgid "Product reviews"
+msgstr "Produktbewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:464
+msgctxt "trusted-shops"
+msgid "Border color"
+msgstr "Umrandung"
+
+#: includes/class-wc-trusted-shops-admin.php:465
+msgctxt "trusted-shops"
+msgid "Set the color for the frame around your Product Reviews."
+msgstr "Lege die Farbe für den Rahmen um deine Produktbewertungen fest."
+
+#: includes/class-wc-trusted-shops-admin.php:473
+msgctxt "trusted-shops"
+msgid "Set the background color for your Product Reviews."
+msgstr "Lege die Hintergrundfarbe für deine Produktbewertungen fest."
+
+#: includes/class-wc-trusted-shops-admin.php:480
+#: includes/class-wc-trusted-shops-admin.php:530
+msgctxt "trusted-shops"
+msgid "Star color"
+msgstr "Farbe der Sterne"
+
+#: includes/class-wc-trusted-shops-admin.php:481
+msgctxt "trusted-shops"
+msgid "Set the color for the Product Review stars in your Product Reviews tab."
+msgstr ""
+"Lege die Farbe der Sterne fest, die in deinem Produktbewertungs-Reiter "
+"angezeigt werden. "
+
+#: includes/class-wc-trusted-shops-admin.php:488
+#: includes/class-wc-trusted-shops-admin.php:538
+msgctxt "trusted-shops"
+msgid "Star size"
+msgstr "Größe der Sterne"
+
+#: includes/class-wc-trusted-shops-admin.php:493
+msgctxt "trusted-shops"
+msgid "Set the size for the Product Review stars in your Product Reviews tab."
+msgstr ""
+"Lege die Größe der Sterne fest, die in deinem Produktbewertungs-Reiter "
+"angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:504
+msgctxt "trusted-shops"
+msgid "Product Sticker Code"
+msgstr "Produktbewertungen Code"
+
+#: includes/class-wc-trusted-shops-admin.php:513
+#: includes/class-wc-trusted-shops-admin.php:579
+msgctxt "trusted-shops"
+msgid "jQuerySelector"
+msgstr "jQuerySelector"
+
+#: includes/class-wc-trusted-shops-admin.php:514
+msgctxt "trusted-shops"
+msgid ""
+"Please choose where your Product Reviews shall be displayed on the Product "
+"detail page."
+msgstr ""
+"Wähle, wo die Produktbewertungen auf der Produktdetailseite angezeigt werden "
+"sollen."
+
+#: includes/class-wc-trusted-shops-admin.php:521
+msgctxt "trusted-shops"
+msgid "Rating stars"
+msgstr "Bewertungssterne"
+
+#: includes/class-wc-trusted-shops-admin.php:522
+msgctxt "trusted-shops"
+msgid "Show star ratings on the product detail page below your product name."
+msgstr "Bewertungssterne auf der Produktseite unter dem Produktnamen anzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:523
+msgctxt "trusted-shops"
+msgid ""
+"Display Product Review stars on product pages below the product name, just "
+"as shown in the picture on the right."
+msgstr ""
+"Zeige Bewertungssterne auf der Produktseite unter dem Produktnamen, wie in "
+"der Grafik rechts abgebildet."
+
+#: includes/class-wc-trusted-shops-admin.php:532
+msgctxt "trusted-shops"
+msgid ""
+"Set the color for the review stars, that are displayed on the product page, "
+"below your product name."
+msgstr ""
+"Lege die Farbe der Sterne fest, die auf der Produktseite unter deinem "
+"Produktnamen angezeigt werden. "
+
+#: includes/class-wc-trusted-shops-admin.php:540
+msgctxt "trusted-shops"
+msgid ""
+"Set the size for the review stars that are displayed on the product page, "
+"below your product name."
+msgstr ""
+"Lege die Größe der Sterne fest, die auf der Produktseite unter deinem "
+"Produktnamen angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:554
+msgctxt "trusted-shops"
+msgid "Font size"
+msgstr "Schriftgröße"
+
+#: includes/class-wc-trusted-shops-admin.php:556
+msgctxt "trusted-shops"
+msgid "Set the font size for the text that goes with your review stars."
+msgstr "Lege die Schriftgröße für den Text zu deinen Bewertungssternen fest."
+
+#: includes/class-wc-trusted-shops-admin.php:570
+msgctxt "trusted-shops"
+msgid "Product Review Code"
+msgstr "Produktbewertungen Code"
+
+#: includes/class-wc-trusted-shops-admin.php:580
+msgctxt "trusted-shops"
+msgid ""
+"Please choose where your Product Review Stars shall be displayed on the "
+"Product Detail page."
+msgstr ""
+"Wähle, wo die Produktbewertungssterne auf der Produktdetailseite angezeigt "
+"werden sollen."
+
+#: includes/class-wc-trusted-shops-admin.php:587
+msgctxt "trusted-shops"
+msgid "Brand attribute"
+msgstr "Marken-Produktattribut"
+
+#: includes/class-wc-trusted-shops-admin.php:588
+#, php-format
+msgctxt "trusted-shops"
+msgid "Create brand attribute %s"
+msgstr "Marken-Produktattribut %s erstellen"
+
+#: includes/class-wc-trusted-shops-admin.php:589
+msgctxt "trusted-shops"
+msgid ""
+"Brand name of the product. By passing this information on to Google, you "
+"improve your chances of having Google identify your products. Assign your "
+"brand attribute. If your products don't have a GTIN, you can pass on the "
+"brand name and the MPN to use Google Integration."
+msgstr ""
+"Markenname des Produkts. Durch Übergeben dieser Variable verbesserst du die "
+"Möglichkeit deine Produkte von Google eindeutig identifizieren zu lassen. "
+"Weise dein Marken-Produktattribut zu. Wenn deine Produkte keine GTIN haben, "
+"kannst du den Markennamen zusammen mit der MPN übergeben, um die Google "
+"Integration zu nutzen."
+
+#: includes/class-wc-trusted-shops-admin.php:595
+msgctxt "trusted-shops"
+msgid "None"
+msgstr "Keine"
+
+#: includes/class-wc-trusted-shops-admin.php:606
+msgctxt "trusted-shops"
+msgid "Configure your Review Requests"
+msgstr "Konfiguriere deine Bewertungserinnerungen"
+
+#: includes/class-wc-trusted-shops-admin.php:607
+msgctxt "trusted-shops"
+msgid ""
+"7 days after an order has been placed, Trusted Shops automatically sends an "
+"invite to your customers. If you want to set a different time for sending "
+"automatic Review Requests, please activate the option below. If you want to "
+"send review requests with legal certainty, you need your customers' consent "
+"to receive Review Requests. You also have to include an option to "
+"unsubscribe."
+msgstr ""
+"Trusted Shops versendet 7 Tage nach Bestellung automatisch eine "
+"Bewertungserinnerung an deinen Kunden. Wenn du lieber selbst entscheiden "
+"möchtest, wann Bewertungsanfragen versendet werden, aktiviere die "
+"untenstehende Option. Möchtest du rechtssicher Bewertungs-Erinnerungen "
+"verschicken, so benötigst du die ausdrückliche Einwilligung deiner Kunden "
+"zum Empfang von Bewertungsemails. Du musst deinen Kunden zudem eine "
+"Möglichkeit geben, Bewertungserinnerungen wieder abzubestellen."
+
+#: includes/class-wc-trusted-shops-admin.php:613
+msgctxt "trusted-shops"
+msgid "Enable Review Requests"
+msgstr "Bewertungserinnerungen aktivieren"
+
+#: includes/class-wc-trusted-shops-admin.php:622
+msgctxt "trusted-shops"
+msgid "WooCommerce status"
+msgstr "Bestellstatus"
+
+#: includes/class-wc-trusted-shops-admin.php:623
+msgctxt "trusted-shops"
+msgid ""
+"We recommend choosing the order status that you set when your products have "
+"been shipped."
+msgstr ""
+"Wähle hier am besten den Bestellstatus aus WooCommerce aus, den du "
+"einstellst, wenn deine Ware versendet wurde."
+
+#: includes/class-wc-trusted-shops-admin.php:631
+msgctxt "trusted-shops"
+msgid "Days until Review Request"
+msgstr "Tage bis zur Erinnerung"
+
+#: includes/class-wc-trusted-shops-admin.php:632
+msgctxt "trusted-shops"
+msgid ""
+"Set the number of days to wait after an order has reached the order status "
+"you selected above before having a review request sent to your customers."
+msgstr ""
+"Stelle hier ein nach wie vielen Tagen nach Erreichen des oben ausgewählten "
+"Bestellstatus die Bewertungserinnerung an den Käufer versendet werden soll."
+
+#: includes/class-wc-trusted-shops-admin.php:644
+msgctxt "trusted-shops"
+msgid "Permission via checkbox"
+msgstr "Einwilligung per Checkbox"
+
+#: includes/class-wc-trusted-shops-admin.php:645
+msgctxt "trusted-shops"
+msgid ""
+"If the checkbox is activated, only customers who gave their consent will "
+"receive Review Requests."
+msgstr ""
+"Bei aktivierter Checkbox erhalten nur die Kunden eine Bewertungserinnerung, "
+"die ihr Einverständnis gegeben haben."
+
+#: includes/class-wc-trusted-shops-admin.php:649
+msgctxt "trusted-shops"
+msgid "Edit checkbox"
+msgstr "Checkbox anpassen"
+
+#: includes/class-wc-trusted-shops-admin.php:653
+msgctxt "trusted-shops"
+msgid "Unsubscribe via link"
+msgstr "Abmeldung per Link"
+
+#: includes/class-wc-trusted-shops-admin.php:654
+msgctxt "trusted-shops"
+msgid "Allows the customer to unsubscribe from Review Requests."
+msgstr ""
+"Erlaubt es dem Kunden sich von Bewertungserinnerungen per Link abzumelden."
+
+#: includes/class-wc-trusted-shops-admin.php:755
+msgctxt "trusted-shops"
+msgid "How does Trusted Shops make your shop better?"
+msgstr "Wie macht Trusted Shops deinen Shop besser?"
+
+#: includes/class-wc-trusted-shops-admin.php:757
+msgctxt "trusted-shops"
+msgid "Get your account"
+msgstr "Erstelle deinen Account"
+
+#: includes/class-wc-trusted-shops-admin.php:777
+msgctxt "trusted-shops"
+msgid "Product Reviews on the product detail page in an additional tab"
+msgstr "Produktbewertungen auf der Produktseite in einem separatem Reiter"
+
+#: includes/class-wc-trusted-shops-admin.php:780
+msgctxt "trusted-shops"
+msgid "Show Star-Ratings on the product detail page below your product name"
+msgstr "Bewertungssterne unter dem Produktnamen auf der Produktseite"
+
+#: includes/class-wc-trusted-shops-admin.php:784
+msgctxt "trusted-shops"
+msgid ""
+"Please note: If you want to send review requests through WooCommerce, you "
+"should deactivate automated review requests through Trusted Shops. To do so, "
+"please go to your My Trusted Shops account. Log in and go to Reviews > "
+"Settings and deactivate \"Collect reviews automatically\""
+msgstr ""
+"Bitte beachte: Wenn du Bewertungserinnerungen über WooCommerce versenden "
+"möchtest, solltest du den Versand von automatischen Bewertungserinnerungen "
+"über Trusted Shops deaktivieren. Gehe dazu in deinen My Trusted Shops "
+"Account. Logge dich ein und gehe zu Bewertungen > Konfiguration und "
+"deaktiviere dort „Bewertungen automatisch sammeln“."
+
+#: includes/class-wc-trusted-shops-admin.php:785
+msgctxt "trusted-shops"
+msgid "To your My Trusted Shops account"
+msgstr "Zu deinem My Trusted Shops Account"
+
+#: includes/class-wc-trusted-shops-admin.php:789
+msgctxt "trusted-shops"
+msgid ""
+"Export your customer information here and upload it in the Trusted Shops "
+"Review Collector. To do so go to your My Trusted Shops account. Log in and "
+"go to Reviews > Shop Reviews > Review Collector"
+msgstr ""
+"Exportiere hier die Kundendaten und lade diese im Trusted Shops Review "
+"Collector hoch. Gehe dazu in deinen My Trusted Shops Account. Logge dich ein "
+"und gehe zu Bewertungen > Shopbewertungen > Review Collector"
+
+#: includes/class-wc-trusted-shops-admin.php:790
+msgctxt "trusted-shops"
+msgid "To the Trusted Shops Review Collector"
+msgstr "Zum Trusted Shops Review Collector"
+
+#: includes/class-wc-trusted-shops-admin.php:880
+msgctxt "trusted-shops"
+msgid "Review Collector"
+msgstr "Review Collector"
+
+#: includes/class-wc-trusted-shops-admin.php:882
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"Want to collect reviews for orders that were placed before your Trusted "
+"Shops Integration? No problem. Export old orders here and upload them in "
+"your %s."
+msgstr ""
+"Du möchtest nachträglich Bewertungen zu Bestellungen sammeln, die vor der "
+"Trusted Shops Integration getätigt wurden? Kein Problem. Exportiere alte "
+"Bestellungen hier und lade diese in deinem %s hoch."
+
+#: includes/class-wc-trusted-shops-admin.php:882
+msgctxt "trusted-shops"
+msgid "My Trusted Shops account"
+msgstr "My Trusted Shops Account"
+
+#: includes/class-wc-trusted-shops-admin.php:888
+msgctxt "trusted-shops"
+msgid "Export orders"
+msgstr "Bestellungen exportieren"
+
+#: includes/class-wc-trusted-shops-admin.php:888
+msgctxt "trusted-shops"
+msgid ""
+"Export your customer and order information of the last x days and upload "
+"them in your My Trusted Shops Account."
+msgstr ""
+"Exportiere deine Kunden- und Bestelldaten der letzten x Tage und lade diese "
+"in deinem My Trusted Shops Account hoch."
+
+#: includes/class-wc-trusted-shops-admin.php:892
+msgctxt "trusted-shops"
+msgid "30 days"
+msgstr "30 Tage"
+
+#: includes/class-wc-trusted-shops-admin.php:893
+msgctxt "trusted-shops"
+msgid "60 days"
+msgstr "60 Tage"
+
+#: includes/class-wc-trusted-shops-admin.php:894
+msgctxt "trusted-shops"
+msgid "90 days"
+msgstr "90 Tage"
+
+#: includes/class-wc-trusted-shops-admin.php:896
+#, php-format
+msgctxt "trusted-shops"
+msgid "Upload customer and order information %s."
+msgstr "Kunden- und Bestelldaten %s hochladen"
+
+#: includes/class-wc-trusted-shops-admin.php:899
+msgctxt "trusted-shops"
+msgid "Days until reminder mail"
+msgstr "Tage bis zur Erinnerung"
+
+#: includes/class-wc-trusted-shops-admin.php:899
+msgctxt "trusted-shops"
+msgid ""
+"Set the number of days to wait after the order date before having a Review "
+"Request sent to your customers."
+msgstr ""
+"Stelle hier ein, wie viele Tage zwischen der Bestellung und dem Versand der "
+"Bewertungserinnerung liegen soll."
+
+#: includes/class-wc-trusted-shops-admin.php:903
+msgctxt "trusted-shops"
+msgid "Start export"
+msgstr "Export starten"
+
+#: includes/class-wc-trusted-shops-core.php:55
+#: includes/class-wc-trusted-shops-core.php:64
+#: includes/class-wc-ts-dependencies.php:36
+#: includes/class-wc-ts-dependencies.php:45
+msgctxt "trusted-shops"
+msgid "Cheatin’ huh?"
+msgstr "So geht das leider nicht.."
+
+#: includes/class-wc-trusted-shops-core.php:213
+msgctxt "trusted-shops"
+msgid "Yes"
+msgstr "Ja"
+
+#: includes/class-wc-trusted-shops-core.php:213
+msgctxt "trusted-shops"
+msgid "No"
+msgstr "Nein"
+
+#: includes/class-wc-trusted-shops-core.php:261
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"If the App helped you, please leave a %s★★"
+"★★★%s in the Wordpress plugin repository."
+msgstr ""
+"Wenn dir die App hilft, hinterlasse bitte eine %s★"
+"★★★★%s Bewertung in der WordPress Plugin Bibliothek."
+
+#: includes/class-wc-trusted-shops-core.php:410
+msgctxt "trusted-shops"
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:64
+msgctxt "trusted-shops"
+msgid "Order ID"
+msgstr "Bestellnummer"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:65
+msgctxt "trusted-shops"
+msgid "Order date"
+msgstr "Bestelldatum"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:66
+msgctxt "trusted-shops"
+msgid "# Days"
+msgstr "# Tage"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:67
+msgctxt "trusted-shops"
+msgid "Email"
+msgstr "E-Mail"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:68
+msgctxt "trusted-shops"
+msgid "First name"
+msgstr "Vorname"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:69
+msgctxt "trusted-shops"
+msgid "Last name"
+msgstr "Nachname"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:121
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"Your review reminder e-mail has been cancelled successfully. Return to %s."
+msgstr ""
+"Deine Bewertungserinnerung wurde erfolgreich deaktiviert. Kehre zurück zur "
+"%s."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:121
+msgctxt "trusted-shops"
+msgid "Home"
+msgstr "Startseite"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:193
+msgctxt "trusted-shops"
+msgid ""
+"Yes, I would like to be reminded via e-mail after {days} day(s) to review my "
+"order. I am able to cancel the reminder at any time by clicking on the "
+"\"cancel review reminder\" link within the order confirmation."
+msgstr ""
+"Ja, ich bin damit einverstanden, eine Erinnerung per E-Mail zur Bewertung "
+"nach {days} Tage(n) zu erhalten. Ich kann mich jederzeit davon abmelden bzw. "
+"widersprechen, indem ich dem Link „von der Bewertungserinnerung abmelden“ in "
+"der Bestellbestätigung folge."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:198
+msgctxt "trusted-shops"
+msgid "Please allow us to send a review reminder by e-mail."
+msgstr "Bitte akzeptiere den Erhalt einer Bewertungserinnerung per E-Mail."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:201
+msgctxt "trusted-shops"
+msgid "Review reminder"
+msgstr "Bewertungs Erinnerung"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:202
+msgctxt "trusted-shops"
+msgid "Asks the customer to receive a Trusted Shops review reminder."
+msgstr ""
+"Holt die Erlaubnis zum Senden einer einmaligen Trusted Shops "
+"Bewertungserinnerung ein."
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:24
+msgctxt "trusted-shops"
+msgid "Trusted Shops Review Reminder"
+msgstr "Trusted Shops Bewertungs-Erinnerung"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:25
+msgctxt "trusted-shops"
+msgid ""
+"This E-Mail is being sent to a customer to remind him about the possibility "
+"to leave a review at Trusted Shops."
+msgstr ""
+"Diese E-Mail wird einmalig an Kunden verschickt, um diese an die Abgabe "
+"einer Bewertung bei Trusted Shops zu erinnern."
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:54
+msgctxt "trusted-shops"
+msgid "Please rate your {site_title} order from {order_date}"
+msgstr "Bitte bewerte deinen Einkauf vom {order_date} bei {site_title}"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:64
+msgctxt "trusted-shops"
+msgid "Please rate your Order"
+msgstr "Bitte bewerte deinen Einkauf"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:19
+msgctxt "trusted-shops"
+msgid "Show your TS shop review sticker."
+msgstr "Zeige deinen Trusted Shops Review Sticker an."
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:21
+msgctxt "trusted-shops"
+msgid "Trusted Shops Shop Review Sticker"
+msgstr "Trusted Shops Shop Review Sticker"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:25
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:46
+msgctxt "trusted-shops"
+msgid "Trusted Shops Reviews"
+msgstr "Trusted Shops Bewertung"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:26
+msgctxt "trusted-shops"
+msgid "Title"
+msgstr "Bezeichnung"
+
+#: src/Package.php:55
+msgctxt "trusted-shops"
+msgid ""
+"Trustbadge Reviews for WooCommerce needs at least WooCommerce version 3.1 to "
+"run."
+msgstr ""
+"Trustbadge Reviews for WooCommerce benötigt mind. WooCommerce Version 3.1 um "
+"zu starten."
+
+#: templates/emails/customer-trusted-shops.php:17
+#: templates/emails/plain/customer-trusted-shops.php:14
+#, php-format
+msgctxt "trusted-shops"
+msgid "Dear %s %s,"
+msgstr "Hallo %s %s,"
+
+#: templates/emails/customer-trusted-shops.php:18
+#: templates/emails/plain/customer-trusted-shops.php:16
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"You have recently shopped at %s. Thank you! We would be glad if you spent "
+"some time to write a review about your order. To do so please follow follow "
+"the link."
+msgstr ""
+"Du hast vor einiger Zeit bei %s eingekauft. Vielen Dank! Wir wären froh "
+"darüber, wenn du dir die Zeit nimmst und deinen Einkauf bewerten würdest. Um "
+"dies nun zu tun, klicke bitte auf den nachfolgenden Link."
+
+#: templates/emails/customer-trusted-shops.php:22
+msgctxt "trusted-shops"
+msgid "Rate Order now"
+msgstr "Einkauf jetzt bewerten"
+
+#~ msgctxt "trusted-shops"
+#~ msgid "Duplicate Plugin installation"
+#~ msgstr "Doppelte Plugin Installation"
+
+#, php-format
+#~ msgctxt "trusted-shops"
+#~ msgid ""
+#~ "It seems like you've installed WooCommerce Germanized and Trustbadge "
+#~ "Reviews for WooCommerce. Please deactivate Trustbadge Reviews for "
+#~ "WooCommerce as long as you are using WooCommerce Germanized. You can "
+#~ "manage your Trusted Shops configuration within your %s."
+#~ msgstr ""
+#~ "Es scheint als hättest du WooCommerce Germanized und Trustbadge Reviews "
+#~ "for WooCommerce installiert. Bitte deaktiviere das Trustbadge Reviews "
+#~ "Plugin solange du WooCommerce Germanized verwendest. Du kannst deine "
+#~ "Trusted Shops Konfiguration in deinen %s verwalten."
+
+#~ msgctxt "trusted-shops"
+#~ msgid "Germanized settings"
+#~ msgstr "Germanized Einstellungen"
+
+#~ msgctxt "trusted-shops"
+#~ msgid "Deactivate standalone version"
+#~ msgstr "Deaktiviere die Standalone-Version"
+
+#~ msgctxt "trusted-shops"
+#~ msgid "(WooCommerce Product Reviews will be replaced)"
+#~ msgstr "(WooCommerce Produktbewertungen werden ersetzt)"
+
+#, php-format
+#~ msgid ""
+#~ "Please install WooCommerce before "
+#~ "installing WooCommerce Germanized. Thank you!"
+#~ msgstr ""
+#~ "Bitte installiere WooCommerce bevor "
+#~ "du WooCommerce Germanized installierst. Vielen Dank!"
diff --git a/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE_formal.mo b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE_formal.mo
new file mode 100644
index 000000000..4ea14e41a
Binary files /dev/null and b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE_formal.mo differ
diff --git a/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE_formal.po b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE_formal.po
new file mode 100644
index 000000000..1b18aea99
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-de_DE_formal.po
@@ -0,0 +1,1172 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: WooCommerce Trusted Shops\n"
+"POT-Creation-Date: 2019-10-15 12:40+0200\n"
+"PO-Revision-Date: 2019-10-15 12:41+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.4\n"
+"X-Poedit-Basepath: ../..\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
+"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;"
+"esc_attr_e;esc_html_e;esc_html__\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Poedit-SearchPathExcluded-0: node_modules\n"
+"X-Poedit-SearchPathExcluded-1: vendor\n"
+
+#: includes/admin/settings/class-wc-ts-gzd-settings-tab.php:48
+msgctxt "trusted-shops"
+msgid "Setup your Trusted Shops Integration."
+msgstr "Setzen Sie Ihre Trusted Shops Integration auf."
+
+#: includes/admin/settings/class-wc-ts-gzd-settings-tab.php:52
+#: includes/class-wc-ts-settings-handler.php:23
+msgctxt "trusted-shops"
+msgid "Trusted Shops"
+msgstr "Trusted Shops"
+
+#: includes/admin/views/html-notice-dependencies.php:16
+msgctxt "trusted-shops"
+msgid "Dependencies Missing or Outdated"
+msgstr "Wichtige Plugins fehlen oder sind veraltet"
+
+#: includes/admin/views/html-notice-dependencies.php:24
+msgctxt "trusted-shops"
+msgid ""
+"To use WooCommerce Trusted Shops you may at first install the following "
+"plugins:"
+msgstr ""
+"Um WooCommerce Trusted Shops zuverlässig nutzen zu können, müssen Sie zuerst "
+"folgende Plugins installieren:"
+
+#: includes/admin/views/html-notice-dependencies.php:28
+#, php-format
+msgctxt "trusted-shops"
+msgid "Install %s"
+msgstr "Installiere %s"
+
+#: includes/admin/views/html-notice-dependencies.php:36
+msgctxt "trusted-shops"
+msgid ""
+"To use WooCommerce Trusted Shops you may at first update the following "
+"plugins to a newer version:"
+msgstr ""
+"Um WooCommerce Trusted Shops zuverlässig nutzen zu können, updaten Sie bitte "
+"folgende Plugins:"
+
+#: includes/admin/views/html-notice-dependencies.php:40
+#, php-format
+msgctxt "trusted-shops"
+msgid "%s required in at least version %s"
+msgstr "%s wird mindestens in Version %s benötigt"
+
+#: includes/admin/views/html-notice-dependencies.php:49
+msgctxt "trusted-shops"
+msgid "Check for Updates"
+msgstr "nach Updates suchen"
+
+#: includes/admin/views/html-notice-dependencies.php:50
+msgctxt "trusted-shops"
+msgid "or"
+msgstr "oder"
+
+#: includes/admin/views/html-notice-dependencies.php:51
+msgctxt "trusted-shops"
+msgid "Install an older version"
+msgstr "Installiere eine ältere Version"
+
+#: includes/admin/views/html-notice-update.php:14
+msgctxt "trusted-shops"
+msgid ""
+"WooCommerce Trusted Shops Data Update Required – We "
+"just need to update your installation to the latest version"
+msgstr ""
+"WooCommerce Trusted Shops Datenaktualisierung erforderlich "
+"– Wir müssen deine Installation auf die neueste Version updaten"
+
+#: includes/admin/views/html-notice-update.php:15
+msgctxt "trusted-shops"
+msgid "Run the updater"
+msgstr "Update starten"
+
+#: includes/admin/views/html-notice-update.php:19
+msgctxt "trusted-shops"
+msgid ""
+"It is strongly recommended that you backup your database before proceeding. "
+"Are you sure you wish to run the updater now?"
+msgstr ""
+"Sie sollten vor einem Update immer ein Backup der Datenbank anlegen. Sind "
+"Sie sicher das Update jetzt zu installieren?"
+
+#: includes/admin/views/html-wpml-notice.php:11
+msgctxt "trusted-shops"
+msgid "WPML Support"
+msgstr "WPML Unterstützung"
+
+#: includes/admin/views/html-wpml-notice.php:14
+msgctxt "trusted-shops"
+msgid ""
+"These settings serve as default settings for all your languages. To adjust "
+"the settings for a certain language, please switch your admin language "
+"through the WPML language switcher and adjust the corresponding settings."
+msgstr ""
+"Diese Einstellungen werden als Standard für alle Ihre Sprachen verwendet. Um "
+"die Einstellungen für eine spezielle Sprache zu ändern, wechseln Sie bitte "
+"zur entsprechenden Sprache über den WPML Sprachumschalter."
+
+#: includes/admin/views/html-wpml-notice.php:16
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"These settings apply for your %s shop. To adjust settings for another "
+"language, please switch your admin language through the WPML language "
+"switcher."
+msgstr ""
+"Diese Einstellungen werden für Ihren %s Shop verwendet. Um die Einstellungen "
+"für eine andere Sprache anzupassen, wechseln Sie bitte die Sprache über den "
+"WPML Sprachumschalter."
+
+#: includes/class-wc-trusted-shops-admin.php:84
+#: includes/class-wc-trusted-shops-admin.php:121
+msgctxt "trusted-shops"
+msgid "GTIN"
+msgstr "GTIN"
+
+#: includes/class-wc-trusted-shops-admin.php:84
+#: includes/class-wc-trusted-shops-admin.php:121
+msgctxt "trusted-shops"
+msgid ""
+"ID that allows your products to be identified worldwide. If you want to "
+"display your Trusted Shops Product Reviews in Google Shopping and paid "
+"Google adverts, Google needs the GTIN."
+msgstr ""
+"Identifikationsnummer, mit der Produkte weltweit eindeutig identifiziert "
+"werden können. Wenn Sie Ihre Trusted Shops Produktbewertungen in Google "
+"Shopping und bezahlten Google Produktanzeigen ausspielen möchten, benötigt "
+"Google die GTIN."
+
+#: includes/class-wc-trusted-shops-admin.php:88
+#: includes/class-wc-trusted-shops-admin.php:122
+msgctxt "trusted-shops"
+msgid "MPN"
+msgstr "MPN"
+
+#: includes/class-wc-trusted-shops-admin.php:88
+#: includes/class-wc-trusted-shops-admin.php:122
+msgctxt "trusted-shops"
+msgid ""
+"If you don't have a GTIN for your products, you can pass the brand name and "
+"the MPN on to Google to use the Trusted Shops Google Integration."
+msgstr ""
+"Wenn Ihre Produkte keine GTIN haben, können SIe den Markennamen zusammen mit "
+"der MPN übergeben, um die Trusted Shops Google Integration zu nutzen."
+
+#: includes/class-wc-trusted-shops-admin.php:142
+msgctxt "trusted-shops"
+msgid "Brand"
+msgstr "Marke"
+
+#: includes/class-wc-trusted-shops-admin.php:176
+msgctxt "trusted-shops"
+msgid "This field is mandatory"
+msgstr "Dieses Feld ist ein Pflichtfeld"
+
+#: includes/class-wc-trusted-shops-admin.php:183
+msgctxt "trusted-shops"
+msgid "Trusted Shops Options"
+msgstr "Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:190
+msgctxt "trusted-shops"
+msgid "Arial"
+msgstr "Arial"
+
+#: includes/class-wc-trusted-shops-admin.php:191
+msgctxt "trusted-shops"
+msgid "Geneva"
+msgstr "Geneva"
+
+#: includes/class-wc-trusted-shops-admin.php:192
+msgctxt "trusted-shops"
+msgid "Georgia"
+msgstr "Georgia"
+
+#: includes/class-wc-trusted-shops-admin.php:193
+msgctxt "trusted-shops"
+msgid "Helvetica"
+msgstr "Helvetica"
+
+#: includes/class-wc-trusted-shops-admin.php:194
+msgctxt "trusted-shops"
+msgid "Sans-serif"
+msgstr "Sans-serif"
+
+#: includes/class-wc-trusted-shops-admin.php:195
+msgctxt "trusted-shops"
+msgid "Serif"
+msgstr "Serif"
+
+#: includes/class-wc-trusted-shops-admin.php:196
+msgctxt "trusted-shops"
+msgid "Trebuchet MS"
+msgstr "Trebuchet MS"
+
+#: includes/class-wc-trusted-shops-admin.php:197
+msgctxt "trusted-shops"
+msgid "Verdana"
+msgstr "Verdana"
+
+#: includes/class-wc-trusted-shops-admin.php:220
+msgctxt "trusted-shops"
+msgid "Trusted Shops Integration"
+msgstr "Trusted Shops Integration"
+
+#: includes/class-wc-trusted-shops-admin.php:221
+#, php-format
+msgctxt "trusted-shops"
+msgid "Do you need help with integrating your Trustbadge? %s"
+msgstr "Brauchen Sie Hilfe bei der Einbindung Ihres Trustbadges? %s"
+
+#: includes/class-wc-trusted-shops-admin.php:221
+msgctxt "trusted-shops"
+msgid "To the step-by-step instructions"
+msgstr "Zur Schritt-für-Schritt Anleitung"
+
+#: includes/class-wc-trusted-shops-admin.php:227
+msgctxt "trusted-shops"
+msgid "Trusted Shops ID"
+msgstr "Trusted Shops ID"
+
+#: includes/class-wc-trusted-shops-admin.php:228
+msgctxt "trusted-shops"
+msgid ""
+"The Trusted Shops ID is a unique identifier for your shop. You can find your "
+"Trusted Shops ID in your My Trusted Shops account."
+msgstr ""
+"Die Trusted Shops ID identifiziert Ihren Shop eindeutig bei Trusted Shops. "
+"Sie finden die Trusted Shops ID in Ihrem My Trusted Shops Account."
+
+#: includes/class-wc-trusted-shops-admin.php:237
+msgctxt "trusted-shops"
+msgid "Edit Mode"
+msgstr "Bearbeitungsmodus"
+
+#: includes/class-wc-trusted-shops-admin.php:239
+#: includes/class-wc-trusted-shops-admin.php:300
+#: includes/class-wc-trusted-shops-admin.php:423
+msgctxt "trusted-shops"
+msgid ""
+"The advanced configuration is for users with programming skills. Here you "
+"can create even more individual settings."
+msgstr ""
+"Der Expertenmodus ist für fortgeschrittene Nutzer mit Programmierkenntnissen "
+"gedacht. Hier können Sie noch mehr individuelle Einstellungen vornehmen."
+
+#: includes/class-wc-trusted-shops-admin.php:243
+msgctxt "trusted-shops"
+msgid "Standard configuration"
+msgstr "Standardmodus"
+
+#: includes/class-wc-trusted-shops-admin.php:244
+msgctxt "trusted-shops"
+msgid "Advanced configuration"
+msgstr "Expertenmodus"
+
+#: includes/class-wc-trusted-shops-admin.php:252
+msgctxt "trusted-shops"
+msgid "Configure your Trustbadge"
+msgstr "Konfigurieren Sie Ihr Trustbadge"
+
+#: includes/class-wc-trusted-shops-admin.php:258
+msgctxt "trusted-shops"
+msgid "Display Trustbadge"
+msgstr "Trustbadge anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:260
+msgctxt "trusted-shops"
+msgid "Display the Trustbadge on all the pages of your shop."
+msgstr "Zeige das Trustbadge auf allen Seiten des Shops an."
+
+#: includes/class-wc-trusted-shops-admin.php:267
+msgctxt "trusted-shops"
+msgid "Variant"
+msgstr "Variante"
+
+#: includes/class-wc-trusted-shops-admin.php:269
+msgctxt "trusted-shops"
+msgid "You can display your Trustbadge with or without Review Stars."
+msgstr "Sie können Ihr Trustbadge mit oder ohne Bewertungssterne anzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:273
+#: includes/class-wc-trusted-shops-admin.php:763
+msgctxt "trusted-shops"
+msgid "Display Trustbadge with review stars"
+msgstr "Trustbadge mit Bewertungssternen anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:274
+#: includes/class-wc-trusted-shops-admin.php:767
+msgctxt "trusted-shops"
+msgid "Display Trustbadge without review stars"
+msgstr "Trustbadge ohne Bewertungssterne anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:280
+msgctxt "trusted-shops"
+msgid "Vertical Offset"
+msgstr "Vertikaler Abstand"
+
+#: includes/class-wc-trusted-shops-admin.php:281
+msgctxt "trusted-shops"
+msgid ""
+"Choose the distance that the Trustbadge will appear from the bottom-right "
+"corner of the screen."
+msgstr ""
+"Wählen Sie einen Abstand für Ihr Trustbadge vom unteren rechten "
+"Bildschirmrand."
+
+#: includes/class-wc-trusted-shops-admin.php:284
+#: includes/class-wc-trusted-shops-admin.php:492
+#: includes/class-wc-trusted-shops-admin.php:543
+#: includes/class-wc-trusted-shops-admin.php:558
+msgctxt "trusted-shops"
+msgid "px"
+msgstr "px"
+
+#: includes/class-wc-trusted-shops-admin.php:290
+#: includes/class-wc-trusted-shops-admin.php:499
+#: includes/class-wc-trusted-shops-admin.php:549
+#: includes/class-wc-trusted-shops-admin.php:565
+#, php-format
+msgctxt "trusted-shops"
+msgid "Please choose a non-negative number (at least %d)"
+msgstr "Bitte verwenden Sie eine nicht-negative Nummer (mindestens %d)"
+
+#: includes/class-wc-trusted-shops-admin.php:296
+msgctxt "trusted-shops"
+msgid "Trustbadge code"
+msgstr "Trustbadge Code"
+
+#: includes/class-wc-trusted-shops-admin.php:308
+msgctxt "trusted-shops"
+msgid "Configure your Shop Reviews"
+msgstr "Konfigurieren Sie Ihre Shopbewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:314
+msgctxt "trusted-shops"
+msgid "Display Shop Review Sticker"
+msgstr "Shopbewertungssticker anzeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:315
+msgctxt "trusted-shops"
+msgid ""
+"To display the Shop Review Sticker, you have to assign the widget \"Trusted "
+"Shops Review Sticker\"."
+msgstr ""
+"Um den Shopbewertungssticker anzuzeigen, müssen Sie das Widget „Trusted "
+"Shops Shopbewertungssticker“ zuweisen."
+
+#: includes/class-wc-trusted-shops-admin.php:316
+#, php-format
+msgctxt "trusted-shops"
+msgid "Assign widget %s"
+msgstr "Widget %s zuweisen"
+
+#: includes/class-wc-trusted-shops-admin.php:316
+#: includes/class-wc-trusted-shops-admin.php:588
+#: includes/class-wc-trusted-shops-admin.php:896
+msgctxt "trusted-shops"
+msgid "here"
+msgstr "hier"
+
+#: includes/class-wc-trusted-shops-admin.php:324
+#: includes/class-wc-trusted-shops-admin.php:472
+msgctxt "trusted-shops"
+msgid "Background color"
+msgstr "Hintergrundfarbe"
+
+#: includes/class-wc-trusted-shops-admin.php:325
+msgctxt "trusted-shops"
+msgid "Choose the background color for your Review Sticker."
+msgstr "Wählen Sie die Hintergrundfarbe für den Review Sticker."
+
+#: includes/class-wc-trusted-shops-admin.php:332
+msgctxt "trusted-shops"
+msgid "Font"
+msgstr "Schriftart"
+
+#: includes/class-wc-trusted-shops-admin.php:334
+msgctxt "trusted-shops"
+msgid "Choose the font for your Review Sticker."
+msgstr "Wählen Sie die Schriftart für den Review Sticker."
+
+#: includes/class-wc-trusted-shops-admin.php:341
+msgctxt "trusted-shops"
+msgid "Number of reviews displayed"
+msgstr "Anzahl Bewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:342
+msgctxt "trusted-shops"
+msgid ""
+"Display x alternating Shop Reviews in your Shop Review Sticker. You can "
+"display between 1 and 5 alternating Shop Reviews."
+msgstr ""
+"Zeige x Shopbewertungen im Wechsel in Ihrem Shopbewertungssticker an. Es "
+"können mindestens 1 und maximal 5 Bewertungen im Wechsel angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:345
+msgctxt "trusted-shops"
+msgid "Show x alternating reviews"
+msgstr "x Bewertungen im Wechsel zeigen"
+
+#: includes/class-wc-trusted-shops-admin.php:352
+#: includes/class-wc-trusted-shops-admin.php:369
+#, php-format
+msgctxt "trusted-shops"
+msgid "Please choose a non-negative number between %d and %d"
+msgstr "Bitte verwenden Sie eine nicht-negative Nummer zwischen %d und %d"
+
+#: includes/class-wc-trusted-shops-admin.php:358
+msgctxt "trusted-shops"
+msgid "Minimum rating displayed"
+msgstr "Angezeigte Mindestnote"
+
+#: includes/class-wc-trusted-shops-admin.php:359
+msgctxt "trusted-shops"
+msgid "Only show Shop Reviews with a minimum rating of x stars. "
+msgstr "Zeige nur Shopbewertungen mit einer Mindestanzahl von x Sternen."
+
+#: includes/class-wc-trusted-shops-admin.php:362
+msgctxt "trusted-shops"
+msgid "Star(s)"
+msgstr "Stern(e)"
+
+#: includes/class-wc-trusted-shops-admin.php:375
+msgctxt "trusted-shops"
+msgid "Sticker code"
+msgstr "Sticker Code"
+
+#: includes/class-wc-trusted-shops-admin.php:379
+#: includes/class-wc-trusted-shops-admin.php:506
+#: includes/class-wc-trusted-shops-admin.php:571
+msgctxt "trusted-shops"
+msgid ""
+"The advanced configuration is for users with programming skills. Here you "
+"can perform even more individual settings."
+msgstr ""
+"Der Expertenmodus ist für fortgeschrittene Nutzer mit Programmierkenntnissen "
+"gedacht. Hier können Sie noch mehr individuelle Einstellungen vornehmen."
+
+#: includes/class-wc-trusted-shops-admin.php:385
+msgctxt "trusted-shops"
+msgid "Google Organic Search"
+msgstr "Organische Google Suche"
+
+#: includes/class-wc-trusted-shops-admin.php:386
+msgctxt "trusted-shops"
+msgid ""
+"Activate this option to give Google the opportunity to show your Shop "
+"Reviews in Google organic search results."
+msgstr ""
+"Aktivieren Sie diese Funktion, um Google die Möglichkeit zu geben, Ihre "
+"Shopbewertungen in den organischen Google Suchergebnissen anzuzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:387
+msgctxt "trusted-shops"
+msgid ""
+"By activating this option, rich snippets will be integrated in the selected "
+"pages so your shop review stars may be displayed in Google organic search "
+"results. If you use Product Reviews and already activated rich snippets in "
+"expert mode, we recommend integrating rich snippets for Shop Reviews on "
+"category pages only."
+msgstr ""
+"Wenn Sie diese Option aktivieren, werden Rich Snippets in die ausgewählten "
+"Seiten eingebunden, sodass Ihre Shopbewertungssterne in den organischen "
+"Google Suchergebnissen angezeigt werden können. Wenn Sie Produktbewertungen "
+"aktiviert haben und dort im Expertenmodus bereits Rich Snippets aktiviert "
+"haben, empfehlen wir die Ausgabe der Rich Snippets für Shopbewertungen nur "
+"auf der Kategorieseite."
+
+#: includes/class-wc-trusted-shops-admin.php:394
+msgctxt "trusted-shops"
+msgid "Activate rich snippets on"
+msgstr "Rich Snippets aktivieren auf"
+
+#: includes/class-wc-trusted-shops-admin.php:395
+msgctxt "trusted-shops"
+msgid "category pages"
+msgstr "Kategorieseiten"
+
+#: includes/class-wc-trusted-shops-admin.php:403
+msgctxt "trusted-shops"
+msgid "product pages"
+msgstr "Produktdetailseiten"
+
+#: includes/class-wc-trusted-shops-admin.php:411
+msgctxt "trusted-shops"
+msgid "homepage (not recommended)"
+msgstr "Startseite (nicht empfohlen)"
+
+#: includes/class-wc-trusted-shops-admin.php:419
+msgctxt "trusted-shops"
+msgid "Rich snippets code"
+msgstr "Rich Snippets Code"
+
+#: includes/class-wc-trusted-shops-admin.php:431
+msgctxt "trusted-shops"
+msgid "Configure your Product Reviews "
+msgstr "Konfigurieren Sie die Produktbewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:432
+#, php-format
+msgctxt "trusted-shops"
+msgid "To use Product Reviews, activate them in your %s first."
+msgstr ""
+"Um Produktbewertungen nutzen zu können, schalten Sie diese zuerst in Ihrem "
+"%s frei."
+
+#: includes/class-wc-trusted-shops-admin.php:432
+msgctxt "trusted-shops"
+msgid "Trusted Shops package"
+msgstr "Trusted Shops Paket"
+
+#: includes/class-wc-trusted-shops-admin.php:438
+msgctxt "trusted-shops"
+msgid "Collect Product Reviews"
+msgstr "Produktbewertungen sammeln"
+
+#: includes/class-wc-trusted-shops-admin.php:439
+msgctxt "trusted-shops"
+msgid ""
+"Show Product Reviews on the product page in a separate tab, just as shown on "
+"the picture on the right."
+msgstr ""
+"Zeige Produktbewertungen auf der Produktseite in einem separaten Reiter, wie "
+"in der Grafik rechts abgebildet."
+
+#: includes/class-wc-trusted-shops-admin.php:447
+msgctxt "trusted-shops"
+msgid "Reviews"
+msgstr "Bewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:448
+#: includes/class-wc-trusted-shops-admin.php:457
+msgctxt "trusted-shops"
+msgid "You can choose a name for the tab with your Product Reviews."
+msgstr ""
+"Sie können selbst bestimmen, wie der Reiter in dem Ihre Produktbewertungen "
+"angezeigt werden, heißen soll."
+
+#: includes/class-wc-trusted-shops-admin.php:449
+msgctxt "trusted-shops"
+msgid "Show Product Reviews on the product detail page in an additional tab."
+msgstr "Produktbewertungen auf der Produktseite in separatem Reiter anzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:456
+msgctxt "trusted-shops"
+msgid "Name of Product Reviews tab"
+msgstr "Bezeichnung Reiter"
+
+#: includes/class-wc-trusted-shops-admin.php:460
+msgctxt "trusted-shops"
+msgid "Product reviews"
+msgstr "Produktbewertungen"
+
+#: includes/class-wc-trusted-shops-admin.php:464
+msgctxt "trusted-shops"
+msgid "Border color"
+msgstr "Umrandung"
+
+#: includes/class-wc-trusted-shops-admin.php:465
+msgctxt "trusted-shops"
+msgid "Set the color for the frame around your Product Reviews."
+msgstr "Legen Sie die Farbe für den Rahmen um die Produktbewertungen fest."
+
+#: includes/class-wc-trusted-shops-admin.php:473
+msgctxt "trusted-shops"
+msgid "Set the background color for your Product Reviews."
+msgstr "Legen Sie die Hintergrundfarbe für die Produktbewertungen fest."
+
+#: includes/class-wc-trusted-shops-admin.php:480
+#: includes/class-wc-trusted-shops-admin.php:530
+msgctxt "trusted-shops"
+msgid "Star color"
+msgstr "Farbe der Sterne"
+
+#: includes/class-wc-trusted-shops-admin.php:481
+msgctxt "trusted-shops"
+msgid "Set the color for the Product Review stars in your Product Reviews tab."
+msgstr ""
+"Legen Sie die Farbe der Sterne fest, die in Ihrem Produktbewertungs-Reiter "
+"angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:488
+#: includes/class-wc-trusted-shops-admin.php:538
+msgctxt "trusted-shops"
+msgid "Star size"
+msgstr "Größe der Sterne"
+
+#: includes/class-wc-trusted-shops-admin.php:493
+msgctxt "trusted-shops"
+msgid "Set the size for the Product Review stars in your Product Reviews tab."
+msgstr ""
+"Legen Sie die Größe der Sterne fest, die in Ihrem Produktbewertungs-Reiter "
+"angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:504
+msgctxt "trusted-shops"
+msgid "Product Sticker Code"
+msgstr "Produktbewertungen Code"
+
+#: includes/class-wc-trusted-shops-admin.php:513
+#: includes/class-wc-trusted-shops-admin.php:579
+msgctxt "trusted-shops"
+msgid "jQuerySelector"
+msgstr "jQuerySelector"
+
+#: includes/class-wc-trusted-shops-admin.php:514
+msgctxt "trusted-shops"
+msgid ""
+"Please choose where your Product Reviews shall be displayed on the Product "
+"detail page."
+msgstr ""
+"Wählen Sie, wo die Produktbewertungen auf der Produktdetailseite angezeigt "
+"werden sollen."
+
+#: includes/class-wc-trusted-shops-admin.php:521
+msgctxt "trusted-shops"
+msgid "Rating stars"
+msgstr "Bewertungssterne"
+
+#: includes/class-wc-trusted-shops-admin.php:522
+msgctxt "trusted-shops"
+msgid "Show star ratings on the product detail page below your product name."
+msgstr "Bewertungssterne auf der Produktseite unter dem Produktnamen anzeigen."
+
+#: includes/class-wc-trusted-shops-admin.php:523
+msgctxt "trusted-shops"
+msgid ""
+"Display Product Review stars on product pages below the product name, just "
+"as shown in the picture on the right."
+msgstr ""
+"Zeige Bewertungssterne auf der Produktseite unter dem Produktnamen, wie in "
+"der Grafik rechts abgebildet."
+
+#: includes/class-wc-trusted-shops-admin.php:532
+msgctxt "trusted-shops"
+msgid ""
+"Set the color for the review stars, that are displayed on the product page, "
+"below your product name."
+msgstr ""
+"Legen Sie die Farbe der Sterne fest, die auf der Produktseite unter dem "
+"Produktnamen angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:540
+msgctxt "trusted-shops"
+msgid ""
+"Set the size for the review stars that are displayed on the product page, "
+"below your product name."
+msgstr ""
+"Legen Sie die Größe der Sterne fest, die auf der Produktseite unter dem "
+"Produktnamen angezeigt werden."
+
+#: includes/class-wc-trusted-shops-admin.php:554
+msgctxt "trusted-shops"
+msgid "Font size"
+msgstr "Schriftgröße"
+
+#: includes/class-wc-trusted-shops-admin.php:556
+msgctxt "trusted-shops"
+msgid "Set the font size for the text that goes with your review stars."
+msgstr "Legen Sie die Schriftgröße für den Text zu den Bewertungssternen fest."
+
+#: includes/class-wc-trusted-shops-admin.php:570
+msgctxt "trusted-shops"
+msgid "Product Review Code"
+msgstr "Produktbewertungen Code"
+
+#: includes/class-wc-trusted-shops-admin.php:580
+msgctxt "trusted-shops"
+msgid ""
+"Please choose where your Product Review Stars shall be displayed on the "
+"Product Detail page."
+msgstr ""
+"Wählen Sie, wo die Produktbewertungssterne auf der Produktdetailseite "
+"angezeigt werden sollen."
+
+#: includes/class-wc-trusted-shops-admin.php:587
+msgctxt "trusted-shops"
+msgid "Brand attribute"
+msgstr "Marken-Produktattribut"
+
+#: includes/class-wc-trusted-shops-admin.php:588
+#, php-format
+msgctxt "trusted-shops"
+msgid "Create brand attribute %s"
+msgstr "Marken-Produktattribut %s erstellen"
+
+#: includes/class-wc-trusted-shops-admin.php:589
+msgctxt "trusted-shops"
+msgid ""
+"Brand name of the product. By passing this information on to Google, you "
+"improve your chances of having Google identify your products. Assign your "
+"brand attribute. If your products don't have a GTIN, you can pass on the "
+"brand name and the MPN to use Google Integration."
+msgstr ""
+"Markenname des Produkts. Durch Übergeben dieser Variable verbessern Sie die "
+"Möglichkeit Ihre Produkte von Google eindeutig identifizieren zu lassen. "
+"Weisen Sie ein Marken-Produktattribut zu. Wenn Ihre Produkte keine GTIN "
+"haben, können Sie den Markennamen zusammen mit der MPN übergeben, um die "
+"Google Integration zu nutzen."
+
+#: includes/class-wc-trusted-shops-admin.php:595
+msgctxt "trusted-shops"
+msgid "None"
+msgstr "Keine"
+
+#: includes/class-wc-trusted-shops-admin.php:606
+msgctxt "trusted-shops"
+msgid "Configure your Review Requests"
+msgstr "Konfigurieren Sie die Bewertungserinnerungen"
+
+#: includes/class-wc-trusted-shops-admin.php:607
+msgctxt "trusted-shops"
+msgid ""
+"7 days after an order has been placed, Trusted Shops automatically sends an "
+"invite to your customers. If you want to set a different time for sending "
+"automatic Review Requests, please activate the option below. If you want to "
+"send review requests with legal certainty, you need your customers' consent "
+"to receive Review Requests. You also have to include an option to "
+"unsubscribe."
+msgstr ""
+"Trusted Shops versendet 7 Tage nach Bestellung automatisch eine "
+"Bewertungserinnerung an Ihre Kunden. Wenn Sie lieber selbst entscheiden "
+"möchten, wann Bewertungsanfragen versendet werden, aktivieren Sie die "
+"untenstehende Option. Möchten Sie rechtssicher Bewertungs-Erinnerungen "
+"verschicken, so benötigen Sie die ausdrückliche Einwilligung Ihrer Kunden "
+"zum Empfang von Bewertungsemails. Sie müssen Ihren Kunden zudem eine "
+"Möglichkeit geben, Bewertungserinnerungen wieder abzubestellen."
+
+#: includes/class-wc-trusted-shops-admin.php:613
+msgctxt "trusted-shops"
+msgid "Enable Review Requests"
+msgstr "Bewertungserinnerungen aktivieren"
+
+#: includes/class-wc-trusted-shops-admin.php:622
+msgctxt "trusted-shops"
+msgid "WooCommerce status"
+msgstr "Bestellstatus"
+
+#: includes/class-wc-trusted-shops-admin.php:623
+msgctxt "trusted-shops"
+msgid ""
+"We recommend choosing the order status that you set when your products have "
+"been shipped."
+msgstr ""
+"Wählen Sie hier am besten den Bestellstatus aus WooCommerce aus, den Sie "
+"einstellen, wenn Ihre Ware versendet wurde."
+
+#: includes/class-wc-trusted-shops-admin.php:631
+msgctxt "trusted-shops"
+msgid "Days until Review Request"
+msgstr "Tage bis zur Erinnerung"
+
+#: includes/class-wc-trusted-shops-admin.php:632
+msgctxt "trusted-shops"
+msgid ""
+"Set the number of days to wait after an order has reached the order status "
+"you selected above before having a review request sent to your customers."
+msgstr ""
+"Stellen Sie hier ein nach wie vielen Tagen nach Erreichen des oben "
+"ausgewählten Bestellstatus die Bewertungserinnerung an den Käufer versendet "
+"werden soll."
+
+#: includes/class-wc-trusted-shops-admin.php:644
+msgctxt "trusted-shops"
+msgid "Permission via checkbox"
+msgstr "Einwilligung per Checkbox"
+
+#: includes/class-wc-trusted-shops-admin.php:645
+msgctxt "trusted-shops"
+msgid ""
+"If the checkbox is activated, only customers who gave their consent will "
+"receive Review Requests."
+msgstr ""
+"Bei aktivierter Checkbox erhalten nur die Kunden eine Bewertungserinnerung, "
+"die ihr Einverständnis gegeben haben."
+
+#: includes/class-wc-trusted-shops-admin.php:649
+msgctxt "trusted-shops"
+msgid "Edit checkbox"
+msgstr "Checkbox anpassen"
+
+#: includes/class-wc-trusted-shops-admin.php:653
+msgctxt "trusted-shops"
+msgid "Unsubscribe via link"
+msgstr "Abmeldung per Link"
+
+#: includes/class-wc-trusted-shops-admin.php:654
+msgctxt "trusted-shops"
+msgid "Allows the customer to unsubscribe from Review Requests."
+msgstr ""
+"Erlaubt es dem Kunden sich von Bewertungserinnerungen per Link abzumelden."
+
+#: includes/class-wc-trusted-shops-admin.php:755
+msgctxt "trusted-shops"
+msgid "How does Trusted Shops make your shop better?"
+msgstr "Wie macht Trusted Shops Ihren Shop besser?"
+
+#: includes/class-wc-trusted-shops-admin.php:757
+msgctxt "trusted-shops"
+msgid "Get your account"
+msgstr "Erstellen Sie Ihren Account"
+
+#: includes/class-wc-trusted-shops-admin.php:777
+msgctxt "trusted-shops"
+msgid "Product Reviews on the product detail page in an additional tab"
+msgstr "Produktbewertungen auf der Produktseite in einem separatem Reiter"
+
+#: includes/class-wc-trusted-shops-admin.php:780
+msgctxt "trusted-shops"
+msgid "Show Star-Ratings on the product detail page below your product name"
+msgstr "Bewertungssterne unter dem Produktnamen auf der Produktseite"
+
+#: includes/class-wc-trusted-shops-admin.php:784
+msgctxt "trusted-shops"
+msgid ""
+"Please note: If you want to send review requests through WooCommerce, you "
+"should deactivate automated review requests through Trusted Shops. To do so, "
+"please go to your My Trusted Shops account. Log in and go to Reviews > "
+"Settings and deactivate \"Collect reviews automatically\""
+msgstr ""
+"Bitte beachten Sie: Wenn Sie Bewertungserinnerungen über WooCommerce "
+"versenden möchtest, sollten Sie den Versand von automatischen "
+"Bewertungserinnerungen über Trusted Shops deaktivieren. Gehen Sie dazu in "
+"Ihren My Trusted Shops Account. Loggen Sie sich ein und gehen Sie zu "
+"Bewertungen > Konfiguration und deaktivieren Sie dort „Bewertungen "
+"automatisch sammeln“."
+
+#: includes/class-wc-trusted-shops-admin.php:785
+msgctxt "trusted-shops"
+msgid "To your My Trusted Shops account"
+msgstr "Zu Ihrem My Trusted Shops Account"
+
+#: includes/class-wc-trusted-shops-admin.php:789
+msgctxt "trusted-shops"
+msgid ""
+"Export your customer information here and upload it in the Trusted Shops "
+"Review Collector. To do so go to your My Trusted Shops account. Log in and "
+"go to Reviews > Shop Reviews > Review Collector"
+msgstr ""
+"Exportieren Sie hier die Kundendaten und laden Sie diese im Trusted Shops "
+"Review Collector hoch. Gehen Sie dazu in Ihren My Trusted Shops Account. "
+"Loggen Sie sich ein und gehen Sie zu Bewertungen > Shopbewertungen > Review "
+"Collector"
+
+#: includes/class-wc-trusted-shops-admin.php:790
+msgctxt "trusted-shops"
+msgid "To the Trusted Shops Review Collector"
+msgstr "Zum Trusted Shops Review Collector"
+
+#: includes/class-wc-trusted-shops-admin.php:880
+msgctxt "trusted-shops"
+msgid "Review Collector"
+msgstr "Review Collector"
+
+#: includes/class-wc-trusted-shops-admin.php:882
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"Want to collect reviews for orders that were placed before your Trusted "
+"Shops Integration? No problem. Export old orders here and upload them in "
+"your %s."
+msgstr ""
+"Sie möchten nachträglich Bewertungen zu Bestellungen sammeln, die vor der "
+"Trusted Shops Integration getätigt wurden? Kein Problem. Exportieren Sie "
+"alte Bestellungen hier und laden Sie diese in Ihrem %s hoch."
+
+#: includes/class-wc-trusted-shops-admin.php:882
+msgctxt "trusted-shops"
+msgid "My Trusted Shops account"
+msgstr "My Trusted Shops Account"
+
+#: includes/class-wc-trusted-shops-admin.php:888
+msgctxt "trusted-shops"
+msgid "Export orders"
+msgstr "Bestellungen exportieren"
+
+#: includes/class-wc-trusted-shops-admin.php:888
+msgctxt "trusted-shops"
+msgid ""
+"Export your customer and order information of the last x days and upload "
+"them in your My Trusted Shops Account."
+msgstr ""
+"Exportieren Sie Ihre Kunden- und Bestelldaten der letzten x Tage und laden "
+"Sie diese in Ihrem My Trusted Shops Account hoch."
+
+#: includes/class-wc-trusted-shops-admin.php:892
+msgctxt "trusted-shops"
+msgid "30 days"
+msgstr "30 Tage"
+
+#: includes/class-wc-trusted-shops-admin.php:893
+msgctxt "trusted-shops"
+msgid "60 days"
+msgstr "60 Tage"
+
+#: includes/class-wc-trusted-shops-admin.php:894
+msgctxt "trusted-shops"
+msgid "90 days"
+msgstr "90 Tage"
+
+#: includes/class-wc-trusted-shops-admin.php:896
+#, php-format
+msgctxt "trusted-shops"
+msgid "Upload customer and order information %s."
+msgstr "Kunden- und Bestelldaten %s hochladen"
+
+#: includes/class-wc-trusted-shops-admin.php:899
+msgctxt "trusted-shops"
+msgid "Days until reminder mail"
+msgstr "Tage bis zur Erinnerung"
+
+#: includes/class-wc-trusted-shops-admin.php:899
+msgctxt "trusted-shops"
+msgid ""
+"Set the number of days to wait after the order date before having a Review "
+"Request sent to your customers."
+msgstr ""
+"Stellen Sie hier ein, wie viele Tage zwischen der Bestellung und dem Versand "
+"der Bewertungserinnerung liegen soll."
+
+#: includes/class-wc-trusted-shops-admin.php:903
+msgctxt "trusted-shops"
+msgid "Start export"
+msgstr "Export starten"
+
+#: includes/class-wc-trusted-shops-core.php:55
+#: includes/class-wc-trusted-shops-core.php:64
+#: includes/class-wc-ts-dependencies.php:36
+#: includes/class-wc-ts-dependencies.php:45
+msgctxt "trusted-shops"
+msgid "Cheatin’ huh?"
+msgstr "So geht das leider nicht.."
+
+#: includes/class-wc-trusted-shops-core.php:210
+msgctxt "trusted-shops"
+msgid "Yes"
+msgstr "Ja"
+
+#: includes/class-wc-trusted-shops-core.php:210
+msgctxt "trusted-shops"
+msgid "No"
+msgstr "Nein"
+
+#: includes/class-wc-trusted-shops-core.php:258
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"If the App helped you, please leave a %s★★"
+"★★★%s in the Wordpress plugin repository."
+msgstr ""
+"Wenn Ihnen die App hilft, hinterlassen Sie bitte eine "
+"%s★★★★★%s Bewertung in der WordPress Plugin "
+"Bibliothek."
+
+#: includes/class-wc-trusted-shops-core.php:407
+msgctxt "trusted-shops"
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:64
+msgctxt "trusted-shops"
+msgid "Order ID"
+msgstr "Bestellnummer"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:65
+msgctxt "trusted-shops"
+msgid "Order date"
+msgstr "Bestelldatum"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:66
+msgctxt "trusted-shops"
+msgid "# Days"
+msgstr "# Tage"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:67
+msgctxt "trusted-shops"
+msgid "Email"
+msgstr "E-Mail"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:68
+msgctxt "trusted-shops"
+msgid "First name"
+msgstr "Vorname"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:69
+msgctxt "trusted-shops"
+msgid "Last name"
+msgstr "Nachname"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:121
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"Your review reminder e-mail has been cancelled successfully. Return to %s."
+msgstr ""
+"Ihre Bewertungserinnerung wurde erfolgreich deaktiviert. Kehren Sie zurück "
+"zur %s."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:121
+msgctxt "trusted-shops"
+msgid "Home"
+msgstr "Startseite"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:193
+msgctxt "trusted-shops"
+msgid ""
+"Yes, I would like to be reminded via e-mail after {days} day(s) to review my "
+"order. I am able to cancel the reminder at any time by clicking on the "
+"\"cancel review reminder\" link within the order confirmation."
+msgstr ""
+"Ja, ich bin damit einverstanden, eine Erinnerung per E-Mail zur Bewertung "
+"nach {days} Tage(n) zu erhalten. Ich kann mich jederzeit davon abmelden bzw. "
+"widersprechen, indem ich dem Link „von der Bewertungserinnerung abmelden“ in "
+"der Bestellbestätigung folge."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:198
+msgctxt "trusted-shops"
+msgid "Please allow us to send a review reminder by e-mail."
+msgstr ""
+"Bitte akzeptieren Sie den Erhalt einer Bewertungserinnerung per E-Mail."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:201
+msgctxt "trusted-shops"
+msgid "Review reminder"
+msgstr "Bewertungs Erinnerung"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:202
+msgctxt "trusted-shops"
+msgid "Asks the customer to receive a Trusted Shops review reminder."
+msgstr ""
+"Holt die Erlaubnis zum Senden einer einmaligen Trusted Shops "
+"Bewertungserinnerung ein."
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:24
+msgctxt "trusted-shops"
+msgid "Trusted Shops Review Reminder"
+msgstr "Trusted Shops Bewertungs-Erinnerung"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:25
+msgctxt "trusted-shops"
+msgid ""
+"This E-Mail is being sent to a customer to remind him about the possibility "
+"to leave a review at Trusted Shops."
+msgstr ""
+"Diese E-Mail wird einmalig an Kunden verschickt, um diese an die Abgabe "
+"einer Bewertung bei Trusted Shops zu erinnern."
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:54
+msgctxt "trusted-shops"
+msgid "Please rate your {site_title} order from {order_date}"
+msgstr "Bitte bewerten Sie Ihren Einkauf vom {order_date} bei {site_title}"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:64
+msgctxt "trusted-shops"
+msgid "Please rate your Order"
+msgstr "Bitte bewerten Sie Ihren Einkauf"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:19
+msgctxt "trusted-shops"
+msgid "Show your TS shop review sticker."
+msgstr "Zeige den Trusted Shops Review Sticker an."
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:21
+msgctxt "trusted-shops"
+msgid "Trusted Shops Shop Review Sticker"
+msgstr "Trusted Shops Shop Review Sticker"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:25
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:46
+msgctxt "trusted-shops"
+msgid "Trusted Shops Reviews"
+msgstr "Trusted Shops Bewertung"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:26
+msgctxt "trusted-shops"
+msgid "Title"
+msgstr "Bezeichnung"
+
+#: src/Package.php:53
+msgctxt "trusted-shops"
+msgid ""
+"Trustbadge Reviews for WooCommerce needs at least WooCommerce version 3.1 to "
+"run."
+msgstr ""
+"Trustbadge Reviews for WooCommerce benötigt mind. WooCommerce Version 3.1 um "
+"zu starten."
+
+#: templates/emails/customer-trusted-shops.php:18
+#: templates/emails/plain/customer-trusted-shops.php:12
+#, php-format
+msgctxt "trusted-shops"
+msgid "Dear %s %s,"
+msgstr "Sehr geehrte(r) %s %s,"
+
+#: templates/emails/customer-trusted-shops.php:19
+#: templates/emails/plain/customer-trusted-shops.php:14
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"You have recently shopped at %s. Thank you! We would be glad if you spent "
+"some time to write a review about your order. To do so please follow follow "
+"the link."
+msgstr ""
+"Sie haben vor einiger Zeit bei %s eingekauft. Vielen Dank! Wir wären froh "
+"darüber, wenn Sie sich die Zeit nehmen und Ihren Einkauf bewerten würden. Um "
+"dies nun zu tun, klicken Sie bitte auf den nachfolgenden Link."
+
+#: templates/emails/customer-trusted-shops.php:22
+msgctxt "trusted-shops"
+msgid "Rate Order now"
+msgstr "Einkauf jetzt bewerten"
+
+#~ msgctxt "trusted-shops"
+#~ msgid "Duplicate Plugin installation"
+#~ msgstr "Doppelte Plugin Installation"
+
+#, php-format
+#~ msgctxt "trusted-shops"
+#~ msgid ""
+#~ "It seems like you've installed WooCommerce Germanized and Trustbadge "
+#~ "Reviews for WooCommerce. Please deactivate Trustbadge Reviews for "
+#~ "WooCommerce as long as you are using WooCommerce Germanized. You can "
+#~ "manage your Trusted Shops configuration within your %s."
+#~ msgstr ""
+#~ "Es scheint als hättest du WooCommerce Germanized und Trustbadge Reviews "
+#~ "for WooCommerce installiert. Bitte deaktiviere das Trustbadge Reviews "
+#~ "Plugin solange du WooCommerce Germanized verwendest. Du kannst deine "
+#~ "Trusted Shops Konfiguration in deinen %s verwalten."
+
+#~ msgctxt "trusted-shops"
+#~ msgid "Germanized settings"
+#~ msgstr "Germanized Einstellungen"
+
+#~ msgctxt "trusted-shops"
+#~ msgid "Deactivate standalone version"
+#~ msgstr "Deaktiviere die Standalone-Version"
+
+#~ msgctxt "trusted-shops"
+#~ msgid "(WooCommerce Product Reviews will be replaced)"
+#~ msgstr "(WooCommerce Produktbewertungen werden ersetzt)"
+
+#, php-format
+#~ msgid ""
+#~ "Please install WooCommerce before "
+#~ "installing WooCommerce Germanized. Thank you!"
+#~ msgstr ""
+#~ "Bitte installiere WooCommerce bevor "
+#~ "du WooCommerce Germanized installierst. Vielen Dank!"
diff --git a/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-fr_FR.mo b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-fr_FR.mo
new file mode 100644
index 000000000..19ef22d77
Binary files /dev/null and b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-fr_FR.mo differ
diff --git a/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-fr_FR.po b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-fr_FR.po
new file mode 100644
index 000000000..7e00b75f8
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/i18n/languages/woocommerce-trusted-shops-fr_FR.po
@@ -0,0 +1,1165 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: WooCommerce Trusted Shops\n"
+"POT-Creation-Date: 2019-01-14 15:41+0100\n"
+"PO-Revision-Date: 2019-02-18 15:10+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.1\n"
+"X-Poedit-Basepath: ../..\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
+"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;"
+"esc_attr_e;esc_html_e;esc_html__\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Poedit-SearchPathExcluded-0: node_modules\n"
+
+#: includes/admin/views/html-duplicate-plugin-notice.php:19
+msgctxt "trusted-shops"
+msgid "Duplicate Plugin installation"
+msgstr "Plugins installés en double"
+
+#: includes/admin/views/html-duplicate-plugin-notice.php:21
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"It seems like you've installed WooCommerce Germanized and Trustbadge Reviews "
+"for WooCommerce. Please deactivate Trustbadge Reviews for WooCommerce as "
+"long as you are using WooCommerce Germanized. You can manage your Trusted "
+"Shops configuration within your %s."
+msgstr ""
+"Il semblerait que vous ayez installé WooCommerce Germanized et Trustbadge "
+"Reviews for WooCommerce. Veuillez s’il vous plait désactiver Trustbadge "
+"Reviews for WooCommerce tant que vous utilisez WooCommerce Germanized. Vous "
+"pouvez modifier votre configuration Trusted Shops au sein de vos %s."
+
+#: includes/admin/views/html-duplicate-plugin-notice.php:21
+msgctxt "trusted-shops"
+msgid "Germanized settings"
+msgstr "Germanized paramètres"
+
+#: includes/admin/views/html-duplicate-plugin-notice.php:23
+msgctxt "trusted-shops"
+msgid "Deactivate standalone version"
+msgstr "Désactivez la version standalone"
+
+#: includes/admin/views/html-notice-dependencies.php:16
+msgctxt "trusted-shops"
+msgid "Dependencies Missing or Outdated"
+msgstr "Composants manquantes ou obsolètes"
+
+#: includes/admin/views/html-notice-dependencies.php:24
+msgctxt "trusted-shops"
+msgid ""
+"To use WooCommerce Trusted Shops you may at first install the following "
+"plugins:"
+msgstr ""
+"Pour utiliser Trusted Shops for WooCommerce, il vous faut d’abord installer "
+"les plugins suivants :"
+
+#: includes/admin/views/html-notice-dependencies.php:28
+#, php-format
+msgctxt "trusted-shops"
+msgid "Install %s"
+msgstr "Installer %s"
+
+#: includes/admin/views/html-notice-dependencies.php:36
+msgctxt "trusted-shops"
+msgid ""
+"To use WooCommerce Trusted Shops you may at first update the following "
+"plugins to a newer version:"
+msgstr ""
+"Pour utiliser Trusted Shops for WooCommerce, vous devez d’abord actualiser "
+"les plugins suivants et installer une version plus récente:"
+
+#: includes/admin/views/html-notice-dependencies.php:40
+#, php-format
+msgctxt "trusted-shops"
+msgid "%s required in at least version %s"
+msgstr "%s requiert la version %s ou supérieure"
+
+#: includes/admin/views/html-notice-dependencies.php:49
+msgctxt "trusted-shops"
+msgid "Check for Updates"
+msgstr "Rechercher de mises à jour"
+
+#: includes/admin/views/html-notice-dependencies.php:50
+msgctxt "trusted-shops"
+msgid "or"
+msgstr "ou"
+
+#: includes/admin/views/html-notice-dependencies.php:51
+msgctxt "trusted-shops"
+msgid "Install an older version"
+msgstr "Installer une version antérieure"
+
+#: includes/admin/views/html-notice-update.php:12
+msgctxt "trusted-shops"
+msgid ""
+"WooCommerce Trusted Shops Data Update Required – We "
+"just need to update your install to the latest version"
+msgstr ""
+"Mise à jour de la base de données Trusted Shops WooCommerce requise"
+"strong> – Nous devons mettre à jour votre installation vers la version "
+"la plus récente."
+
+#: includes/admin/views/html-notice-update.php:13
+msgctxt "trusted-shops"
+msgid "Run the updater"
+msgstr "Démarrer l’actualisation"
+
+#: includes/admin/views/html-notice-update.php:17
+msgctxt "trusted-shops"
+msgid ""
+"It is strongly recommended that you backup your database before proceeding. "
+"Are you sure you wish to run the updater now?"
+msgstr ""
+"Nous vous recommandons fortement de sauvegarder votre base de données avant "
+"de procéder à la mise à jour. Êtes-vous sûr de vouloir effectuer la mise à "
+"jour maintenant?"
+
+#: includes/admin/views/html-wpml-notice.php:11
+msgctxt "trusted-shops"
+msgid "WPML Support"
+msgstr "Prise en charge WPML"
+
+#: includes/admin/views/html-wpml-notice.php:14
+msgctxt "trusted-shops"
+msgid ""
+"These settings serve as default settings for all your languages. To adjust "
+"the settings for a certain language, please switch your admin language "
+"through the WPML language switcher and adjust the corresponding settings."
+msgstr ""
+"Ces paramètres sont les paramètres par défaut pour toutes vos langues. Afin "
+"d’ajuster ces paramètres à une certaine langue, il vous faut changer votre "
+"langue système à l’aide du plug-in multilingue WPML et adapter les "
+"paramètres correspondants."
+
+#: includes/admin/views/html-wpml-notice.php:16
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"These settings apply for your %s shop. To adjust settings for another "
+"language, please switch your admin language through the WPML language "
+"switcher."
+msgstr ""
+"Ces paramètres s’appliquent pour votre boutique %s. Pour adapter les "
+"paramètres à une autre langue, veuillez changer votre langue système à "
+"l’aide du plug-in multilingue WPML."
+
+#: includes/class-wc-trusted-shops-admin.php:90
+#: includes/class-wc-trusted-shops-admin.php:127
+msgctxt "trusted-shops"
+msgid "GTIN"
+msgstr "GTIN"
+
+#: includes/class-wc-trusted-shops-admin.php:90
+#: includes/class-wc-trusted-shops-admin.php:127
+msgctxt "trusted-shops"
+msgid ""
+"ID that allows your products to be identified worldwide. If you want to "
+"display your Trusted Shops Product Reviews in Google Shopping and paid "
+"Google adverts, Google needs the GTIN."
+msgstr ""
+"Le GTIN est le numéro d’identification qui permet d’identifier sans "
+"équivoque les produits dans le monde entier. Google a besoin de l’attribut "
+"GTIN pour afficher vos avis produits dans Google Shopping et dans les "
+"annonces payantes Google."
+
+#: includes/class-wc-trusted-shops-admin.php:94
+#: includes/class-wc-trusted-shops-admin.php:128
+msgctxt "trusted-shops"
+msgid "MPN"
+msgstr "MPN"
+
+#: includes/class-wc-trusted-shops-admin.php:94
+#: includes/class-wc-trusted-shops-admin.php:128
+msgctxt "trusted-shops"
+msgid ""
+"If you don't have a GTIN for your products, you can pass the brand name and "
+"the MPN on to Google to use the Trusted Shops Google Integration."
+msgstr ""
+"Si vos produits n’ont pas de GTIN, vous pouvez indiquer le nom de la marque "
+"ainsi que le MPN pour utiliser l’intégration Google."
+
+#: includes/class-wc-trusted-shops-admin.php:152
+msgctxt "trusted-shops"
+msgid "Brand"
+msgstr "Marque"
+
+#: includes/class-wc-trusted-shops-admin.php:192
+msgctxt "trusted-shops"
+msgid "This field is mandatory"
+msgstr "Ce champ est obligatoire"
+
+#: includes/class-wc-trusted-shops-admin.php:199
+msgctxt "trusted-shops"
+msgid "Trusted Shops Options"
+msgstr "Options Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:206
+msgctxt "trusted-shops"
+msgid "Arial"
+msgstr "Arial"
+
+#: includes/class-wc-trusted-shops-admin.php:207
+msgctxt "trusted-shops"
+msgid "Geneva"
+msgstr "Geneva"
+
+#: includes/class-wc-trusted-shops-admin.php:208
+msgctxt "trusted-shops"
+msgid "Georgia"
+msgstr "Georgia"
+
+#: includes/class-wc-trusted-shops-admin.php:209
+msgctxt "trusted-shops"
+msgid "Helvetica"
+msgstr "Helvetica"
+
+#: includes/class-wc-trusted-shops-admin.php:210
+msgctxt "trusted-shops"
+msgid "Sans-serif"
+msgstr "Sans-serif"
+
+#: includes/class-wc-trusted-shops-admin.php:211
+msgctxt "trusted-shops"
+msgid "Serif"
+msgstr "Serif"
+
+#: includes/class-wc-trusted-shops-admin.php:212
+msgctxt "trusted-shops"
+msgid "Trebuchet MS"
+msgstr "Trebuchet MS"
+
+#: includes/class-wc-trusted-shops-admin.php:213
+msgctxt "trusted-shops"
+msgid "Verdana"
+msgstr "Verdana"
+
+#: includes/class-wc-trusted-shops-admin.php:236
+msgctxt "trusted-shops"
+msgid "Trusted Shops Integration"
+msgstr "Intégration Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:237
+#, php-format
+msgctxt "trusted-shops"
+msgid "Do you need help with integrating your Trustbadge? %s"
+msgstr "Avez-vous besoin d’aide pour intégrer le Trustbadge? %s"
+
+#: includes/class-wc-trusted-shops-admin.php:237
+msgctxt "trusted-shops"
+msgid "To the step-by-step instructions"
+msgstr "Accéder au guide"
+
+#: includes/class-wc-trusted-shops-admin.php:243
+msgctxt "trusted-shops"
+msgid "Trusted Shops ID"
+msgstr "Identifiants Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:244
+msgctxt "trusted-shops"
+msgid ""
+"The Trusted Shops ID is a unique identifier for your shop. You can find your "
+"Trusted Shops ID in your My Trusted Shops account."
+msgstr ""
+"Les identifiants Trusted Shops servent à identifier votre boutique en ligne "
+"sur Trusted Shops. Vous trouverez vos identifiants Trusted Shops (TSID) dans "
+"votre compte My Trusted Shops."
+
+#: includes/class-wc-trusted-shops-admin.php:253
+msgctxt "trusted-shops"
+msgid "Edit Mode"
+msgstr "Mode édition"
+
+#: includes/class-wc-trusted-shops-admin.php:255
+#: includes/class-wc-trusted-shops-admin.php:316
+#: includes/class-wc-trusted-shops-admin.php:439
+msgctxt "trusted-shops"
+msgid ""
+"The advanced configuration is for users with programming skills. Here you "
+"can create even more individual settings."
+msgstr ""
+"Le mode expert est conçu pour des utilisateurs ayant de bonnes connaissances "
+"en programmation. Cliquer ici, pour avoir accès à des réglages personnalisés."
+
+#: includes/class-wc-trusted-shops-admin.php:259
+msgctxt "trusted-shops"
+msgid "Standard configuration"
+msgstr "Mode standard"
+
+#: includes/class-wc-trusted-shops-admin.php:260
+msgctxt "trusted-shops"
+msgid "Advanced configuration"
+msgstr "Mode expert"
+
+#: includes/class-wc-trusted-shops-admin.php:268
+msgctxt "trusted-shops"
+msgid "Configure your Trustbadge"
+msgstr "Configurer le Trustbadge"
+
+#: includes/class-wc-trusted-shops-admin.php:274
+msgctxt "trusted-shops"
+msgid "Display Trustbadge"
+msgstr "Afficher le Trustbadge"
+
+#: includes/class-wc-trusted-shops-admin.php:276
+msgctxt "trusted-shops"
+msgid "Display the Trustbadge on all the pages of your shop."
+msgstr ""
+"Afficher le Trustbadge sur toutes les pages de votre boutique en ligne."
+
+#: includes/class-wc-trusted-shops-admin.php:283
+msgctxt "trusted-shops"
+msgid "Variant"
+msgstr "Variante"
+
+#: includes/class-wc-trusted-shops-admin.php:285
+msgctxt "trusted-shops"
+msgid "You can display your Trustbadge with or without Review Stars."
+msgstr ""
+"Vous pouvez afficher le Trustbadge avec ou sans les étoiles d’évaluation."
+
+#: includes/class-wc-trusted-shops-admin.php:289
+#: includes/class-wc-trusted-shops-admin.php:780
+msgctxt "trusted-shops"
+msgid "Display Trustbadge with review stars"
+msgstr "Afficher le Trustbadge avec les étoiles d’évaluation"
+
+#: includes/class-wc-trusted-shops-admin.php:290
+#: includes/class-wc-trusted-shops-admin.php:784
+msgctxt "trusted-shops"
+msgid "Display Trustbadge without review stars"
+msgstr "Afficher le Trustbadge sans les étoiles d’évaluation"
+
+#: includes/class-wc-trusted-shops-admin.php:296
+msgctxt "trusted-shops"
+msgid "Vertical Offset"
+msgstr "Décalage vertical"
+
+#: includes/class-wc-trusted-shops-admin.php:297
+msgctxt "trusted-shops"
+msgid ""
+"Choose the distance that the Trustbadge will appear from the bottom-right "
+"corner of the screen."
+msgstr ""
+"Choisissez l’espacement du Trustbadge® par rapport au bord inferieur droit "
+"de l’écran."
+
+#: includes/class-wc-trusted-shops-admin.php:300
+#: includes/class-wc-trusted-shops-admin.php:509
+#: includes/class-wc-trusted-shops-admin.php:560
+#: includes/class-wc-trusted-shops-admin.php:575
+msgid "px"
+msgstr "px"
+
+#: includes/class-wc-trusted-shops-admin.php:306
+#: includes/class-wc-trusted-shops-admin.php:516
+#: includes/class-wc-trusted-shops-admin.php:566
+#: includes/class-wc-trusted-shops-admin.php:582
+#, php-format
+msgctxt "trusted-shops"
+msgid "Please choose a non-negative number (at least %d)"
+msgstr "Veuillez choisir un nombre positif (> %d)"
+
+#: includes/class-wc-trusted-shops-admin.php:312
+msgctxt "trusted-shops"
+msgid "Trustbadge code"
+msgstr "Trustbadge code"
+
+#: includes/class-wc-trusted-shops-admin.php:324
+msgctxt "trusted-shops"
+msgid "Configure your Shop Reviews"
+msgstr "Configurer les avis site"
+
+#: includes/class-wc-trusted-shops-admin.php:330
+msgctxt "trusted-shops"
+msgid "Display Shop Review Sticker"
+msgstr "Afficher la vignette avis site"
+
+#: includes/class-wc-trusted-shops-admin.php:331
+msgctxt "trusted-shops"
+msgid ""
+"To display the Shop Review Sticker, you have to assign the widget \"Trusted "
+"Shops Review Sticker\"."
+msgstr ""
+"Pour afficher la vignette avis site, veuillez sélectionner le widget "
+"« Vignette avis site Trusted Shops »."
+
+#: includes/class-wc-trusted-shops-admin.php:332
+#, php-format
+msgctxt "trusted-shops"
+msgid "Assign widget %s"
+msgstr "Assigner le widget %s"
+
+#: includes/class-wc-trusted-shops-admin.php:332
+#: includes/class-wc-trusted-shops-admin.php:605
+#: includes/class-wc-trusted-shops-admin.php:905
+msgctxt "trusted-shops"
+msgid "here"
+msgstr "ici"
+
+#: includes/class-wc-trusted-shops-admin.php:340
+#: includes/class-wc-trusted-shops-admin.php:489
+msgctxt "trusted-shops"
+msgid "Background color"
+msgstr "Couleur de l’arrière-plan"
+
+#: includes/class-wc-trusted-shops-admin.php:341
+msgctxt "trusted-shops"
+msgid "Choose the background color for your Review Sticker."
+msgstr "Choisir la couleur de l’arrière-plan de la vignette d’avis."
+
+#: includes/class-wc-trusted-shops-admin.php:348
+msgctxt "trusted-shops"
+msgid "Font"
+msgstr "Police"
+
+#: includes/class-wc-trusted-shops-admin.php:350
+msgctxt "trusted-shops"
+msgid "Choose the font for your Review Sticker."
+msgstr "Choisir la police de la vignette d’avis."
+
+#: includes/class-wc-trusted-shops-admin.php:357
+msgctxt "trusted-shops"
+msgid "Number of reviews displayed"
+msgstr "Nombre d’avis"
+
+#: includes/class-wc-trusted-shops-admin.php:358
+msgctxt "trusted-shops"
+msgid ""
+"Display x alternating Shop Reviews in your Shop Review Sticker. You can "
+"display between 1 and 5 alternating Shop Reviews."
+msgstr ""
+"Afficher x avis site en alternance sur votre vignette avis site. Vous pouvez "
+"afficher en alternance de 1 à 5 avis."
+
+#: includes/class-wc-trusted-shops-admin.php:361
+msgctxt "trusted-shops"
+msgid "Show x alternating reviews"
+msgstr "Afficher x avis en alternance"
+
+#: includes/class-wc-trusted-shops-admin.php:368
+#: includes/class-wc-trusted-shops-admin.php:385
+#, php-format
+msgctxt "trusted-shops"
+msgid "Please choose a non-negative number between %d and %d"
+msgstr "Veuillez choisir un nombre positif entre %d et %d"
+
+#: includes/class-wc-trusted-shops-admin.php:374
+msgctxt "trusted-shops"
+msgid "Minimum rating displayed"
+msgstr "Note minimale affichée"
+
+#: includes/class-wc-trusted-shops-admin.php:375
+msgctxt "trusted-shops"
+msgid "Only show Shop Reviews with a minimum rating of x stars. "
+msgstr "N’afficher que les avis site avec x étoiles ou plus. "
+
+#: includes/class-wc-trusted-shops-admin.php:378
+msgctxt "trusted-shops"
+msgid "Star(s)"
+msgstr "étoile(s)"
+
+#: includes/class-wc-trusted-shops-admin.php:391
+msgctxt "trusted-shops"
+msgid "Sticker code"
+msgstr "Code des vignettes avis clients"
+
+#: includes/class-wc-trusted-shops-admin.php:395
+#: includes/class-wc-trusted-shops-admin.php:523
+#: includes/class-wc-trusted-shops-admin.php:588
+msgctxt "trusted-shops"
+msgid ""
+"The advanced configuration is for users with programming skills. Here you "
+"can perform even more individual settings."
+msgstr ""
+"Le mode expert est conçu pour des utilisateurs ayant de bonnes connaissances "
+"en programmation. Cliquer ici, pour avoir accès à des réglages personnalisés."
+
+#: includes/class-wc-trusted-shops-admin.php:401
+msgctxt "trusted-shops"
+msgid "Google Organic Search"
+msgstr "Résultats de recherche organiques"
+
+#: includes/class-wc-trusted-shops-admin.php:402
+msgctxt "trusted-shops"
+msgid ""
+"Activate this option to give Google the opportunity to show your Shop "
+"Reviews in Google organic search results."
+msgstr ""
+"Veuillez activer cette fonctionnalité pour permettre à Google d’afficher vos "
+"avis site dans les résultats de recherche organiques."
+
+#: includes/class-wc-trusted-shops-admin.php:403
+msgctxt "trusted-shops"
+msgid ""
+"By activating this option, rich snippets will be integrated in the selected "
+"pages so your shop review stars may be displayed in Google organic search "
+"results. If you use Product Reviews and already activated rich snippets in "
+"expert mode, we recommend integrating rich snippets for Shop Reviews on "
+"category pages only."
+msgstr ""
+"En activant cette option, les rich snippets seront intégrés dans les pages "
+"sélectionnées, de façon à ce que vos étoiles d’évaluation puissent être "
+"affichées dans les résultats de recherche organiques de Google. Si vous avez "
+"activé les avis produits et vous avez déjà activé les rich snippets dans le "
+"mode expert, nous vous conseillons de n’activer les rich snippets pour les "
+"avis site que sur la page de catégorie."
+
+#: includes/class-wc-trusted-shops-admin.php:410
+msgctxt "trusted-shops"
+msgid "Activate rich snippets on"
+msgstr "Activer les rich snippets sur"
+
+#: includes/class-wc-trusted-shops-admin.php:411
+msgctxt "trusted-shops"
+msgid "category pages"
+msgstr "les pages de catégories"
+
+#: includes/class-wc-trusted-shops-admin.php:419
+msgctxt "trusted-shops"
+msgid "product pages"
+msgstr "les pages produit"
+
+#: includes/class-wc-trusted-shops-admin.php:427
+msgctxt "trusted-shops"
+msgid "homepage (not recommended)"
+msgstr "la page d’accueil (non conseillé)"
+
+#: includes/class-wc-trusted-shops-admin.php:435
+msgctxt "trusted-shops"
+msgid "Rich snippets code"
+msgstr "Code pour les Rich Snippets"
+
+#: includes/class-wc-trusted-shops-admin.php:447
+msgctxt "trusted-shops"
+msgid "Configure your Product Reviews "
+msgstr "Configurer les avis produits "
+
+#: includes/class-wc-trusted-shops-admin.php:448
+#, php-format
+msgctxt "trusted-shops"
+msgid "To use Product Reviews, activate them in your %s first."
+msgstr ""
+"Pour pouvoir utiliser les avis produits, veuillez d’abord activer l’option "
+"%s."
+
+#: includes/class-wc-trusted-shops-admin.php:448
+msgctxt "trusted-shops"
+msgid "Trusted Shops package"
+msgstr "Services Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:454
+msgctxt "trusted-shops"
+msgid "Collect Product Reviews"
+msgstr "Collecter des avis produits"
+
+#: includes/class-wc-trusted-shops-admin.php:455
+msgctxt "trusted-shops"
+msgid "(WooCommerce Product Reviews will be replaced)"
+msgstr "(Les avis produits WooCommerce seront remplacés)"
+
+#: includes/class-wc-trusted-shops-admin.php:456
+msgctxt "trusted-shops"
+msgid ""
+"Show Product Reviews on the product page in a separate tab, just as shown on "
+"the picture on the right."
+msgstr "Afficher les avis produits dans un onglet séparé sur la page produit."
+
+#: includes/class-wc-trusted-shops-admin.php:464
+msgctxt "trusted-shops"
+msgid "Reviews"
+msgstr "Avis clients"
+
+#: includes/class-wc-trusted-shops-admin.php:465
+#: includes/class-wc-trusted-shops-admin.php:474
+msgctxt "trusted-shops"
+msgid "You can choose a name for the tab with your Product Reviews."
+msgstr ""
+"Vous pouvez choisir le nom de l’onglet dans lequel vous souhaitez afficher "
+"vos avis produits."
+
+#: includes/class-wc-trusted-shops-admin.php:466
+msgctxt "trusted-shops"
+msgid "Show Product Reviews on the product detail page in an additional tab."
+msgstr "Afficher les avis produits dans un onglet séparé sur la page produit."
+
+#: includes/class-wc-trusted-shops-admin.php:473
+msgctxt "trusted-shops"
+msgid "Name of Product Reviews tab"
+msgstr "Nom de l’onglet"
+
+#: includes/class-wc-trusted-shops-admin.php:477
+msgctxt "trusted-shops"
+msgid "Product reviews"
+msgstr "Avis produits"
+
+#: includes/class-wc-trusted-shops-admin.php:481
+msgctxt "trusted-shops"
+msgid "Border color"
+msgstr "Couleur du cadre"
+
+#: includes/class-wc-trusted-shops-admin.php:482
+msgctxt "trusted-shops"
+msgid "Set the color for the frame around your Product Reviews."
+msgstr "Choisir la couleur du cadre des avis produits."
+
+#: includes/class-wc-trusted-shops-admin.php:490
+msgctxt "trusted-shops"
+msgid "Set the background color for your Product Reviews."
+msgstr "Choisir la couleur de l’arrière-plan des avis produits."
+
+#: includes/class-wc-trusted-shops-admin.php:497
+#: includes/class-wc-trusted-shops-admin.php:547
+msgctxt "trusted-shops"
+msgid "Star color"
+msgstr "Couleur des étoiles"
+
+#: includes/class-wc-trusted-shops-admin.php:498
+msgctxt "trusted-shops"
+msgid "Set the color for the Product Review stars in your Product Reviews tab."
+msgstr ""
+"Choisi la couleur des étoiles qui seront affichées dans l’onglet avec les "
+"avis produits."
+
+#: includes/class-wc-trusted-shops-admin.php:505
+#: includes/class-wc-trusted-shops-admin.php:555
+msgctxt "trusted-shops"
+msgid "Star size"
+msgstr "Dimension des étoiles"
+
+#: includes/class-wc-trusted-shops-admin.php:510
+msgctxt "trusted-shops"
+msgid "Set the size for the Product Review stars in your Product Reviews tab."
+msgstr ""
+"Choisir la dimension des étoiles qui seront affichées dans l’onglet avec les "
+"avis produits."
+
+#: includes/class-wc-trusted-shops-admin.php:521
+msgctxt "trusted-shops"
+msgid "Product Sticker Code"
+msgstr "Code des vignettes avis produits"
+
+#: includes/class-wc-trusted-shops-admin.php:530
+#: includes/class-wc-trusted-shops-admin.php:596
+msgctxt "trusted-shops"
+msgid "jQuerySelector"
+msgstr "jQuerySelector"
+
+#: includes/class-wc-trusted-shops-admin.php:531
+msgctxt "trusted-shops"
+msgid ""
+"Please choose where your Product Reviews shall be displayed on the Product "
+"detail page."
+msgstr ""
+"Veuillez choisir l’endroit où les Avis Produits seront affichés sur la page "
+"produit"
+
+#: includes/class-wc-trusted-shops-admin.php:538
+msgctxt "trusted-shops"
+msgid "Rating stars"
+msgstr "Étoiles d’évaluation"
+
+#: includes/class-wc-trusted-shops-admin.php:539
+msgctxt "trusted-shops"
+msgid "Show star ratings on the product detail page below your product name."
+msgstr ""
+"Afficher les étoiles d’évaluation sur la page produit en dessous du nom du "
+"produit."
+
+#: includes/class-wc-trusted-shops-admin.php:540
+msgctxt "trusted-shops"
+msgid ""
+"Display Product Review stars on product pages below the product name, just "
+"as shown in the picture on the right."
+msgstr ""
+"Afficher les étoiles d’évaluation sur la page produit en dessous du nom du "
+"produit, comme illustré par l’image ci-contre."
+
+#: includes/class-wc-trusted-shops-admin.php:549
+msgctxt "trusted-shops"
+msgid ""
+"Set the color for the review stars, that are displayed on the product page, "
+"below your product name."
+msgstr ""
+"Choisir la couleur des étoiles qui seront affichées sur la page produit en "
+"dessous du nom du produit."
+
+#: includes/class-wc-trusted-shops-admin.php:557
+msgctxt "trusted-shops"
+msgid ""
+"Set the size for the review stars that are displayed on the product page, "
+"below your product name."
+msgstr ""
+"Choisir la dimension des étoiles qui seront affichées sur la page produit en "
+"dessous du nom du produit."
+
+#: includes/class-wc-trusted-shops-admin.php:571
+msgctxt "trusted-shops"
+msgid "Font size"
+msgstr "Taille de la police"
+
+#: includes/class-wc-trusted-shops-admin.php:573
+msgctxt "trusted-shops"
+msgid "Set the font size for the text that goes with your review stars."
+msgstr ""
+"Choisir la taille de la police du texte correspondant à vos étoiles "
+"d’évaluation."
+
+#: includes/class-wc-trusted-shops-admin.php:587
+msgctxt "trusted-shops"
+msgid "Product Review Code"
+msgstr "Code pour les étoiles d’évaluation"
+
+#: includes/class-wc-trusted-shops-admin.php:597
+msgctxt "trusted-shops"
+msgid ""
+"Please choose where your Product Review Stars shall be displayed on the "
+"Product Detail page."
+msgstr ""
+"Veuillez choisir l’endroit où les étoiles des Avis Produit seront affichées "
+"sur la page produit"
+
+#: includes/class-wc-trusted-shops-admin.php:604
+msgctxt "trusted-shops"
+msgid "Brand attribute"
+msgstr "Attribut marque"
+
+#: includes/class-wc-trusted-shops-admin.php:605
+#, php-format
+msgctxt "trusted-shops"
+msgid "Create brand attribute %s"
+msgstr "Créer %s un attribut marque"
+
+#: includes/class-wc-trusted-shops-admin.php:606
+msgctxt "trusted-shops"
+msgid ""
+"Brand name of the product. By passing this information on to Google, you "
+"improve your chances of having Google identify your products. Assign your "
+"brand attribute. If your products don't have a GTIN, you can pass on the "
+"brand name and the MPN to use Google Integration."
+msgstr ""
+"Nom de la marque du produit. En indiquant cette variable, il est plus "
+"probable que Google identifie clairement vos produits. Veuillez assigner "
+"l’attribut marque ici. Si vos produits n’ont pas de GTIN, vous pouvez "
+"indiquer le nom de la marque ainsi que le MPN pour utiliser l’intégration "
+"Google."
+
+#: includes/class-wc-trusted-shops-admin.php:612
+msgctxt "trusted-shops"
+msgid "None"
+msgstr "Aucun"
+
+#: includes/class-wc-trusted-shops-admin.php:623
+msgctxt "trusted-shops"
+msgid "Configure your Review Requests"
+msgstr "Configurer vos rappels d’avis"
+
+#: includes/class-wc-trusted-shops-admin.php:624
+msgctxt "trusted-shops"
+msgid ""
+"7 days after an order has been placed, Trusted Shops automatically sends an "
+"invite to your customers. If you want to set a different time for sending "
+"automatic Review Requests, please activate the option below. If you want to "
+"send review requests with legal certainty, you need your customers' consent "
+"to receive Review Requests. You also have to include an option to "
+"unsubscribe."
+msgstr ""
+"Trusted Shops envoie automatiquement un rappel d’avis à vos clients 7 jours "
+"après leur commande. Si vous préférez décider vous-même du moment auquel "
+"vous souhaitez envoyer vos demandes d’avis, cochez l’option ci-dessous. Pour "
+"envoyer des rappels d’avis en conformité avec la loi, il faut obtenir le "
+"consentement exprès des clients à la réception d’e-mails de demande d’avis. "
+"Vous devez également donner à vos clients un moyen de se désabonner des "
+"rappels d’avis."
+
+#: includes/class-wc-trusted-shops-admin.php:630
+msgctxt "trusted-shops"
+msgid "Enable Review Requests"
+msgstr "Activer les demandes d’avis"
+
+#: includes/class-wc-trusted-shops-admin.php:639
+msgctxt "trusted-shops"
+msgid "WooCommerce status"
+msgstr "État de la commande"
+
+#: includes/class-wc-trusted-shops-admin.php:640
+msgctxt "trusted-shops"
+msgid ""
+"We recommend choosing the order status that you set when your products have "
+"been shipped."
+msgstr ""
+"Sélectionner l’état de la commande que vous avez défini au moment de l’envoi "
+"de la commande."
+
+#: includes/class-wc-trusted-shops-admin.php:648
+msgctxt "trusted-shops"
+msgid "Days until Review Request"
+msgstr "Jours avant envoi du rappel"
+
+#: includes/class-wc-trusted-shops-admin.php:649
+msgctxt "trusted-shops"
+msgid ""
+"Set the number of days to wait after an order has reached the order status "
+"you selected above before having a review request sent to your customers."
+msgstr ""
+"Indiquer ici après combien de jours le rappel d’évaluation est envoyé à "
+"l’acheteur après avoir atteint l’état de la commande sélectionné ci-dessus."
+
+#: includes/class-wc-trusted-shops-admin.php:661
+msgctxt "trusted-shops"
+msgid "Permission via checkbox"
+msgstr "Consentement par case à cocher"
+
+#: includes/class-wc-trusted-shops-admin.php:662
+msgctxt "trusted-shops"
+msgid ""
+"If the checkbox is activated, only customers who gave their consent will "
+"receive Review Requests."
+msgstr ""
+"Si la case est cochée, seuls les clients ayant donné leur consentement "
+"recevront un rappel d’avis par e-mail."
+
+#: includes/class-wc-trusted-shops-admin.php:666
+msgctxt "trusted-shops"
+msgid "Edit checkbox"
+msgstr "Modifier la case à cocher"
+
+#: includes/class-wc-trusted-shops-admin.php:670
+msgctxt "trusted-shops"
+msgid "Unsubscribe via link"
+msgstr "Désinscription via lien"
+
+#: includes/class-wc-trusted-shops-admin.php:671
+msgctxt "trusted-shops"
+msgid "Allows the customer to unsubscribe from Review Requests."
+msgstr ""
+"Cette option permet aux clients de se désabonner des rappels d’avis en "
+"cliquant sur un lien."
+
+#: includes/class-wc-trusted-shops-admin.php:772
+msgctxt "trusted-shops"
+msgid "How does Trusted Shops make your shop better?"
+msgstr ""
+"En quoi les produits Trusted Shops contribuent-ils à optimiser votre "
+"boutique en ligne?"
+
+#: includes/class-wc-trusted-shops-admin.php:774
+msgctxt "trusted-shops"
+msgid "Get your account"
+msgstr "Créer un compte"
+
+#: includes/class-wc-trusted-shops-admin.php:794
+msgctxt "trusted-shops"
+msgid "Product Reviews on the product detail page in an additional tab"
+msgstr "Avis produits dans l’onglet sur la page produit"
+
+#: includes/class-wc-trusted-shops-admin.php:797
+msgctxt "trusted-shops"
+msgid "Show Star-Ratings on the product detail page below your product name"
+msgstr "Étoiles d’évaluation sur la page produit en dessous du nom du produit"
+
+#: includes/class-wc-trusted-shops-admin.php:801
+msgctxt "trusted-shops"
+msgid ""
+"Please note: If you want to send review requests through WooCommerce, you "
+"should deactivate automated review requests through Trusted Shops. To do so, "
+"please go to your My Trusted Shops account. Log in and go to Reviews > "
+"Settings and deactivate \"Collect reviews automatically\""
+msgstr ""
+"Veuillez noter : Si vous souhaitez envoyer des rappels d’avis via "
+"WooCommerce, vous devez désactiver l’envoi de rappels d’avis automatiques "
+"via Trusted Shops. Pour ce faire, rendez-vous dans votre compte My Trusted "
+"Shops. Connectez-vous à votre compte, cliquez sur Avis clients > "
+"Configuration > Collecter les avis et désactivez l’option « Collecter des "
+"avis automatiquement »."
+
+#: includes/class-wc-trusted-shops-admin.php:802
+msgctxt "trusted-shops"
+msgid "To your My Trusted Shops account"
+msgstr "Aller au compte My Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:806
+msgctxt "trusted-shops"
+msgid ""
+"Export your customer information here and upload it in the Trusted Shops "
+"Review Collector. To do so go to your My Trusted Shops account. Log in and "
+"go to Reviews > Shop Reviews > Review Collector"
+msgstr ""
+"Exporter les données de vos clients et de vos commandes des x derniers jours "
+"et importez-les dans votre compte My Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:807
+msgctxt "trusted-shops"
+msgid "To the Trusted Shops Review Collector"
+msgstr "Aller au collecteur d’avis Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:889
+msgctxt "trusted-shops"
+msgid "Review Collector"
+msgstr "Collecteur d’avis Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:891
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"Want to collect reviews for orders that were placed before your Trusted "
+"Shops Integration? No problem. Export old orders here and upload them in "
+"your %s."
+msgstr ""
+"Vous souhaitez demander à des clients de laisser un avis sur des commandes "
+"qu’ils ont passées avant l’intégration de Trusted Shops sur votre site ? Pas "
+"de problème! Exportez les commandes passées et importez-les dans votre %s."
+
+#: includes/class-wc-trusted-shops-admin.php:891
+msgctxt "trusted-shops"
+msgid "My Trusted Shops account"
+msgstr "Compte My Trusted Shops"
+
+#: includes/class-wc-trusted-shops-admin.php:897
+msgctxt "trusted-shops"
+msgid "Export orders"
+msgstr "Exporter les commandes"
+
+#: includes/class-wc-trusted-shops-admin.php:897
+msgctxt "trusted-shops"
+msgid ""
+"Export your customer and order information of the last x days and upload "
+"them in your My Trusted Shops Account."
+msgstr ""
+"Exporter les données de vos clients et de vos commandes des x derniers jours "
+"et importez-les dans votre compte My Trusted Shops."
+
+#: includes/class-wc-trusted-shops-admin.php:901
+msgctxt "trusted-shops"
+msgid "30 days"
+msgstr "30 jours"
+
+#: includes/class-wc-trusted-shops-admin.php:902
+msgctxt "trusted-shops"
+msgid "60 days"
+msgstr "60 jours"
+
+#: includes/class-wc-trusted-shops-admin.php:903
+msgctxt "trusted-shops"
+msgid "90 days"
+msgstr "90 jours"
+
+#: includes/class-wc-trusted-shops-admin.php:905
+#, php-format
+msgctxt "trusted-shops"
+msgid "Upload customer and order information %s."
+msgstr "Cliquez %s pour importer les données de vos clients."
+
+#: includes/class-wc-trusted-shops-admin.php:908
+msgctxt "trusted-shops"
+msgid "Days until reminder mail"
+msgstr "Jours avant envoi du rappel"
+
+#: includes/class-wc-trusted-shops-admin.php:908
+msgctxt "trusted-shops"
+msgid ""
+"Set the number of days to wait after the order date before having a Review "
+"Request sent to your customers."
+msgstr ""
+"Indiquer ici après combien de jours le rappel d’évaluation est envoyé à "
+"l’acheteur après avoir atteint l’état de la commande sélectionné ci-dessus."
+
+#: includes/class-wc-trusted-shops-admin.php:912
+msgctxt "trusted-shops"
+msgid "Start export"
+msgstr "Débuter l’exportation"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:64
+msgctxt "trusted-shops"
+msgid "Order ID"
+msgstr "Réf. commande"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:65
+msgctxt "trusted-shops"
+msgid "Order date"
+msgstr "Date de la commande"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:66
+msgctxt "trusted-shops"
+msgid "# Days"
+msgstr "# Jours"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:67
+msgctxt "trusted-shops"
+msgid "Email"
+msgstr "Email"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:68
+msgctxt "trusted-shops"
+msgid "First name"
+msgstr "Prénom"
+
+#: includes/class-wc-trusted-shops-review-exporter.php:69
+msgctxt "trusted-shops"
+msgid "Last name"
+msgstr "Nom"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:121
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"Your review reminder e-mail has been cancelled successfully. Return to %s."
+msgstr ""
+"Votre e-mail de demande d’avis a été annulé avec succès. Retourner à %s."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:121
+msgctxt "trusted-shops"
+msgid "Home"
+msgstr "Accueil"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:193
+msgctxt "trusted-shops"
+msgid ""
+"Yes, I would like to be reminded via e-mail after {days} day(s) to review my "
+"order. I am able to cancel the reminder at any time by clicking on the "
+"\"cancel review reminder\" link within the order confirmation."
+msgstr ""
+"Oui, je souhaite recevoir un demande d’avis par e-mail au bout de {days} "
+"jour(s) pour évaluer ma commande. Je peux annuler le rappel à tout moment en "
+"cliquant sur le lien Annuler le rappel d’évaluation dans l’email de "
+"confirmation de commande."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:198
+msgctxt "trusted-shops"
+msgid "Please allow us to send a review reminder by e-mail."
+msgstr ""
+"Veuillez nous autoriser à vous envoyer un rappel d’évaluation par e-mail."
+
+#: includes/class-wc-trusted-shops-template-hooks.php:201
+msgctxt "trusted-shops"
+msgid "Review reminder"
+msgstr "Demande d’avis"
+
+#: includes/class-wc-trusted-shops-template-hooks.php:202
+msgctxt "trusted-shops"
+msgid "Asks the customer to receive a Trusted Shops review reminder."
+msgstr "Demande au client s’il veut recevoir une demande d’avis Trusted Shops."
+
+#: includes/class-wc-ts-dependencies.php:36
+#: includes/class-wc-ts-dependencies.php:45 woocommerce-trusted-shops.php:67
+#: woocommerce-trusted-shops.php:76
+msgid "Cheatin’ huh?"
+msgstr "Cheatin’ huh?"
+
+#: includes/class-wc-ts-install.php:72
+#, php-format
+msgid ""
+"Please install WooCommerce before "
+"installing WooCommerce Germanized. Thank you!"
+msgstr ""
+"Please install WooCommerce before "
+"installing WooCommerce Germanized. Thank you!"
+
+#: includes/class-wc-ts-settings-handler.php:23
+msgctxt "trusted-shops"
+msgid "Trusted Shops"
+msgstr "Trusted Shops"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:25
+msgctxt "trusted-shops"
+msgid "Trusted Shops Review Reminder"
+msgstr " demande d’avis Trusted Shops"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:26
+msgctxt "trusted-shops"
+msgid ""
+"This E-Mail is being sent to a customer to remind him about the possibility "
+"to leave a review at Trusted Shops."
+msgstr ""
+"Cet e-mail est envoyé à un client pour lui rappeler qu’il peut laisser un "
+"avis via Trusted Shops."
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:53
+msgctxt "trusted-shops"
+msgid "Please rate your {site_title} order from {order_date}"
+msgstr ""
+"Veuillez évaluer votre commande sur la boutique {site_title} datant du "
+"{order_date}"
+
+#: includes/emails/class-wc-ts-email-customer-trusted-shops.php:63
+msgctxt "trusted-shops"
+msgid "Please rate your Order"
+msgstr "Veuillez évaluer votre commande"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:19
+msgctxt "trusted-shops"
+msgid "Show your TS shop review sticker."
+msgstr "Afficher la vignette avis site"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:21
+msgctxt "trusted-shops"
+msgid "Trusted Shops Shop Review Sticker"
+msgstr "Vignette avis site"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:25
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:46
+msgctxt "trusted-shops"
+msgid "Trusted Shops Reviews"
+msgstr "avis clients Trusted Shops"
+
+#: includes/widgets/class-wc-trusted-shops-widget-review-sticker.php:26
+msgctxt "trusted-shops"
+msgid "Title"
+msgstr "Titre"
+
+#: templates/emails/customer-trusted-shops.php:18
+#: templates/emails/plain/customer-trusted-shops.php:12
+#, php-format
+msgctxt "trusted-shops"
+msgid "Dear %s %s,"
+msgstr "Bonjour %s %s,"
+
+#: templates/emails/customer-trusted-shops.php:19
+#: templates/emails/plain/customer-trusted-shops.php:14
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"You have recently shopped at %s. Thank you! We would be glad if you spent "
+"some time to write a review about your order. To do so please follow follow "
+"the link."
+msgstr ""
+"Vous avez récemment passé commande sur %s. Merci beaucoup! Nous serions "
+"ravis si vous preniez quelques minutes afin de donner votre avis sur votre "
+"commande. Veuillez pour cela cliquer sur le lien suivant."
+
+#: templates/emails/customer-trusted-shops.php:22
+msgctxt "trusted-shops"
+msgid "Rate Order now"
+msgstr "Évaluer ma commande maintenant"
+
+#: woocommerce-trusted-shops.php:220
+msgctxt "trusted-shops"
+msgid "Yes"
+msgstr "Oui"
+
+#: woocommerce-trusted-shops.php:220
+msgctxt "trusted-shops"
+msgid "No"
+msgstr "Non"
+
+#: woocommerce-trusted-shops.php:265
+#, php-format
+msgctxt "trusted-shops"
+msgid ""
+"If the App helped you, please leave a %s★★"
+"★★★%s in the Wordpress plugin repository."
+msgstr ""
+"If the App helped you, please leave a %s★★"
+"★★★%s in the Wordpress plugin repository."
+
+#: woocommerce-trusted-shops.php:419
+msgctxt "trusted-shops"
+msgid "Settings"
+msgstr "Paramètres"
diff --git a/packages/woocommerce-trusted-shops/includes/abstracts/abstract-wc-ts-compatibility.php b/packages/woocommerce-trusted-shops/includes/abstracts/abstract-wc-ts-compatibility.php
new file mode 100644
index 000000000..eb7f12628
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/includes/abstracts/abstract-wc-ts-compatibility.php
@@ -0,0 +1,82 @@
+ '1.0.0',
+ 'requires_at_least' => '',
+ 'tested_up_to' => '',
+ ) );
+
+ if ( empty( $version_data[ 'requires_at_least' ] ) && empty( $version_data[ 'tested_up_to' ] ) ) {
+ $version_data[ 'requires_at_least' ] = $version_data[ 'version' ];
+ $version_data[ 'tested_up_to' ] = $version_data[ 'version' ];
+ } elseif ( empty( $version_data[ 'tested_up_to' ] ) ) {
+ $version_data[ 'tested_up_to' ] = $version_data[ 'requires_at_least' ];
+ if ( WC_TS_Dependencies::instance()->compare_versions( $version_data[ 'version' ], $version_data[ 'requires_at_least' ], '>' ) )
+ $version_data[ 'tested_up_to' ] = $version_data[ 'version' ];
+ } elseif ( empty( $version_data[ 'requires_at_least' ] ) ) {
+ $version_data[ 'requires_at_least' ] = $version_data[ 'tested_up_to' ];
+ if ( WC_TS_Dependencies::instance()->compare_versions( $version_data[ 'version' ], $version_data[ 'requires_at_least' ], '<' ) )
+ $version_data[ 'requires_at_least' ] = $version_data[ 'version' ];
+ }
+
+ $this->version_data = $version_data;
+
+ $this->plugin_name = $plugin_name;
+ $this->plugin_file = $plugin_file;
+
+ if ( ! $this->is_applicable() )
+ return;
+
+ add_action( 'init', array( $this, 'early_execution' ), 0 );
+ add_action( 'init', array( $this, 'load' ), 15 );
+
+ $this->after_plugins_loaded();
+ }
+
+ public function early_execution() {}
+
+ public function after_plugins_loaded() {}
+
+ public function is_applicable() {
+ return $this->is_activated() && $this->is_supported();
+ }
+
+ public function is_activated() {
+ return WC_TS_Dependencies::instance()->is_plugin_activated( $this->plugin_file );
+ }
+
+ public function is_supported() {
+ return
+ WC_TS_Dependencies::instance()->compare_versions( $this->version_data[ 'version' ], $this->version_data[ 'requires_at_least' ], '>=' ) &&
+ WC_TS_Dependencies::instance()->compare_versions( $this->version_data[ 'version' ], $this->version_data[ 'tested_up_to' ], '<=' );
+ }
+
+ public function get_name() {
+ return $this->plugin_name;
+ }
+
+ public function get_version_data() {
+ return $this->version_data;
+ }
+
+ abstract function load();
+
+}
diff --git a/packages/woocommerce-trusted-shops/includes/admin/settings/class-wc-ts-gzd-settings-tab.php b/packages/woocommerce-trusted-shops/includes/admin/settings/class-wc-ts-gzd-settings-tab.php
new file mode 100644
index 000000000..4f90fe35d
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/includes/admin/settings/class-wc-ts-gzd-settings-tab.php
@@ -0,0 +1,99 @@
+trusted_shops->get_dependency( 'admin' );
+
+ return $admin->get_trusted_url( 'https://support.trustedshops.com/en/apps/woocommerce' );
+ }
+
+ public function before_output() {
+ do_action( 'woocommerce_ts_admin_settings_before', $this->get_settings_for_section_core( '' ) );
+ }
+
+ public function review_exporter() {
+ $admin = WC_trusted_shops()->trusted_shops->get_dependency( 'admin' );
+ $admin->review_collector_export();
+ }
+
+ public function register_scripts() {
+ if ( isset( $_GET['tab'] ) && 'germanized-trusted_shops' === $_GET['tab'] ) {
+ do_action( 'woocommerce_trusted_shops_load_admin_scripts' );
+ }
+ }
+
+ public function get_description() {
+ return _x( 'Setup your Trusted Shops Integration.', 'trusted-shops', 'woocommerce-germanized' );
+ }
+
+ public function get_label() {
+ return _x( 'Trusted Shops', 'trusted-shops', 'woocommerce-germanized' );
+ }
+
+ public function get_name() {
+ return 'trusted_shops';
+ }
+
+ protected function output_description() {}
+
+ public function get_tab_settings( $current_section = '' ) {
+ $admin = WC_trusted_shops()->trusted_shops->get_dependency( 'admin' );
+ $settings = $admin->get_settings();
+
+ return $settings;
+ }
+
+ public function get_sidebar( $current_section = '' ) {
+ $admin = WC_trusted_shops()->trusted_shops->get_dependency( 'admin' );
+ $sidebar = $admin->get_sidebar();
+
+ return $sidebar;
+ }
+
+ protected function get_enable_option_name() {
+ $option_prefix = Package::is_integration() ? 'gzd_' : '';
+ $option_name = 'woocommerce_' . $option_prefix . 'trusted_shops_id';
+
+ return $option_name;
+ }
+
+ public function is_enabled() {
+ $value = get_option( $this->get_enable_option_name() );
+
+ return ( ! empty( $value ) ? true : false );
+ }
+
+ protected function before_save( $settings, $current_section = '' ) {
+ do_action( 'woocommerce_ts_before_save', $settings );
+
+ parent::before_save( $settings, $current_section );
+ }
+
+ protected function after_save( $settings, $current_section = '' ) {
+ do_action( 'woocommerce_ts_after_save', $settings );
+
+ parent::after_save( $settings, $current_section );
+ }
+}
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/includes/admin/views/html-notice-dependencies.php b/packages/woocommerce-trusted-shops/includes/admin/views/html-notice-dependencies.php
new file mode 100644
index 000000000..d41c01c7f
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/includes/admin/views/html-notice-dependencies.php
@@ -0,0 +1,56 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/includes/admin/views/html-notice-update.php b/packages/woocommerce-trusted-shops/includes/admin/views/html-notice-update.php
new file mode 100644
index 000000000..fc8124c5d
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/includes/admin/views/html-notice-update.php
@@ -0,0 +1,21 @@
+
+
+
WooCommerce Trusted Shops Data Update Required – We just need to update your installation to the latest version', 'trusted-shops', 'woocommerce-germanized' ); ?>
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/includes/admin/views/html-settings-section.php b/packages/woocommerce-trusted-shops/includes/admin/views/html-settings-section.php
new file mode 100644
index 000000000..f56ffca44
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/includes/admin/views/html-settings-section.php
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/includes/admin/views/html-wpml-notice.php b/packages/woocommerce-trusted-shops/includes/admin/views/html-wpml-notice.php
new file mode 100644
index 000000000..091bc55ca
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/includes/admin/views/html-wpml-notice.php
@@ -0,0 +1,19 @@
+
+
+
';
+
+ woocommerce_wp_text_input( array( 'id' => '_ts_gtin', 'label' => _x( 'GTIN', 'trusted-shops', 'woocommerce-germanized' ), 'data_type' => 'text', 'desc_tip' => true, 'description' => _x( 'ID that allows your products to be identified worldwide. If you want to display your Trusted Shops Product Reviews in Google Shopping and paid Google adverts, Google needs the GTIN.', 'trusted-shops', 'woocommerce-germanized' ) ) );
+ woocommerce_wp_text_input( array( 'id' => '_ts_mpn', 'label' => _x( 'MPN', 'trusted-shops', 'woocommerce-germanized' ), 'data_type' => 'text', 'desc_tip' => true, 'description' => _x( 'If you don\'t have a GTIN for your products, you can pass the brand name and the MPN on to Google to use the Trusted Shops Google Integration.', 'trusted-shops', 'woocommerce-germanized' ) ) );
+
+ echo '
';
+ }
+
+ public function save_fields( $product ) {
+ if ( is_numeric( $product ) )
+ $product = wc_get_product( $product );
+
+ if ( isset( $_POST['_ts_gtin'] ) ) {
+ $product = wc_ts_set_crud_data( $product, '_ts_gtin', wc_clean( $_POST['_ts_gtin'] ) );
+ }
+
+ if ( isset( $_POST['_ts_mpn'] ) ) {
+ $product = wc_ts_set_crud_data( $product, '_ts_mpn', wc_clean( $_POST['_ts_mpn'] ) );
+ }
+ }
+
+ public function create_attribute() {
+ $attributes = array(
+ 'brand' => _x( 'Brand', 'trusted-shops', 'woocommerce-germanized' ),
+ );
+
+ // Create the taxonomy
+ global $wpdb;
+ delete_transient( 'wc_attribute_taxonomies' );
+
+ foreach ( $attributes as $attribute_name => $title ) {
+ if ( ! in_array( 'pa_' . $attribute_name, wc_get_attribute_taxonomy_names() ) ) {
+ $attribute = array(
+ 'attribute_label' => $title,
+ 'attribute_name' => $attribute_name,
+ 'attribute_type' => 'text',
+ 'attribute_orderby' => 'menu_order',
+ 'attribute_public' => 0
+ );
+
+ $wpdb->insert( $wpdb->prefix . 'woocommerce_attribute_taxonomies', $attribute );
+ delete_transient( 'wc_attribute_taxonomies' );
+ }
+ }
+ }
+
+ public function load_scripts() {
+ $screen = get_current_screen();
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+ $assets_path = $this->base->plugin->plugin_url() . '/assets/';
+
+ wp_register_style( 'woocommerce-trusted-shops-admin', $assets_path . 'css/admin' . $suffix . '.css', false, $this->base->plugin->version );
+ wp_enqueue_style( 'woocommerce-trusted-shops-admin' );
+
+ wp_register_script( 'wc-admin-trusted-shops', $assets_path . 'js/admin' . $suffix . '.js', array( 'jquery', 'woocommerce_settings' ), $this->base->plugin->version, true );
+ wp_localize_script( 'wc-admin-trusted-shops', 'trusted_shops_params', array(
+ 'option_prefix' => $this->base->option_prefix,
+ 'i18n_error_mandatory' => _x( 'This field is mandatory', 'trusted-shops', 'woocommerce-germanized' ),
+ ) );
+
+ wp_enqueue_script( 'wc-admin-trusted-shops' );
+ }
+
+ public function register_section( $sections ) {
+ $sections['trusted_shops'] = _x( 'Trusted Shops Options', 'trusted-shops', 'woocommerce-germanized' );
+
+ return $sections;
+ }
+
+ public function get_font_families() {
+ return array(
+ 'Arial' => _x( 'Arial', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Geneva' => _x( 'Geneva', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Georgia' => _x( 'Georgia', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Helvetica' => _x( 'Helvetica', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Sans-serif' => _x( 'Sans-serif', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Serif' => _x( 'Serif', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Trebuchet MS' => _x( 'Trebuchet MS', 'trusted-shops', 'woocommerce-germanized' ),
+ 'Verdana' => _x( 'Verdana', 'trusted-shops', 'woocommerce-germanized' ),
+ );
+ }
+
+ public function get_order_statuses() {
+ return wc_get_order_statuses();
+ }
+
+ public function get_translatable_settings() {
+ $translatable = array();
+
+ foreach( $this->get_settings_array() as $setting ) {
+ if ( isset( $setting['id'] ) && ! in_array( $setting['type'], array( 'title', 'sectionend' ) ) ) {
+ $translatable[ $setting['id'] ] = '';
+ }
+ }
+
+ return $translatable;
+ }
+
+ protected function get_settings_array( $defaults = array() ) {
+ $settings = array(
+ array(
+ 'title' => _x( 'Trusted Shops Integration', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => sprintf( _x( 'Do you need help with integrating your Trustbadge? %s', 'trusted-shops', 'woocommerce-germanized' ), '' . _x( 'To the step-by-step instructions', 'trusted-shops', 'woocommerce-germanized' ) .'' ),
+ 'type' => 'title',
+ 'id' => 'trusted_shops_options'
+ ),
+
+ array(
+ 'title' => _x( 'Trusted Shops ID', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'The Trusted Shops ID is a unique identifier for your shop. You can find your Trusted Shops ID in your My Trusted Shops account.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => true,
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_id',
+ 'type' => 'text',
+ 'custom_attributes' => array( 'data-sidebar' => 'wc-ts-sidebar-default' ),
+ 'css' => 'min-width:300px;',
+ ),
+
+ array(
+ 'title' => _x( 'Edit Mode', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_integration_mode',
+ 'desc_tip' => _x( 'The advanced configuration is for users with programming skills. Here you can create even more individual settings.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'select',
+ 'class' => 'chosen_select',
+ 'options' => array(
+ 'standard' => _x( 'Standard configuration', 'trusted-shops', 'woocommerce-germanized' ),
+ 'expert' => _x( 'Advanced configuration', 'trusted-shops', 'woocommerce-germanized' ),
+ ),
+ 'default' => 'standard',
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'trusted_shops_options' ),
+
+ array(
+ 'title' => _x( 'Configure your Trustbadge', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'title',
+ 'id' => 'trusted_shops_badge_options',
+ ),
+
+ array(
+ 'title' => _x( 'Display Trustbadge', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_trustbadge_enable',
+ 'desc_tip' => _x( 'Display the Trustbadge on all the pages of your shop.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'ts_toggle',
+ 'custom_attributes' => array( 'data-sidebar' => 'wc-ts-sidebar-trustbadge' ),
+ 'default' => 'no'
+ ),
+
+ array(
+ 'title' => _x( 'Variant', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_trustbadge_variant',
+ 'desc_tip' => _x( 'You can display your Trustbadge with or without Review Stars.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'select',
+ 'class' => 'chosen_select',
+ 'options' => array(
+ 'standard' => _x( 'Display Trustbadge with review stars', 'trusted-shops', 'woocommerce-germanized' ),
+ 'hide_reviews' => _x( 'Display Trustbadge without review stars', 'trusted-shops', 'woocommerce-germanized' ),
+ ),
+ 'default' => 'standard'
+ ),
+
+ array(
+ 'title' => _x( 'Vertical Offset', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Choose the distance that the Trustbadge will appear from the bottom-right corner of the screen.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_trustbadge_y',
+ 'type' => 'number',
+ 'desc' => _x( 'px', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => '0',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 0,
+ 'data-validate' => 'integer',
+ 'data-validate-msg' => sprintf( _x( 'Please choose a non-negative number (at least %d)', 'trusted-shops', 'woocommerce-germanized' ), 0 ),
+ ),
+ 'css' => 'max-width:60px;',
+ ),
+
+ array(
+ 'title' => _x( 'Trustbadge code', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_trustbadge_code',
+ 'type' => 'textarea',
+ 'desc_tip' => true,
+ 'desc' => _x( 'The advanced configuration is for users with programming skills. Here you can create even more individual settings.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'css' => 'width: 100%; min-height: 150px',
+ 'default' => '',
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'trusted_shops_badge_options' ),
+
+ array(
+ 'title' => _x( 'Configure your Shop Reviews', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'title',
+ 'id' => 'trusted_shops_review_sticker_options'
+ ),
+
+ array(
+ 'title' => _x( 'Display Shop Review Sticker', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'To display the Shop Review Sticker, you have to assign the widget "Trusted Shops Review Sticker".', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => sprintf( _x( 'Assign widget %s', 'trusted-shops', 'woocommerce-germanized' ), '' . _x( 'here', 'trusted-shops', 'woocommerce-germanized' ) . '' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_enable',
+ 'type' => 'ts_toggle',
+ 'custom_attributes' => array( 'data-sidebar' => 'wc-ts-sidebar-shop-reviews' ),
+ 'default' => 'no'
+ ),
+
+ array(
+ 'title' => _x( 'Background color', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Choose the background color for your Review Sticker.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_bg_color',
+ 'type' => 'color',
+ 'default' => '#FFDC0F',
+ ),
+
+ array(
+ 'title' => _x( 'Font', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_font',
+ 'desc_tip' => _x( 'Choose the font for your Review Sticker.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'select',
+ 'class' => 'chosen_select',
+ 'default' => 'arial'
+ ),
+
+ array(
+ 'title' => _x( 'Number of reviews displayed', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Display x alternating Shop Reviews in your Shop Review Sticker. You can display between 1 and 5 alternating Shop Reviews.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_number',
+ 'type' => 'number',
+ 'desc' => _x( 'Show x alternating reviews', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => '5',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 1,
+ 'max' => 5,
+ 'data-validate' => 'integer',
+ 'data-validate-msg' => sprintf( _x( 'Please choose a non-negative number between %d and %d', 'trusted-shops', 'woocommerce-germanized' ),1, 5 ),
+ ),
+ 'css' => 'max-width:60px;',
+ ),
+
+ array(
+ 'title' => _x( 'Minimum rating displayed', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Only show Shop Reviews with a minimum rating of x stars. ', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_better_than',
+ 'type' => 'number',
+ 'desc' => _x( 'Star(s)', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => '3',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 1,
+ 'max' => 5,
+ 'data-validate' => 'integer',
+ 'data-validate-msg' => sprintf( _x( 'Please choose a non-negative number between %d and %d', 'trusted-shops', 'woocommerce-germanized' ), 1, 5 ),
+ ),
+ 'css' => 'max-width:60px;',
+ ),
+
+ array(
+ 'title' => _x( 'Sticker code', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_code',
+ 'type' => 'textarea',
+ 'desc_tip' => true,
+ 'desc' => _x( 'The advanced configuration is for users with programming skills. Here you can perform even more individual settings.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'css' => 'width: 100%; min-height: 150px',
+ 'default' => '',
+ ),
+
+ array(
+ 'title' => _x( 'Google Organic Search', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Activate this option to give Google the opportunity to show your Shop Reviews in Google organic search results.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'By activating this option, rich snippets will be integrated in the selected pages so your shop review stars may be displayed in Google organic search results. If you use Product Reviews and already activated rich snippets in expert mode, we recommend integrating rich snippets for Shop Reviews on category pages only.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_rich_snippets_enable',
+ 'type' => 'ts_toggle',
+ 'default' => 'no'
+ ),
+
+ array(
+ 'title' => _x( 'Activate rich snippets on', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'category pages', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_rich_snippets_category',
+ 'type' => 'checkbox',
+ 'default' => 'no',
+ 'checkboxgroup' => 'start',
+ ),
+
+ array(
+ 'desc' => _x( 'product pages', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_rich_snippets_product',
+ 'type' => 'checkbox',
+ 'default' => 'no',
+ 'checkboxgroup' => '',
+ ),
+
+ array(
+ 'desc' => _x( 'homepage (not recommended)', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_rich_snippets_home',
+ 'type' => 'checkbox',
+ 'default' => 'no',
+ 'checkboxgroup' => 'end',
+ ),
+
+ array(
+ 'title' => _x( 'Rich snippets code', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_rich_snippets_code',
+ 'type' => 'textarea',
+ 'desc_tip' => true,
+ 'desc' => _x( 'The advanced configuration is for users with programming skills. Here you can create even more individual settings.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'css' => 'width: 100%; min-height: 150px',
+ 'default' => '',
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'trusted_shops_review_sticker_options' ),
+
+ array(
+ 'title' => _x( 'Configure your Product Reviews ', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => sprintf( _x( 'To use Product Reviews, activate them in your %s first.', 'trusted-shops', 'woocommerce-germanized' ), '' . _x( 'Trusted Shops package', 'trusted-shops', 'woocommerce-germanized' ) .'' ),
+ 'type' => 'title',
+ 'id' => 'trusted_shops_reviews_options'
+ ),
+
+ array(
+ 'title' => _x( 'Collect Product Reviews', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Show Product Reviews on the product page in a separate tab, just as shown on the picture on the right.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_reviews_enable',
+ 'type' => 'ts_toggle',
+ 'custom_attributes' => array( 'data-sidebar' => 'wc-ts-sidebar-product-reviews' ),
+ 'default' => 'no'
+ ),
+
+ array(
+ 'title' => _x( 'Reviews', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'You can choose a name for the tab with your Product Reviews.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Show Product Reviews on the product detail page in an additional tab.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_enable',
+ 'type' => 'ts_toggle',
+ 'default' => 'no'
+ ),
+
+ array(
+ 'title' => _x( 'Name of Product Reviews tab', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'You can choose a name for the tab with your Product Reviews.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_tab_text',
+ 'type' => 'text',
+ 'default' => _x( 'Product reviews', 'trusted-shops', 'woocommerce-germanized' ),
+ ),
+
+ array(
+ 'title' => _x( 'Border color', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Set the color for the frame around your Product Reviews.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_border_color',
+ 'type' => 'color',
+ 'default' => '#FFDC0F',
+ ),
+
+ array(
+ 'title' => _x( 'Background color', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Set the background color for your Product Reviews.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_bg_color',
+ 'type' => 'color',
+ 'default' => '#FFFFFF',
+ ),
+
+ array(
+ 'title' => _x( 'Star color', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Set the color for the Product Review stars in your Product Reviews tab.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_star_color',
+ 'type' => 'color',
+ 'default' => '#C0C0C0',
+ ),
+
+ array(
+ 'title' => _x( 'Star size', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_star_size',
+ 'type' => 'number',
+ 'default' => '15',
+ 'desc' => _x( 'px', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Set the size for the Product Review stars in your Product Reviews tab.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'css' => 'max-width:60px;',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 0,
+ 'data-validate' => 'integer',
+ 'data-validate-msg' => sprintf( _x( 'Please choose a non-negative number (at least %d)', 'trusted-shops', 'woocommerce-germanized' ), 0 ),
+ ),
+ ),
+
+ array(
+ 'title' => _x( 'Product Sticker Code', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_code',
+ 'desc_tip' => _x( 'The advanced configuration is for users with programming skills. Here you can perform even more individual settings.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'textarea',
+ 'css' => 'width: 100%; min-height: 150px',
+ 'default' => '',
+ ),
+
+ array(
+ 'title' => _x( 'jQuerySelector', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Please choose where your Product Reviews shall be displayed on the Product detail page.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_selector',
+ 'type' => 'text',
+ 'default' => '#ts_product_sticker',
+ ),
+
+ array(
+ 'title' => _x( 'Rating stars', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Show star ratings on the product detail page below your product name.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Display Product Review stars on product pages below the product name, just as shown in the picture on the right.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_enable',
+ 'type' => 'ts_toggle',
+ 'default' => 'no'
+ ),
+
+ array(
+ 'title' => _x( 'Star color', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_star_color',
+ 'desc_tip' => _x( 'Set the color for the review stars, that are displayed on the product page, below your product name.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'color',
+ 'default' => '#FFDC0F',
+ ),
+
+ array(
+ 'title' => _x( 'Star size', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_star_size',
+ 'desc_tip' => _x( 'Set the size for the review stars that are displayed on the product page, below your product name.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'number',
+ 'default' => '14',
+ 'desc' => _x( 'px', 'trusted-shops', 'woocommerce-germanized' ),
+ 'css' => 'max-width:60px;',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 0,
+ 'data-validate' => 'integer',
+ 'data-validate-msg' => sprintf( _x( 'Please choose a non-negative number (at least %d)', 'trusted-shops', 'woocommerce-germanized' ), 0 ),
+ ),
+ ),
+
+ array(
+ 'title' => _x( 'Font size', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_font_size',
+ 'desc_tip' => _x( 'Set the font size for the text that goes with your review stars.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'number',
+ 'desc' => _x( 'px', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => '12',
+ 'css' => 'max-width:60px;',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 0,
+ 'data-validate' => 'integer',
+ 'data-validate-msg' => sprintf( _x( 'Please choose a non-negative number (at least %d)', 'trusted-shops', 'woocommerce-germanized' ), 0 ),
+ ),
+ ),
+
+ array(
+ 'title' => _x( 'Product Review Code', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'The advanced configuration is for users with programming skills. Here you can perform even more individual settings.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_code',
+ 'type' => 'textarea',
+ 'css' => 'width: 100%; min-height: 150px',
+ 'default' => '',
+ ),
+
+ array(
+ 'title' => _x( 'jQuerySelector', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Please choose where your Product Review Stars shall be displayed on the Product Detail page.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_selector',
+ 'type' => 'text',
+ 'default' => '#ts_product_widget',
+ ),
+
+ array(
+ 'title' => _x( 'Brand attribute', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => sprintf( _x( 'Create brand attribute %s', 'trusted-shops', 'woocommerce-germanized' ), '' . _x( 'here', 'trusted-shops', 'woocommerce-germanized' ) . '' ),
+ 'desc_tip' => _x( 'Brand name of the product. By passing this information on to Google, you improve your chances of having Google identify your products. Assign your brand attribute. If your products don\'t have a GTIN, you can pass on the brand name and the MPN to use Google Integration.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_brand_attribute',
+ 'css' => 'min-width:250px;',
+ 'default' => 'brand',
+ 'type' => 'select',
+ 'class' => 'chosen_select_nostd',
+ 'custom_attributes' => array( 'data-placeholder' => _x( 'None', 'trusted-shops', 'woocommerce-germanized' ) ),
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'trusted_shops_reviews_options' ),
+ );
+
+ if ( $this->base->supports( 'reminder' ) ) {
+
+ $settings = array_merge( $settings, array(
+
+ array(
+ 'title' => _x( 'Configure your Review Requests', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( '7 days after an order has been placed, Trusted Shops automatically sends an invite to your customers. If you want to set a different time for sending automatic Review Requests, please activate the option below. If you want to send review requests with legal certainty, you need your customers\' consent to receive Review Requests. You also have to include an option to unsubscribe.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'type' => 'title',
+ 'id' => 'trusted_shops_review_reminder_options',
+ ),
+
+ array(
+ 'title' => _x( 'Enable Review Requests', 'trusted-shops', 'woocommerce-germanized' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_reminder_enable',
+ 'type' => 'ts_toggle',
+ 'default' => 'no',
+ 'custom_attributes' => array( 'data-sidebar' => 'wc-ts-sidebar-review-reminder' ),
+ 'autoload' => false
+ ),
+
+ array(
+ 'title' => _x( 'WooCommerce status', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'We recommend choosing the order status that you set when your products have been shipped.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => array( 'wc-completed' ),
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_reminder_status',
+ 'type' => 'multiselect',
+ 'class' => 'chosen_select',
+ ),
+
+ array(
+ 'title' => _x( 'Days until Review Request', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'Set the number of days to wait after an order has reached the order status you selected above before having a review request sent to your customers.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => 7,
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_reminder_days',
+ 'type' => 'number',
+ 'custom_attributes' => array(
+ 'step' => '1',
+ 'min' => 0,
+ 'data-validate' => 'integer',
+ ),
+ ),
+
+ array(
+ 'title' => _x( 'Permission via checkbox', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc_tip' => _x( 'If the checkbox is activated, only customers who gave their consent will receive Review Requests.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => '',
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_reminder_checkbox',
+ 'type' => 'html',
+ 'html' => '' . _x( 'Edit checkbox', 'trusted-shops', 'woocommerce-germanized' ) . '',
+ ),
+
+ array(
+ 'title' => _x( 'Unsubscribe via link', 'trusted-shops', 'woocommerce-germanized' ),
+ 'desc' => _x( 'Allows the customer to unsubscribe from Review Requests.', 'trusted-shops', 'woocommerce-germanized' ),
+ 'default' => 'yes',
+ 'id' => 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_reminder_opt_out',
+ 'type' => 'ts_toggle',
+ ),
+
+ array( 'type' => 'sectionend', 'id' => 'trusted_shops_review_reminder_options' ),
+
+ ) );
+ }
+
+ if ( ! empty( $defaults ) ) {
+ foreach( $settings as $key => $setting ) {
+ if ( isset( $setting['id'] ) ) {
+ foreach( $defaults as $setting_id => $default ) {
+ if ( $setting_id === $setting['id'] ) {
+ $settings[ $key ] = array_replace_recursive( $setting, $default );
+ }
+ }
+ }
+ }
+ }
+
+ return $settings;
+ }
+
+ /**
+ * Get Trusted Shops related Settings for Admin Interface
+ *
+ * @return array
+ */
+ public function get_settings() {
+
+ $attributes = wc_get_attribute_taxonomies();
+ $linked_attributes = array();
+
+ // Set attributes
+ foreach ( $attributes as $attribute ) {
+ $linked_attributes[ $attribute->attribute_name ] = $attribute->attribute_label;
+ }
+
+ // Add empty option placeholder to allow clearing
+ $linked_attributes = array_merge( array( '' => '' ), $linked_attributes );
+
+ $update_settings = array(
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_trustbadge_code' => array(
+ 'default' => $this->base->get_trustbadge_code( false ),
+ ),
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_font' => array(
+ 'options' => $this->get_font_families(),
+ ),
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_sticker_code' => array(
+ 'default' => $this->base->get_review_sticker_code( false ),
+ ),
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_rich_snippets_code' => array(
+ 'default' => $this->base->get_rich_snippets_code( false ),
+ ),
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_sticker_code' => array(
+ 'default' => $this->base->get_product_sticker_code( false ),
+ ),
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_product_widget_code' => array(
+ 'default' => $this->base->get_product_widget_code( false ),
+ ),
+ 'woocommerce_' . $this->base->option_prefix . 'trusted_shops_brand_attribute' => array(
+ 'options' => $linked_attributes,
+ ),
+ );
+
+ if ( $this->base->supports( 'reminder' ) ) {
+ $update_settings['woocommerce_' . $this->base->option_prefix . 'trusted_shops_review_reminder_status'] = array(
+ 'options' => $this->get_order_statuses(),
+ );
+ }
+
+ $settings = $this->get_settings_array( $update_settings );
+
+ return $settings;
+ }
+
+ public function get_image( $img ) {
+ $language = $this->base->get_language();
+ $endings = array( '.jpg', '.png' );
+ $last = substr( $img, -4 );
+ $ending = '';
+
+ if ( in_array( $last, $endings ) ) {
+ $ending = $last;
+ $img = substr( $img, 0, -4 );
+ }
+
+ $new_img = $img . '_' . $language . $ending;
+
+ return $this->base->plugin->plugin_url() . '/assets/images/ts/' . $new_img;
+ }
+
+ public function get_sidebar() {
+ ob_start();
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Settings and deactivate "Collect reviews automatically"', 'trusted-shops', 'woocommerce-germanized' ); ?>
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/emails/customer-trusted-shops.php b/packages/woocommerce-trusted-shops/templates/emails/customer-trusted-shops.php
new file mode 100644
index 000000000..4e701badf
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/emails/customer-trusted-shops.php
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/emails/plain/customer-trusted-shops.php b/packages/woocommerce-trusted-shops/templates/emails/plain/customer-trusted-shops.php
new file mode 100644
index 000000000..e1e4b3f71
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/emails/plain/customer-trusted-shops.php
@@ -0,0 +1,32 @@
+trusted_shops->get_new_review_link( wc_ts_get_crud_data( $order, 'billing_email' ), $order->get_order_number() ) . "\n\n";
+
+echo "\n\n----------------------------------------\n\n";
+
+/**
+ * Show user-defined additional content - this is set in each email's settings.
+ */
+if ( $additional_content ) {
+ echo esc_html( wp_strip_all_tags( wptexturize( $additional_content ) ) );
+ echo "\n\n----------------------------------------\n\n";
+}
+
+echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/product-sticker-tpl.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-sticker-tpl.php
new file mode 100644
index 000000000..05439d0c4
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-sticker-tpl.php
@@ -0,0 +1,34 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/product-sticker.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-sticker.php
new file mode 100644
index 000000000..2976e83ca
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-sticker.php
@@ -0,0 +1,19 @@
+get_product_skus( $post->ID );
+?>
+
+
get_selector( 'product_sticker' ); ?>>
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/product-widget-tpl.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-widget-tpl.php
new file mode 100644
index 000000000..b17de61c1
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-widget-tpl.php
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/product-widget.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-widget.php
new file mode 100644
index 000000000..8fc743123
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/product-widget.php
@@ -0,0 +1,23 @@
+ID );
+$plugin = isset( $plugin ) ? $plugin : WC_trusted_shops()->trusted_shops;
+$skus = $plugin->get_product_skus( $post->ID );
+?>
+
+
get_selector( 'product_widget' ); ?>>
+
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/review-sticker-tpl.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/review-sticker-tpl.php
new file mode 100644
index 000000000..68e3c5d12
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/review-sticker-tpl.php
@@ -0,0 +1,33 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/review-sticker.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/review-sticker.php
new file mode 100644
index 000000000..c0942a1fe
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/review-sticker.php
@@ -0,0 +1,17 @@
+
+
+
get_selector( 'review_sticker', $element ); ?>>
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/rich-snippets-tpl.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/rich-snippets-tpl.php
new file mode 100644
index 000000000..0683f15ad
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/rich-snippets-tpl.php
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/rich-snippets.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/rich-snippets.php
new file mode 100644
index 000000000..af70d3cb7
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/rich-snippets.php
@@ -0,0 +1,16 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/thankyou.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/thankyou.php
new file mode 100644
index 000000000..d4a4e4320
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/thankyou.php
@@ -0,0 +1,54 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/trustbadge-tpl.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/trustbadge-tpl.php
new file mode 100644
index 000000000..0245517e2
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/trustbadge-tpl.php
@@ -0,0 +1,29 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/templates/trusted-shops/trustbadge.php b/packages/woocommerce-trusted-shops/templates/trusted-shops/trustbadge.php
new file mode 100644
index 000000000..55a1df55f
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/templates/trusted-shops/trustbadge.php
@@ -0,0 +1,15 @@
+
+
+
\ No newline at end of file
diff --git a/packages/woocommerce-trusted-shops/woocommerce-trusted-shops.php b/packages/woocommerce-trusted-shops/woocommerce-trusted-shops.php
new file mode 100644
index 000000000..b4fe31673
--- /dev/null
+++ b/packages/woocommerce-trusted-shops/woocommerce-trusted-shops.php
@@ -0,0 +1,73 @@
+
+